코딩/Java

자바 - 형변환 에러 이유 "incompatible types: possible lossy conversion from int to byte"

Junoni 2024. 3. 31. 18:58
반응형
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을 초과한 128byte로 강제 변환 후 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라는 의도하지 않는 값이 할당되었다.

 

 

 

결론, 사이즈가 큰 타입에서 사이즈가 작은 타입으로 강제 형 변환 시, 데이터 손실을 주의해야 한다.

반응형