자바는 정수형 데이터 타입에 대해 고정된 크기와 범위를 제공합니다. 각 데이터 타입은 2의 보수(2's complement) 표현법을 사용하여 음수와 양수를 나타냅니다.

오버플로우는 값이 데이터 타입의 최대값을 초과하거나 최소값보다 작아질 때 발생합니다.
최대값을 초과하면 값이 최소값으로 롤오버됩니다.
최소값보다 작아지면 값이 최대값으로 롤오버됩니다.
코드 복사
public class OverflowExample {
public static void main(String[] args) {
int maxValue = Integer.MAX_VALUE; // 최대값: 2,147,483,647
int overflowValue = maxValue + 1; // 오버플로우 발생
System.out.println("정수 최대값: " + maxValue);
System.out.println("오버플로우 값: " + overflowValue); // 최소값으로 롤오버
}
}
정수 최대값: 2147483647
오버플로우 값: -2147483648
언더플로우는 값이 데이터 타입의 최소값보다 작아질 때 발생하며, 값이 최대값으로 롤오버됩니다.
public class UnderflowExample {
public static void main(String[] args) {
int minValue = Integer.MIN_VALUE; // 최소값: -2,147,483,648
int underflowValue = minValue - 1; // 언더플로우 발생
System.out.println("정수 최소값: " + minValue);
System.out.println("언더플로우 값: " + underflowValue); // 최대값으로 롤오버
}
}
정수 최소값: -2147483648
언더플로우 값: 2147483647
자바의 정수형은 고정된 비트 크기를 가지며, 이를 초과하는 값은 표현할 수 없습니다.32비트 정수형(int) 은 총 32개의 비트를 사용하며, 이 중 1비트는 부호(Sign) 비트를 나타냅니다.
최대값: 01111111 11111111 11111111 11111111 (2,147,483,647)
최소값: 10000000 00000000 00000000 00000000 (-2,147,483,648)
최대값에 1을 더하면 비트가 다음과 같이 롤오버됩니다:
01111111 11111111 11111111 11111111 (2,147,483,647)
+1
10000000 00000000 00000000 00000000 (-2,147,483,648)
값을 계산하기 전에 조건문으로 한계를 확인합니다.
public class OverflowCheck {
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
int b = 10;
if (a > Integer.MAX_VALUE - b) { // 오버플로우가 발생하는지 확인
System.out.println("오버플로우 발생 가능성 있음!");
} else {
int result = a + b;
System.out.println("결과: " + result);
}
}
}
자바는 오버플로우를 방지하기 위해 Math 클래스에서 addExact, subtractExact, multiplyExact 메서드를 제공합니다.
오버플로우가 발생하면 ArithmeticException이 발생합니다.
public class AddExactExample {
public static void main(String[] args) {
try {
int result = Math.addExact(Integer.MAX_VALUE, 1); // 오버플로우 확인
System.out.println("결과: " + result);
} catch (ArithmeticException e) {
System.out.println("오버플로우 발생: " + e.getMessage());
}
}
}
오버플로우 발생: integer overflow
오버플로우로 인해 값이 최소값으로 롤오버되면, 루프 조건이 항상 참으로 평가될 수 있습니다.
public class InfiniteLoopExample {
public static void main(String[] args) {
for (int i = Integer.MAX_VALUE; i >= 0; i++) { // 항상 참이 됨
System.out.println(i);
}
}
}
부동소수점의 경우 오버플로우 시 Infinity로 처리되며, 예외는 발생하지 않습니다.
public class FloatOverflow {
public static void main(String[] args) {
float largeValue = Float.MAX_VALUE;
System.out.println(largeValue * 2); // Infinity
}
}
악의적인 사용자가 입력을 통해 오버플로우를 발생시키면 의도하지 않은 동작을 유발할 수 있습니다.
이 부분은 해당 블로그를 참조하면 자세히 알 수 있다. '올리브수' 님의 블로그