[Java] 삼항연산자와 오토 언박싱
뭔가 항상 단순하고 일관적인 것처럼 보이는 자바지만, 이놈도 비직관적으로 꼬여있는 부분이 있다.
바로 삼항연산자, 조건연산자라고 부르는 녀석이다.
이건 알다시피 조건식 ? 참 : 거짓의 형태를 띠는 if-else문의 표현식 버전이다.
그리고 int 등 기본타입들에 대응되는 클래스로 Integer 등이 있다.
일관성 없는 자바 타입시스템의 단점을 메꾸는 땜빵용 타입이다.
참조로 동작하기 때문에 null값 등을 넣을 수 있다.


그리고 이 둘이 합쳐지면 예상치 못한 결과를 낳을 수가 있다.

이 코드는 어떻게 동작할 것 같은가?
그냥 num이 num에 잘 들어갈 거라고 생각할 수 있다.
하지만

널포인터익셉션이 터진다.
왜??
삼항연산자의 동작과 자동캐스팅이 환장의 조합을 이룬 결과다.
일단 삼항연산자는
조건 ? A : B
에서 결과로 반환되는 A, B표현식이 같은 타입을 가져야만 한다.
근데 Integer가 int처럼 동작한다고는 해도 엄연히 다른 타입인 것이다. 그리고 숫자 0의 타입은 int다.
뭔가 상식적으로 생각하면
조건 ? int : Integer
에서
둘다 Integer로 타입을 맞춰주는게 안전하겠지만, 자바는 int와 Integer가 만나면 Integer를 강제로 int로 바꿔버리는 오토 언박싱을 수행한다.
그 과정에서 null이 들어있으면 로직이 터지는 것이다.
그래서 이걸 깔끔하게 해결하려면 그냥 이런식으로 타입을 명시해주는게 좋다.

그렇다.
참조
https://johngrib.github.io/wiki/ternary-operator-and-null-pointer-exception/