자동 타입 변환
자동 타입 변환(Promotion)은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.
| ↙ 자동 타입 변환 ↖ | |
| 큰 허용 범위 타입 = 작은 허용 범위 타입 |
기본형 타입을 허용 범위 순으로 나열하면 다음과 같다.
byte < short, char < int < long < float < double
int 타입이 byte 타입보다 허용 범위가 더 크기 때문에 다음 코드는 자동 타입 변환이 된다.
byte byteValue = 10;
int intValue = byteValue; // 자동 타입 변환
정수 타입이 실수 타입으로 대입될 경우에는 무조건 자동 타입 변환이 된다. 실수 타입은 정수 타입보다 허용 범위가 크기 때문이다.
long longValue = 5000000000L;
float floatValue = longValue; // 5.0E9f
double doubleValue = longValue; // 5.0E9
char 타입의 경우 int 타입으로 자동 변환되면 유니코드 값이 int 타입에 대입된다.
char charValue = 'A';
int intValue = charValue; // 65
자동 타입 변환에서 예외가 있다. char 타입보다 허용 범위가 작은 byte 타입은 char 타입으로 자동 변환될 수 없다. 왜냐하면 char 타입의 허용 범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문이다.
byte byteValue = 65;
char charValue = byteValue; // 컴파일 에러
연산식에서 자동 타입 변환
자바는 정수 리터럴을 사용하면 컴파일 단계에서 연산을 수행한다. 하지만 변수가 피연산자로 사용되면 실행 시 연산을 수행한다. 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int로 자동 타입 변환되어 연산을 수행한다.
byte x = 10;
byte y = 20;
byte result = x + y; // 컴파일 에러
int result = x + y;
정수 연산식에서 모든 변수가 int 타입으로 변환되는 것은 아니다. int 타입보다 허용 범위가 더 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 long 타입으로 변환되어 연산을 수행한다. 따라서 연산결과는 long 타입 변수에 저장해야 한다.
이번에는 실수 연산을 알아보자. 피연산자 중 하나가 double 타입이면 다른 피연산자로 double 타입으로 변환되어 연산되고, 연산 결과 또한 double 이 된다.
int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; // 10.0 + 5.5
만약 int 타입으로 연산해야 한다면 double 타입을 int 타입으로 강제 타입 변환 하면 된다.
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue; // 10 + 5
다음 예제의 출력 값을 예측해 보자.
int x = 1;
int y = 2;
double result = x / y;
System.out.println(result);
수학에서 1을 2로 나누면 0.5가 나온다. 하지만 위 코드를 실행하면 0.5가 아니라 0.0이 출력된다. 자바에서 정수 연산의 결과는 항상 정수가 되기 때문이다. x / y 의 연산 결과가 정수이기 때문에 0이 되고, 0을 double 타입 변수 result에 저장하므로 0.0이 된다. 위 코드의 결과가 0.5가 되기 위해서는 하단의 코드처럼 x / y 부분을 정수 연산이 아니라 실수 연산으로 변경해야 한다.
double result = (double) x / y;
double result = x / (double) y;
double result = (double) x / (double) y;
강제 타입 변환
큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것을 강제 타입 변환(Casting)이라고 한다. 강제 타입 변환은 캐스팅 연산자로 괄호()를 사용하는데, 괄호 안에 들어가는 타입은 쪼개는 단위이다.
| ↗ 강제 타입 변환 ↘ | |
| 작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입 |
강제 타입의 목적은 원래 값이 유지되면서 타입만 바꾸는 것이다. 그렇게 때문에 작은 허용 범위 타입에 저장될 수 있는 값을 가지고 강제 타입 변환을 해야 한다.
실수 타입을 정수 타입으로 강제 타입 변환 할 경우 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.
double doubleValue = 3.14;
int intValue = (int) doubleValue; // 3
문자열을 기본 타입으로 변환
| 변환 타입 | 사용 예 |
| String → byte | String str = "10"; byte value = Byte.parseByte(str); |
| String → short | String str = "200"; short value = Short.parseShort(str); |
| String → int | String str = "300000"; int value = Integer.parseInt(str); |
| String → long | String str = "40000000000"; long value = Long.parseLong(str); |
| String → float | String str = "12.345"; float value = Float.parseFloat(str); |
| String → double | String str = "12.345"; double value = Double.parseDouble(str); |
| String → boolean | String str = "true"; boolean value = Boolean.parseBoolean(str); |
기본 타입을 문자열로 변환
String str = String.valueOf(기본타입값);
'Language > JAVA' 카테고리의 다른 글
| [JAVA] 산술 연산자 (1) | 2024.09.03 |
|---|---|
| [JAVA] 부호 연산자와 증감 연산자 (0) | 2024.09.03 |
| [JAVA] print 메소드 (0) | 2024.09.03 |
| [JAVA] 기본형 타입 (0) | 2024.09.03 |
| [JAVA] 변수 선언과 초기화 (0) | 2024.09.03 |