자바의 조건 연산자(삼항 연산자, ? :)는 하나의 불리언(boolean) 값을 기준으로 어떤 표현식을 평가할지 결정합니다. 그런데 흥미롭게도 이 조건식 안에서 두 피연산자의 타입이 서로 다를 경우, 자바는 내부적으로 숫자 승격(numeric promotion)을 수행합니다. 예제를 통해 살펴보겠습니다.
예제 1: 조건 연산자에서 숫자 승격 발생
import java.io.*;
public class Demo{
public static void main (String[] args){
Object my_obj = true ? new Integer(91) : new Float(89);
System.out.println(my_obj);
}
}출력 결과
91.0
코드 설명
Demo라는 클래스 안에 메인 함수가 정의되어 있습니다. 여기서 객체 인스턴스를 선언하고, 조건이 참(true)이면 정수(Integer) 값이, 거짓(false)이면 실수(Float) 값이 할당됩니다. 그런데 출력 결과를 보면 91이 아니라 91.0이 나왔습니다.
그 이유는 자바 언어 명세(JLS)에 따르면, 조건 연산자의 두 번째와 세 번째 피연산자가 서로 다른 숫자 타입일 때 더 큰 범위의 타입으로 자동 승격되기 때문입니다. 즉, Integer와 Float이 함께 사용되면 두 값 모두 float 타입으로 변환되어 최종 결과가 91.0이 되는 것입니다.
예제 2: if-else 문을 사용한 경우 (승격 없음)
반면, 조건식 대신 일반적인 if-else 문을 사용하면 숫자 승격이 발생하지 않습니다.
import java.io.*;
public class Demo{
public static void main (String[] args){
Object obj_2;
if (true)
obj_2 = new Integer(91);
else
obj_2 = new Float(89);
System.out.println(obj_2);
}
}출력 결과
91
코드 설명
마찬가지로 Demo 클래스의 메인 함수 안에서 객체 인스턴스를 선언합니다. 조건이 참이면 정수 값이 객체에 할당되고, 거짓이면 실수 값이 할당된 후 콘솔에 출력됩니다. 이 경우에는 각 분기가 독립적으로 실행되기 때문에 타입 통합 과정이 일어나지 않아 원래 값인 91이 그대로 출력됩니다.
핵심 정리
- 삼항 연산자(
? :)에서 두 피연산자의 타입이 다른 숫자형이면, 자동으로 더 넓은 범위의 타입으로 승격됩니다. Integer와Float이 함께 쓰이면 결과는float타입이 되어91.0처럼 소수점이 붙습니다.- 동일한 로직이라도
if-else문으로 작성하면 승격이 발생하지 않으므로 결과가 달라질 수 있습니다. - 따라서 조건 연산자를 사용할 때는 예상치 못한 타입 변환에 주의해야 하며, 필요하다면 명시적 형변환을 고려하는 것이 좋습니다.