2.4.1 자동 타입 변환과 수동 타입 변환

jh·2022년 1월 6일
0

Do it! 자바 완전 정복

목록 보기
10/70

타입 변환에는 컴파일러가 자동으로 수행하는 '자동 타입 변환'과 개발자가 직접 타입 변환을 수행해야 하는 '수동 타입 변환'이 있다. 먼저 크기(범위)가 작은 자료형을 큰 자료형에 대입할 때를 살펴보자. 이때는 어떠한 데이터 손실도 발생하지 않는다. 따라서 작은 자료형을 큰 자료형에 담으면 개발자가 타입 변환 코드를 넣어 주지 않더라도 컴파일러가 자동으로 타입 변환을 실행하는데 이를 '업캐스팅 up-casting' 이라고 한다.

업캐스팅이 아닌데도 자동 타입 변환이 적용되는 때가 있다. 사실 모든 정수 리터럴값은 int 자료형으로 인식된다. 하지만 byte 및 short 자료형에 저장할 수 있는 범위 내의 정수 리터럴 값이 대입될 때는 자동 타입 변환이 각각의 자료형으로 수행된다. 이것이 바로 앞서 살펴본 것처럼 byte 또는 short 자료형에 저장할 수 있는 리터럴 값이 입력될 때 해당 리터럴이 각각의 타입으로 인식되는 이유다.

이제 반대 상황을 살펴보자. 큰 자료형을 작은 자료형에 대입하는 행위를 '다운 캐스팅down casting'이라고 한다. 이때는 데이터 손실이 발생할 수 있으므로 컴파일러에 따른 자동타입은 일어나지 않으며 개발자가 직접 명시적으로 타입 변환을 수행해야 한다. 자료형의 크기는
byte<short/char<int<long<float<double의 순서로 커진다.

실습

결과

value4, value5는 업캐스팅이 아닌데도 예외적으로 자동 변환이 수행된다. 대입하는 값이 byte, short의 저장 범위 내의 값일 때는 자동 변환으로 자료형을 변환했을 때 값에 오차가 없으므로 가능한 것이다. vlaue6, value7, value8은 큰 자료형을 작은 자료형으로 다운 캐스팅한 예로 데이터 손실이 발생한다. value 8은 데이터 손실이 없는 것처럼 보이지만 소수점 8자리 이상인 double 자료형의 실숫값을 float로 변환하면 오차를 확인할 수 있다.

double a = 7.000000005;
System.out.println(a); //7.000000005
float b = (float)7.000000005;
System.out.println(b); //7.0

+)value6의 값으로 -128이 출력된 이유는?
정수형 자료형을 작은 범위의 자료형으로 캐스팅할 때는 범위의 반대쪽 끝에서부터 다시 시작하는 서큘러circular구조를 보인다. 즉, 정숫값 128(127+1)을 byte 자료형으로 다운 캐스팅하면 byte 자료형의 범위에서 반대쪽 끝인 정숫값 -128로 변환된다.

profile
코딩 공부 중...

0개의 댓글