Language/JAVA

[JAVA] 자동 타입 변환과 강제 타입 변환

IT수정 2024. 9. 3. 14:55

자동 타입 변환

자동 타입 변환(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