Development studies/java

[JAVA] 삼항연산자와 final 관계 질의(+downcasting)

comoZ 2022. 10. 7. 00:34

stackoverflow에 본 삼항연산자와 final과 관련된 문제이다
자세한 내용은 다음과 같다.

public class errorEX {
    public static void main(String[] args) {

        int a=10, b=20;
        byte c= (a>b) ?   50 : 10;
        System.out.print(c);
 
    }
}
//result : java: incompatible types: possible lossy conversion from int to byte


public class finalEX {
    public static void main(String[] args) {

        final int a=10, b=20;
        byte c= (a>b) ?   50 : 10;
        System.out.print(c);
 
    }
}
//result : 10


errorEX 예제는 오류가 나지만 finalEX는 오류가 나지 않는다.

errorEX는 근본적으로 byte타입의 변수에 int타입의 값을 넣을 때 자동적으로 다운캐스팅이 되지 않고 오류가 난다.
하지만 왜 근본적인 문제를 해결하지않았음에도 변수를 상수로 바꿔줌으로써 오류가 사라진 걸까?


이러한 상황을 이해하기 위해서는 컴파일러의 이해가 필요하다.

아래는 또 다른 예제이다.

public class falseEX {
    public static void main(String[] args) {
        int a=10, b=20;
        byte c= (false) ?   50 : 10;
        System.out.print(c);
    }
}
//reslut : 10

falseEX 예제 또한 정상적으로 작동한다.
단순히 조건문을 직접적으로 바꿔줬을 뿐이다. 왜일까?

이는 컴파일러의 입장에서 falseEX와 finalEX와 똑같이 보기 때문이다.

아래 는 내맘대로 적당히 컴파일한 결과를 표현한 것이다.

falseEX,finalEX:
        int a=10, b=20;
        byte c= 10;
        print(c);

errorEX:
        int a=10, b=20;
        var_int_type = (false) ?   50 : 10;
        byte c= var_int_type;
        print(c);​


상수는 불변이다. 그렇다면 finalEX에서 (a > b) 조건문의 결과 또한 불변이다.
그렇다면 삼항연사자의 값 또한 10으로 불변이다.

즉, (a < b) 조건 결과는 false로 불변이기 때문에 괜히 삼항연산자를 실행하지 않고 그냥 바로 false 값인 10을 할당하도록 컴파일러가 처리한 것이다.




추가적으로 다운캐스팅에 대한 예제이다.

public class downcasting {
    public static void main(String[] args) {
    	byte c;
        int a=10;
        
        c = a;// 위 예제와 같은 컴파일 에러
        c = 10;	// 문제 없음
        
        c = 1000;//byte 범위를 초과하기 때문에 컴파일 에러가 발생한다.
        c = (byte) a;//이러한 강제적(명시적) 형변환을 거치면 컴파일 에러가 발생하지 않는다.
        
        
        a=1000;
        c = (byte) a;
        //결과적으로 c에 1000이 할당되지만 컴파일 에러는 발생하지 않는다
        //하지만 c를 프린트하면 1000이 아닌 엉뚱한 값이 나올 것이다.
        //이게 더 큰문제! 
    }
}



stackoverflow 질의 링크다!
링크에는 영어로 믿음직스러운 설명이 있으니 한 번 보자!


처음으로 stackoverflow에 들어가 봤는데
첫 문제가 아주 흥미로웠고 컴파일러에 대한 약간의 이해(?)와 명시적 형변환에 대해 살펴보게 된 거 같다!