티스토리 뷰

IT/Java

타입 변환(형 변환)

오예봉봉 2020. 4. 8. 21:22


타입 변환은 데이터 타입을 다른 타입으로 바꾸는 것을 의미한다. 예컨대 , byte 타입을 int 타입으로 변환하거나 혹은 반대로 int 타입을 byte로 바꾸는 것이다. 이러한 타입 변환은 두 가지가 있다.

하나는 자동(묵시적) 타입 변환이고 다른 하나는 강제 타입 변환(캐스팅)이다.


자동 타입 변환(promotion)

이는 프로그램 실행 중에 개발자가 관여하지 않아도 자동으로 타입이 바뀌는 것을 말한다. 자동 타입 변환은 작은 크기의 메모리를 갖는 타입이 큰 크기의 타입에 저장되는 경우에 발생한다. 예컨대 , byte타입은 1바이트 크기이므로 4바이트 크기의 int 에 저장되면 자동 타입 변환이 일어난다. 
아래 코드를 보자

byte variable = 10 ;
int   number = variable ; 

byte형 변수 variable 이 int형 변수 number 에 저장될 때 자동 타입 변환이 된다. 변수 variable은 1바이트이고 변수 number는 4바이트 이기 때문이다. 자동 타입 변환 전후의 값은 동일하다. 

정수 타입이 실수 타입으로 바뀌는 것도 당연히 자동 타입 변환에 포함된다. 단 , 실수 타입으로 변환된 후의 값은 .0 이 첨가된 실수이다. 아래 코드를 보자.

int var = 100 ;
double number = var ;

위 코드를 실행하면 number의 값은 100 이 아니라 100.0 이다.
 char 타입의 경우 int 타입으로 자동 변환 되면 unicode 값이 저장된다.

char a = 'A' ;
int value = a ;

위 코드에서 int 타입 변수 value 에는 65가 저장 된다.

그러나 , 예외가 있다. byte 타입은 char 타입으로 자동 변환 되지 않는다. byte는 음수가 포함되지만 char은 음수를 가질 수 없기 때문이다. 

byte number = 7;
char value = number ;

위의 코드는 컴파일 에러가 발생한다. 왜냐하면 byte를 char로 자동 형 변환하려 했기 때문이다.

강제 타입 변환(casting)

4바이트 크기의 int형 값을 1바이트 크기의 byte 타입의 변수에 자동 타입 변환을 할 수 없다. 즉 크기가 큰 타입은 작은 타입으로 자동 형 변환은 불가능하다. 큰 컵의 물을 작은 컵으로 온전히 다 옮길 수 없는 것과 동일한 이치다. 그래서 4 바이트의 int 타입을 1 바이트 단위로 4개로 나눈 후에 그 중 1바이트를 byte 타입 변수에 강제로 저장하는 것이다. 강제 타입 변환은 캐스팅 연산자 ( )를 이용한다.
그러나 , 강제 형 변환할 경우 주의할 점이 있다. 강제 변환 후의 값에 손실이 있어선 안된다. 따라서, 강제 타입 변환이 가능한지 먼저 검사한 후에 결정해야 한다.

1.   int value = 128 ;
2.   if ( i < Byte.MIN_VALUE || i > Byte.MAX_VALUE) {
3.          System .out .println("byte 타입으로 변환 불가능") ;}
4.   else{byte b = (byte) i ;}

강제 타입 변환을 하는 경우에는 위 코드 2행처럼 변수 i 의 값이 byte타입의 최소값보다 작은지, 최대값 보다 큰 지를 검사한 후에 두 개 요건을 모두 회피하는 경우에만 강제 형 변환이 가능하다.

연산에서 자동 타입 변환

자바에서 연산은 원칙적으로 동일한 타입의 피연산자 끼리만 가능하다. 따라서 , 서로 다른 피연산자가 존재할 경우에는 그 중에서 크기가 큰 타입으로 자동 변환된 후 연산된다. 

int value =10;
double number = 12.2 ;
double result = value + number ;

위 코드에서 변수 value는 +연산 과정에서 자동으로 double로 형 변환 된다. 


































'IT > Java' 카테고리의 다른 글

연산의 순서와 방향  (0) 2020.04.11
자바 연산자  (0) 2020.04.10
데이터 타입(data type)  (0) 2020.04.08
자바의 변수  (0) 2020.04.07
JVM(Java Virtual Machine)  (0) 2020.04.07