리그캣의 개발놀이터

[Java] 타입 형변환, 캐스팅 그리고 타입 프로모션 본문

프로그래밍 언어/JAVA

[Java] 타입 형변환, 캐스팅 그리고 타입 프로모션

리그캣 2020. 11. 21. 16:07

타이핑 하며 작성한 문서이기에 오타가 있을 수 있습니다. 오타나 잘못된것은 아래 댓글로 지적해주세요

type 형변환?

변수 또는 상수의 타입을 다른 타입으로 변환

연산을 수행하는 코드에서는 같은 타입끼리만 가능하다. 그래서 연산을 수행하기 전에 같은 타입으로 만들어야 하는데
타입 변환을 하는 것을 형변환 이라고 한다.

프로모션과 캐스팅?

- 프로모션 (자동/묵시적 형변환) : 작은 데이터 타입에서 큰 데이터 타입으로 형 변환
- 캐스팅(명시적 형 변환) : 큰 데이터 타입에서 작은 데이터 타입으로 형 변환

자동 형변환(프로모션) / 확장 변환(Widening conversion)과 축소 변환(Narrowing conversion)

자바는 타입이 서로 일치하지 않는 경우에도 타입끼리 서로 호환성이 있으면 자동으로 변환을 실시한다.

자동 형변환이 가능한 방향

예를 들어 short 타입은 16비트 정수이고, int 타입은 32bit 정수이므로 short 타입의 값을 int 타입의 값으로 취급해도 값이 변하는 문제는 발생하지 않는다.

그렇다면 long 데이터 타입의 메모리 크기는 8byte이고, float 데이터 타입의 메모리 크기는 4byte인데, long 데이터 타입에서 float 데이터 타입으로 자동 형변환이 가능하다. 그 이유는 표현할 수 있는 값의 범위가 float이 더 크기 때문이다.

즉, 타입의 데이터 크기가 커지는 변환인(Widening conversion)의 경우에는 호환성이 보장되어 새로운 타입으로 변환된다.

short shortNum = 100;

int intNum = shortNum;                // 확장성에 의한 자동 변환 (short -> int)
System.out.println(intNum);

반대로 축소 변환(Narrowing conversion)의 경우에 호환성이 없기 때문에 자동적으로 변환할 수 없어 컴파일 에러가 발생한다.

int intNum = 1;
short shortNum = intNum; //컴파일 에러

강제/명시적 형변환(캐스팅)

위에서 말한 호환성이 없는 경우지만, 형변환을 하고 싶을때 사용하는것이 강제, 명시적 형변환이다.

자동형변환에서 컴파일 에러가 났던 부분을 다음과 같이 변경해보자. 다음과 같은 방식으로 지정할 수 있다.

int intNum = 1;
short shortNum = (short)intNum; //컴파일 에러 해결

ref

Comments