-
[Java-9] 타입변환, 형변환Java 2020. 11. 18. 22:04
Primitive Type Conversions
자바는 integer와 부동소수점 값(실수) 으로 타입을 변경할 수 있는데, 이게 사실 char형도 숫자로 표현되어 모든 유니코드에 1:1 매핑이 되기 때문에, char 타입도 타입 변환이 가능해진다. 오직 안되는거는 boolean 타입만 다른 원시타입으로 바꿀 수 없다.
타입을 변경하는데에는 2가지 종류가 있는데, ‘프로모션’ 과 ‘캐스팅’ 방식이 있다. Java in Nutshell 에서는 ‘widening conversion’, ‘narrow conversion’ 넓은 변경, 좁은 변경 이렇게 나와있다. 뭔가 ‘widening conversion’, ‘narrow conversion’ 이 좀 더 이해하기 편할 것 같은데, 차근차근 설명해 도록 하겠다.
1. Widening Conversion, 프로모션먼저 프로모션은 언제 발생하냐면, 원래 타입에서 더 큰 타입으로 변경을 할 때 프로모션 변경이 발생한다. 이게 무슨 뜻이냐면, 예를들어서 int 는 4바이트고, long은 8바이트이다. 그래서 이
int 에서 더 큰 타입 으로 변경을 하려고 한다면, 발생하는게 프로모션 , Widening Conversion 이라고 한다.
프로모션 예제
프로모션은 사실 아무것도 안해도 자동으로 자바가 타입변경을 진행해주도록 한다.
다음 코드를 보면 쉽게 이해가 갈 것이다. 프로모션이라고 함은, “타입 좀 변경하겠습니다.~”라고 명시하지 않아도 상관 없다.
왜 이렇게 간단하게 되냐면 자바에서 타입이 변경되면서 데이터의 유실이 안된다는걸 보장된다는걸 알기 때문에 자동으로 해준다. 데이터 유실을 보장해준다는 말이 좀 어려울 수 있으니 그림으로 설명을 하자면,
같은 ‘3191’ 이라는 정수를 int 형으로 들어갔을 때는 3바이트 까지만 쓰는 상황이다.
이 3191을 long 타입으로 변경을 해도, 3바이트 이상인 4~8바이트는 전부 0으로 만들면 그만이다. 이게 Widening Conversion 이고, 프로모션 이라고 하는 것이다. 굳이 바이트값이 변경될 필요 없이 int보다 더큰 타입으로 변경되니, 자바가 자동으로 진행해준다.
2. Narrow Conversion, 캐스팅
캐스팅은 보통 범위가 작은 타입에서 큰 타입으로 변경을 하려하면, 캐스팅을 사용해야 한다.
왜 자바에서 큰타입-> 작은타입 은 자동으로 해주지 않을까? 생각을 해보자
예를들어 만약 long에서 전부 8바이트를 다 사용하고 있다면?
이렇게 8바이트 를 사용하고 있다고 가정하자, 그러면 이long를 int로 변경을 한다고 하면
위에 5~8바이트를 전부 버려야 한다. 그러므로 캐스팅은 절대, 자바가 자동으로 진행해주지 않고, 만약 캐스팅을 한다해도, 이런 바이트가 손실되지 않는다는 확신 이 개발자가 있어야 한다. 그러면 캐스팅을 사용할 수 있다. 캐스팅을 사용하는 방법은
다음과 같이 변수앞에다가 (캐스팅 하려는 타입) 변수; 사용해주면 된다.
물론 double 과 float 처럼 부동 소수점을 가진 형태도 변환 가능하다.
정수 타입 -> 부동소수점 을 하게 되면 ‘ .0 ’ 이 끝에 붙고
부동소수점 -> 정수타입 을 하게되면 ‘.xxx’ 이 사라진다.
아래의 표에서 어떨 때, 캐스팅을 사용하고, 어떨 때 프로모션을 진행을 하는지 확인해보자.
‘N’ 캐스팅이든 자동형변환이든 절대 형변환이 되지 않음
‘C’ 캐스팅을 해야함 Narrow Conversion
‘Y’ 자동형변환 Widening Conversion
‘Y*’ 자동 형변환인데, 갑희 최하위 자릿수 중 일부는 손실될 수 있음
'Java' 카테고리의 다른 글
[Java-11]타입추론 var (1) 2020.11.20 [Java-10]변수의 스코프&라이프타임 (0) 2020.11.20 [Java-8] 자바 변수 선언과 초기화 (0) 2020.11.18 [Java-7] 자바 타입의 종류 & 리터럴 (0) 2020.11.17 [Java-6] Java 기본 타입 (primitive) (0) 2020.11.16