public class Example {
public static void main(String[] args) {
byte byteNum = 1;
int intNum = 1;
byteNum = intNum; // error: incompatible types: possible lossy conversion from int to byte
System.out.println(byteNum);
}
}
int 타입의 변숫값을 byte 타입의 변수에 할당하려 하니 에러가 난다.
그 이유는 byte 타입의 변수는 -128(포함)부터 ~ 127(포함)까지 사이의 값을 저장할 수 있는데,
만약에 int 타입의 변수의 값이 -128 ~ 127 범위를 초과하고 이 값을 byte 타입의 변수에 할당하려 하면,
정상적인 값이 할당이 안되기 때문에 이를 방지하기 위해 자바 컴파일러는 에러를 표출한다.
public class Example {
public static void main(String[] args) {
byte byteNum = 1;
int intNum = 1;
byteNum = (byte)intNum; // <- 강제 형변환
System.out.println(byteNum); // 1
}
}
이번엔 intNum 변수의 값을 byteNum 변수에 할당 시,
intNum 변수 앞에 (byte)를 붙여 intNum의 값을 byte 타입의 값으로 강제 형 변환 후 byteNum 변수에 값을 할당했다.
다행히 intNum의 값이 1이라서 byte로 형 변환 시, 아무런 문제가 없다.
하지만 밑에 코드를 보자.
public class Example {
public static void main(String[] args) {
byte byteNum = 1;
int intNum = 128;
byteNum = (byte)intNum; // <- 값 128 강제 형변환
System.out.println(byteNum); // -128
}
}
이번엔 byte 타입의 변수가 저장할 수 있는 최대 값인 127을 초과한 128를 byte로 강제 변환 후 byteNum 변수에 할당했다.
그 결과 byteNum 변수에는 128이 아닌 -128이라는 값이 할당되었다.
그 이유는 int 타입의 128를 비트로 나타내면 0000 0000 0000 0000 1000 0000이다 (32비트).
이 값을 byte 타입으로 바꾸면 1000 0000 (8비트)로 저장이 되지만 128로는 인식을 못 한다.
왜냐하면 byte의 사이즈는 비록 8비트이지만 첫 번째 비트는 음수를 표현하기 때문에,
사실상 숫자로 표현할 수 있는 범위는 000 0000 ~ 111 1111이다.
1000 0000라는 값은 byte 타입의 값으로는 -128이고,
128이 아닌 -128라는 의도하지 않는 값이 할당되었다.
결론, 사이즈가 큰 타입에서 사이즈가 작은 타입으로 강제 형 변환 시, 데이터 손실을 주의해야 한다.
'코딩 > Java' 카테고리의 다른 글
자바 - 객체 vs 인스턴스 뭔 차이? (0) | 2024.11.08 |
---|---|
자바 - 변수의 데이터 타입 확인 방법 (0) | 2024.04.20 |
자바 - 변수에 숫자 값 할당 시 가독성 높이는 법 (int a = 1,000,000 가능?) (0) | 2024.03.24 |
Java - Switch 문 꿀팁 (중복 코드 간결화) (1) | 2023.12.02 |
자바 - float 변수에 실수 값을 그냥 넣으면 에러 나는 이유 (0) | 2023.11.23 |