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에 들어가 봤는데
첫 문제가 아주 흥미로웠고 컴파일러에 대한 약간의 이해(?)와 명시적 형변환에 대해 살펴보게 된 거 같다!
'Development studies > java' 카테고리의 다른 글
[JAVA]비밀번호 저장에 왜 string 대신에 char[]을 쓸까? (0) | 2022.10.10 |
---|