타입 변환과 타입 추론

Tina Jeong·2021년 1월 7일
0

Re-자바

목록 보기
4/16

Contents

  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 타입 추론, var

타입 변환

Type Conversion

conversion vs casting

casting은 타입 변환에 대한 단순한 명시, conversion은 compiler가 실제로 타입 변환을 하는 액션과 유사한 뉘앙스이다. 타입 캐스팅은 명시적 타입 변환일 경우에 자주 사용 한다.
conversion을 좀더 넓은 의미로 보면 될듯.

promotion vs casting

promotion은 자바 프로그램 실행 도중 자동으로 형변환이 되는 경우를 의미한다. 그에 반해 casting은 프로그래머가 (double)125 처럼 형변환을 하겠다는 의지를 보여주는 경우이다.

원시 타입 변환

원시 타입 변환 시 이슈는 크게 두 개이다.

원시 타입 간 변환은 100 % 가능한가?

결론부터 말하면 boolean은 안 된다. boolean은 true, false 두가지 값만 있기 때문에 다른 타입으로의 변환이 애매하다. 그 외의 정수형->실수형, 실수형->정수형 간 변환은 대부분 가능하다. 특히 char는 유니코드 방식의 인코딩을 따르고 있기 때문에 실수형으로 변환하거나, 실수형을 char로 변환할 수 있다.

다만 변환시 데이터 손실이 발생할 수 있다는 사실을 항상 염두에 두어야 한다. 실수형을 char, int 등의 정수형으로 변환할 때는 해당 실수와 가장 가까운 정수로 변환해주는 것이 아니라, 소수점 아래자리를 그냥 짤라버린다.truncate 또한, int나 long을 float이나 double로 변환할 때도 데이터 손실이 발생할 수도 있다. 데이터 손실이 왜 일어나는지는 아래에서 조금 더 설명해두었다.

possible lossy conversion

int i = 0.1;
System.out.println(i);

error: incompatible types: possible lossy conversion

위의 에러는 int to byte, double to float, double to int 처럼 사이즈가 작은 쪽으로 타입 변환을 시도할 때 발생한다.
즉, narrowing이냐 widening이냐의 문제이다. 사이즈가 더 작은 타입으로 변환narrowing할 때는 lossy conversion의 가능성이 있기 때문에, 프로그래머가 반드시 타입변환을 명시해야 한다. 아래의 경우에도 실수 리터럴을 int로 변환한다고 명시해주었다.

int i = (int)0.1;
System.out.println(i); // 0

📌 widening conversion이어도 type promotion이 안되는 경우

byte to char
1 byte의 크기를 가지는 byte 타입은 음수를 표현할 수 있지만, char 타입은 0부터 65535까지만 표현할 수 있으므로, byte가 음수일 경우에 문제가 생긴다.
float to long
물론 long이 사이즈는 더 크지만, float은 부동소수점 방식을 사용해 더 넓은 범위의 수를 표현할 수 있기 때문이다.

어쨌든 possible lossy conversion 에러가 뜨면 type promotion 허용 안해주는 구나~생각하면 된다.

참조 타입 변환

참조 타입 간 변환은 상속과 관련이 있어서 간단하게만 언급하고 넘어간다.

class SubType extends SuperType {
...
}

Subtype이 SuperType의 자식 클래스라면, 다음과 같은 widening conversion은 문제가 되지 않는다.

SuperType t = new Subtype(); // o

narrowing promotion은 허용되지 않는다. SubType은 SuperType과 직접 연관이 있다고 명시되어 있지만 SuperType은 그렇지 않다.

Subtype t = new SuperType(); // x

타입 추론

Type Inference

지난 포스트에 원시 타입을 소개하며 이야기 했듯이, 자바의 변수는 기본적으로 compile time에 타입이 명확히 밝혀져야 한다. 그러나, Java 10부터는 local variable type inference 기능이 추가되었는데, 바로 var이다. var 타입을 사용하면 값의 타입을 변수의 타입으로 자동 설정해준다. var를 잘 활용한다면 난해한 코드를 만들지 않는 선에서 boilerplate 코드들을 줄일 수 있다. 자바의 verbose한 특징을 조금이나마 해결해주는 feature인듯.

List<String> ls1 = new ArrayList<String>();
var ls2 = new ArrayList<String>();

참고
https://stackoverflow.com/questions/4049580/what-is-the-difference-between-type-casting-and-type-conversion-in-c-or-java
https://stage-loving-developers.tistory.com/8
https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/Number.html
The Java Language Specification
Java in a Nutsell, 7th Edition

계속해서 문서를 업데이트하고 있습니다. 언제든지 댓글피드백 남겨주세요. 😉

profile
Keep exploring, 계속 탐색하세요.

0개의 댓글