본문 바로가기
Java

자바 타입 변환

by 승환파크 2023. 6. 20.

두 변수의 타입이 동일한 경우, 한쪽 변수값을 다른 쪽 변수에 복사해서 저장할 수 있다. 하지만 두 변수의 타입이 동일하지 않을 때는 값의 저장이 가능할 수도 있고 그렇지 않을 수 있다.

 

아래의 코드를 살펴보면 a 변수에 저장된 값을 b 변수에 복사하는 코드이다.

byte a = 10;
int b = a;

원래 10은 byte 타입의 값이었으나, 복사해서 저장할 때 int 타입으로 값이 변환된다.

자바에서는 이것을 타입 변환 이라고 한다.

 

자동 타입 변환

자동 타입 변환은 말 그대로 자동으로 타입 변환이 일어나는 것을 의미한다. 자동 타입 변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생한다.

 

기본 타입을 허용 범위 크기순으로 정리하면 아래와 같다.

byte < short < 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 타입은 음수를 포함하기 때문이다.

 

 

강제 타입 변환

큰 허용 범위 타입을 작은 허용 범위 타입으로 자동 타입 변환될 수 없다. 하지만 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것을 강제 타입 변환 이라고 한다. 강제 타입 변환은 캐스팅 연산자 괄호() 를 사용하는데, 괄호 안에 들어가는 타입은 나누는 단위이다.

 

int 타입은 byte 타입보다 더 큰 허용범위를 가진다. 따라서 int 타입은 byte 타입으로 자동 변환되지 않는다.

하지만 (byte) 캐스팅 연산자를 사용해서 byte 타입으로 강제 변환할 수 있다.

int intValue = 10;
byte byteValue = (byte) intValue; // 강제 타입 변환

 

int 타입은 char 타입보다 더 큰 허용 범위를 가진다. 따라서 int 타입은 char 타입으로 자동 변환되지 않는다.

하지만 (char) 캐스팅 연산자를 사용해서 char 타입으로 강제 변환할 수 있다.

char 타입으로 변환하는 이유는 문자를 출력할 수 있기 때문이다.

int intValue2 = 65;
char charValue = (char)intValue;
System.out.println(charValue); // 'A'가 출력된다.

 

실수 타입(float, double)은 정수 타입(byte, short, int, long)으로 자동 변환되지 않기 때문에 강제 타입 변환을 사용해야 한다. 이 경우 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.

double doubleValue = 3.14;
int intValue3 = (int)doubleValue; // intValue3 에는 정수 부분인 3만 저장된다.

 

정수 연산에서의 자동 타입 변환

정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.

 

만약 byte 타입과 byte 타입의 계산 결과를 byte 변수에 저장하려고 하면 컴파일 에러(Type mismatch: cannot convert from int to byte)가 발생한다. 따라서 연산 결과는 int 에 저장해야 한다.

 

하지만 모든 정수 연산식에서 변수들이 int 타입으로 변환되는것은 아니다. 두  피연산자 중 허용 범위가 더 큰 타입으로 변환되어 연산을 수행한다.

예를 들어 int 타입보다 허용 범위가 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 무조건 long 타입으로 변환하고 연산을 수행한다. 따라서 연산 결과를 long 타입 변수에 저장해야 한다.

 

실수 연산에서의 자동 타입 변환

실수 타입 변수가 산술 연산식에서 피연산자로 사용될 경우 두 피연산자가 동일한 타입이라면 해당 타입으로 연산되지만, 피연산자 중 하나가 double 타입이라면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산을 수행한다. 따라서 연산 결과는 double 타입이 된다.

 

int 타입과 double 타입을 연산해도 동일한 과정을 거친다. 먼저 int 타입의 피연산자가 double 타입으로 자동 변환되고 연산을 수행한다.

int intValue = 10;
double doubleValue = 5.5;

double result = intValue + doubleValue; // result 에 15.5 가 저장된다.

// 연산 진행 과정
// 1. intValue 가 double 타입으로 자동 변환
// 2. 타입이 double이 된 intValue 와 doubleValue 의 연산을 진행
// 3. 연산결과를 result 에 저장

 

만약 결과를 무조건 int 타입으로 계산해야 한다면 double 타입을 int 타입으로 강제 형 변환을 한 이후에 덧셈 계산을 수행하면 된다.

 

수학에서는 1을 2로 나누면 결과값은 0.5가 된다.

이것을 코드로 옮겨 적으면 아래와 같다.

int x = 1;
int y = 2;
double result = x / y;
System.out.println(result);

위 코드를 실행하면 0.5가 출력되지 않고 0.0이 출력될것이다. 그 이유는 자바에서 정수 연산의 결과는 정수로만 나오기 때문이다. 따라서 x / y 의 연산 결과가 0.5가 아니라 0이 되고 그 0을 double 타입으로 변환하여  0.0 이라는 결과값을 result 변수에 저장한것이다.

 

위 코드의 결과값을 0.5가 나오기 위해서는 x / y 를 정수로 연산하는 것이 아니라 실수 연산으로 진행해야한다.

즉 x 또는 y 둘 중 하나 또는 둘 모두를 double 타입으로 변환하면 된다.

 

이것을 적용하기 위해서는 다음과 같은 방법으로 수정하면 된다.

방법 1 int x = 1;
int y = 2;
double result = (double)x / y;
System.out.println(result);
방법 2 int x = 1;
int y = 2;
double result = x / (double)y;
System.out.println(result);
방법 3 int x = 1;
int y = 2;
double result = (double)x / (double)y;
System.out.println(result);

 

+ 연산에서의 문자열 자동 타입 변환

자바에서 + 연산자는 두 가지 기능을 가지고 있다.

피연산자가 모두 숫자일 경우 덧셈 연산을 수행하지만, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 진행한다.

숫자 + 숫자                                                             ➔ 덧셈 연산                                   ➔ 숫자
"문자열" + 숫자           ➔ "문자열" + "숫자"           ➔ 결합 연산                                   ➔ "문자열숫자"
숫자 + "문자열"           ➔ "숫자" + "문자열"           ➔ 결합 연산                                   ➔ "숫자문자열"

 

문자열을 기본 타입으로 강제 타입 변환

프로그램에서 문자열으 기본 타입으로 변환하는 경우는 매우 많다. 예를 들어 "12" 와 "3.5"를 정수 및 실수 타입으로 변환해서 숫자 연산을 하는 경우이다.

 

자바에서 문자열을 기본 타입으로 변환하는 방법은 아래의 표와 같다.

변환 타입 사용 예시
String ➔ byte String str = "10";
byte value =  Byte.parseByte(str);
String ➔ short String str = "10";
short value =  Short.parseShort(str);
String ➔ int String str = "10";
int value =  Integer.parseInt(str);
String ➔ long String str = "10";
long value =  Long.parseLong(str);
String ➔ float String str = "10";
float value =  Float.parseFloat(str);
String ➔ double String str = "10";
double value =  Double.parseDouble(str);
String ➔ boolean String str = "true";
boolean value =  Boolean.parseBoolean(str);

만약 문자열이 숫자가 아닌 알파벳이나 특수 문자, 또는 한글등 을 포함하고 있을 경우 숫자 타입으로 변환을 시도하면

숫자 형식 예외(NumberFormatException)가 발생한다.

'Java' 카테고리의 다른 글

연산자의 종류  (1) 2023.06.20
연산자와 연산식  (0) 2023.06.20
자바 기본 타입  (0) 2023.06.19
자바 변수  (0) 2023.06.19
java 환경 변수 설정하기(Windows)  (0) 2023.05.16