반응형
Java에서는 타입 캐스팅을 수행할 때, 특히 정수형 데이터를 더 작은 크기의 정수형으로 캐스팅할 때 오버플로우가 발생할 수 있다.
JVM 내부에서는 이 오버플로우를 특별히 에러로 처리하지 않고, 단순히 값의 하위 비트만 취하는 방식으로 처리한다!
처리 과정
- 비트 자르기
- 더 큰 정수형 데이터를 더 작은 정수형으로 캐스팅하면, 상위 비트를 잘라내고 결과적으로 잘린 하위 비트만 새로운 값으로 사용한다.
- 예를 들어, int를 byte로 변환할 때, int의 하위 8비트만 유지된다.
- 값의 손실
- 상위 비트를 잘라내는 과정에서 정보가 손실될 수 있다.
- 오버플로우나 언더블로우와 관계없이 자바는 이를 단순히 값 변환으로 간주한다.
- 2의 보수 연산 규칙 적용
- 정수는 자바에서 2의 보수 표현을 사용하므로, 하위 비트를 유지한 결과가 2의 보수 규칙에 따라 계산된 새로운 값으로 나타난다.
public class TypeCastingOverflow {
public static void main(String[] args) {
int largeValue = 130;
byte smallValue = (byte) largeValue;
System.out.println("Original int value: " + largeValue); // 130
System.out.println("After casting to byte: " + smallValue); // -126
}
}
분석 해보자!
130의 이진 표현 (32비트, int)
00000000 00000000 00000000 10000010
byte로 변환시, 하위 8비트만 유지
10000010 (2의 보수 표현으로 -126)
JVM 내부 처리 방식
- JVM의 정수 연산 명령어를 통해 캐스팅이 수행된다.
- JVM은 오버플로우 상태를 감지하지 않고 단순히 잘린 하위 비트만 저장한다.
- 이런 방식은 명시적 타입 캐스팅에 따른 설계된 동작으로 간주한다.
오버플로우를 방지하려면!?
- 범위 확인
- 캐스팅 전에 값이 대상 타입의 범위 내에 있는지 확인한다.
- BigInteger 사용
- 범위를 초과하는 계산이 필요한 경우, BigInteger 클래스를 사용할 수 있다.
- ArithmeticException을 통한 명시적 확인
- 자바 자체적으로 예외를 던지지 않으므로, 직접 범위를 확인하고 예외를 발생시키는 로직을 추가할 수 있다.
2의 보수란?
- 컴퓨터에서 정수형 데이터를 표현하는 방식 중 하나로, 음수를 나타내기 위한 표준 방법이다.
- 이 방식을 이해하면 Java에서 타입 캐스팅 시 오버플로우가 발생해도 결과 값이 어떻게 계산되는지 알 수 있다. (좋군!)
그래서 2의 보수가 뭐야!
- 2의 보수는 음수를 표현하기 위한 이진수 체계 이다.
- 특정 비트 길이를 기준으로
- 숫자를 비트 단위로 표현한 후,
- 각 비트를 반전시킨다. ( 0 -> 1, 1 -> 0)
- 거기에 1을 더한다.
이 방식으로 음수를 표현하면 컴퓨터는 음수와 양수를 동일한 방식으로 더하거나 빼는 연산이 가능하다.
자 이제 2의 보수로 오버플로우를 이해해보자..!
- 130의 이진 표현 (32 비트 int)
00000000 00000000 00000000 10000010
- byte는 비트이므로 하위 8비트만 유지
10000010
- 이 값은 2의 보수 표현으로 음수를 나타냄
- 10000010을 다시 음수로 해석하려면
- 비트를 반전: 01111101
- 1을 더하: 01111110 (십진수 126)
- 음수 기호 붙이: -126
- 10000010을 다시 음수로 해석하려면
결론!
JVM은 하위 비트만 유지하기 때문에, 값이 음수로 바뀌어도 특별히 처리하지 않고 결과를 그대로 사용한다.
2의 보수 표현 덕분에 음수와 양수를 같은 방식으로 계산할 수 있다!
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
반응형
'public void static main > Java' 카테고리의 다른 글
[JAVA] 불변객체, 가변객 뭔지는 알겠는데 자세히 좀 더 알아보자 (1) | 2024.12.25 |
---|---|
[JAVA] LinkedList 알꺼같으면서도 모르겠다. (0) | 2024.12.23 |
[JAVA] JVM Memory (0) | 2022.02.18 |
[Spring] @RestController @Controller 차이가뭐야?? (0) | 2022.01.29 |
[Spring] Hidden Method (0) | 2021.11.23 |
댓글