1. 변수와 타입
변수 : 값을 저장할 수 있는 메모리 공간 / 한 가지 타입의 값만 저장 가능
타입 : 변수에 저장되는 값의 종류와 범위를 결정짓는 요소
| 변수 이름 작성 규칙 |
| 첫 번째 글자는 문자이거나 '$' 또는 '_' / 숫자로 시작 불가능 |
| 대소문자가 구분됨 |
| 첫 문자 시작은 영어 소문자, 연속되는 단어의 시작은 대문자로 |
| 문자 수의 제한은 없음 |
| 자바 예약어는 사용 불가능 |
2. 변수
변수 사용 : 변수에 값을 저장하고 읽는 행위 / 대입 연산자 (=)를 사용
int A;
A = 90;
int B = 90;
초기화 : 변수에 초기값을 주는 행위 / 1, 2 라인처럼 초기화를 나누어 할 수도, 3 라인처럼 한 번에 할 수도 있음
리터럴 (literal) : 소스 코드 내에서 직접 입력된 값
- 정수 리터럴 : byte, char, short, int, long 타입 / 소수점 없음 = 10진수 / 0으로 시작 = 8진수 / 0x 또는 0X로 시작 = 16진수
- 실수 리터럴 : float, double 타입 / 소수점으로 표현 = 10진수 실수 / E 또는 e로 표현 = 10진수 지수와 가수
- 문자 리터럴 : char 타입 / 작은 따옴표로 묶은 텍스트
- 문자열 리터럴 : String 타입 / 큰 따옴표로 묶은 텍스트
- 논리 리터럴 : boolean 타입
변수의 사용 범위 : 변수는 중괄호 {} 블록 내에서 선언되고 사용됨 (클래스, 생성자, 메소드, 제어문)
- 로컬 변수 : 메소드 블록 내에서 선언된 변수 / 메소드 실행이 끝나면 메모리에서 자동으로 제거
public class Example {
public static void main (String[] args) {
int a = 15;
if (a > 10) {
int b = a - 10;
}
int c = a + b + 5; // "b cannot be resolved to a variable" 에러
}
}
3. 타입
| 값의 종류 | 기본 타입 | 메모리 사용 크기 | 값의 범위 | |
| 정수 | byte | 1 byte | 8 bit | -$2^7$ ~ ($2^7$ - 1) |
| char | 2 byte | 16 bit | 0 ~ $2^{16}$ - 1 | |
| short | 2 byte | 16 bit | -$2^{15}$ ~ ($2^{15}$ - 1) | |
| int | 4 byte | 32 bit | -$2^{31}$ ~ ($2^{31}$ - 1) | |
| long | 8 byte | 64 bit | -$2^{63}$ ~ ($2^{63}$ - 1) | |
| 실수 | float | 4 byte | 32 bit | |
| double | 8 byte | 64 bit | ||
| 논리 | boolean | 1 byte | 8 bit | true, false |
각 타입에 저장할 수 있는 값의 범위를 초과하게 되면 쓰레기 값이 저장됨
정수 타입
- 기본 정수 연산은 int 타입 : byte 타입 + short 타입 = 두 변수 모두 int 타입으로 변환 후 연산, 결과는 int 타입
- byte 타입 : 색상 정보 및 파일 또는 이미지 등의 이진 데이터를 처리할 때 사용
- char 타입 : 자바는 모든 문자를 유니코드로 처리 / 특정 문자의 유니코드를 안다면 10진수 또는 \u + 16진수 형태로 값을 저장해도 됨 / 문자열을 저장하고 싶다면 String 타입을 사용 (String은 클래스 타입이고 String 변수는 참조 변수)
public class Example {
public static void main (String[] args) {
char c1 = 'A'; // 문자 직접 저장
char c2 = 65; // 10진수로 저장
char c3 = '/u0041'; // 16진수로 저장
int unicode = c1;
System.out.println(c1); // A
System.out.println(c2); // A
System.out.println(c3); // A
System.out.println(unicode); // 65
}
}
- short 타입
- int 타입 : 정수값을 8진수, 10진수, 16진수 형태로 저장 할 수 있으며, 8진수는 숫자앞에 '0', 16진수는 '0x'를 붙임
- long 타입 : 초기화 시 정수값 뒤에 'l'이나 'L'을 붙임
실수 타입 (float, double)
- 실수는 부동 소수점 (floating-point) 방식으로 저장됨 / float 타입과 double 타입은 가수와 지수를 저장하기 위해 전체 bit를 나누어 사용하기 때문에 할당 bit가 큰 double은 더 정밀한 값을 저장할 수 있음
- 실수 리터럴의 기본 타입은 double
- float 타입 변수에 실수 리터럴을 저장하기 위해선 실수 리터럴 뒤에 'f'나 'F'를 붙여야 함
논리 타입
- 논리값 (true / false)을 저장할 수 있는 데이터 타입
- 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용
4. 타입 변환
데이터 타입을 다른 데이터 타입으로 변환하는 것으로 자동 타입 변환과 강제 타입 변환이 존재
자동 타입 변환 : 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생
- 변환 이전의 값과 변환 이후의 값은 동이
- 정수 타입을 실수 타입으로 변환 시 무조건 자동 타입 변환 발생 (200 > 200.0으로 변환)
- 음수가 저장된 byte 타입을 char 타입으로 변환 불가능 (char 타입은 음수를 저장할 수 없기 때문)
- 서로 다른 타입의 피연산자들 끼리의 연산에서도 발생 : 두 피연산자 중 크기가 큰 타입으로 자동 변환 후 연산이 수행되고 결과는 변환 된 타입으로 저장됨
강제 타입 변환 (캐스팅 : Casting) : 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것 / 캐스팅 연산자 () 사용
- 기존 타입의 값이 보존되지 않을 수 도 있음
- 실수 타입을 정수 타입으로 변환 시 소수점 이하 부분은 버려지고, 정수 부분만 저장됨
- 강제 타입 변환 시 값이 손실될 수 있으므로 변환 전 값이 보존되는지 확인이 필요함
- 정수 타입을 실수 타입으로 변환 시 실수 타입의 가수 비트 수에 따라 변환 값이 달라질 수 있음 >> double 타입으로 변환하자
public class Example {
public static void main (String[] args) {
int i = 128;
if ( (i < Byte.MIN_VALUE) || (i > Byte.MAX_VALUE) ) {
System.out.println("byte 타입으로 변환할 수 없습니다.");
}
else {
byte b = (byte) i;
System.out.println(b);
}
}
}
| 기본 타입 | 최대값 상수 | 최소값 상수 |
| byte | Byte.MAX_VALUE | Byte.MIN_VALUE |
| short | Short.MAX_VALUE | Short.MIN_VALUE |
| int | Integer.MAX_VALUE | Integer.MIN_VALUE |
| long | Long.MAX_VALUE | Long.MIN_VALUE |
| float | Float.MAX_VALUE | Float.MIN_VALUE |
| double | Double.MAX_VALUE | Double.MIN_VALUE |