Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 조건식(삼항 연산자)에서 발생하는 숫자 승격 완벽 정리

자바의 조건 연산자(삼항 연산자, ? :)는 하나의 불리언(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)에 따르면, 조건 연산자의 두 번째와 세 번째 피연산자가 서로 다른 숫자 타입일 때 더 큰 범위의 타입으로 자동 승격되기 때문입니다. 즉, IntegerFloat이 함께 사용되면 두 값 모두 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이 그대로 출력됩니다.

핵심 정리

  • 삼항 연산자(? :)에서 두 피연산자의 타입이 다른 숫자형이면, 자동으로 더 넓은 범위의 타입으로 승격됩니다.
  • IntegerFloat이 함께 쓰이면 결과는 float 타입이 되어 91.0처럼 소수점이 붙습니다.
  • 동일한 로직이라도 if-else 문으로 작성하면 승격이 발생하지 않으므로 결과가 달라질 수 있습니다.
  • 따라서 조건 연산자를 사용할 때는 예상치 못한 타입 변환에 주의해야 하며, 필요하다면 명시적 형변환을 고려하는 것이 좋습니다.