Overflow (오버플로우)
오버플로우는 변수나 메모리의 저장 용량을 초과하여 데이터가 잘못되거나 손실되는 상황을 의미한다.
정수 오버플로우: 정수형 변수에 저장할 수 있는 값의 범위를 초과할 때 발생한다. 예를 들어, 8비트 정수형 변수는 -128에서 127까지의 값을 저장할 수 있지만, 이 범위를 넘어서는 값이 할당되면 오버플로우가 발생한다.
byte b = 127;
b = (byte) (b + 1); // 오버플로우 발생
System.out.println(b); // -128 출력
부동소수점 오버플로우: 부동소수점 숫자가 표현할 수 있는 최대값을 초과할 때 발생한다. 이 경우, 결과는 일반적으로 무한대(∞)로 처리된다.
double d = Double.MAX_VALUE;
d = d * 2; // 오버플로우 발생
System.out.println(d); // Infinity 출력
스택 오버플로우: 재귀 호출이 너무 깊거나, 스택에 너무 많은 데이터를 저장할 때 발생한다. 이 경우, 스택 메모리가 초과되어 예외가 발생할 수 있다.
public void recursive() {
recursive(); // 재귀 호출로 인해 스택 오버플로우 발생
}
Underflow (언더플로우)
언더플로우는 변수나 메모리의 저장 용량보다 작은 값을 저장하려고 할 때 발생하는 상황을 의미한다. 이 경우, 데이터가 잘못되거나 부정확하게 처리될 수 있다.
정수 언더플로우: 정수형 변수의 최솟값보다 작은 값을 저장하려고 할 때 발생한다. 예를 들어, 8비트 정수형 변수의 최솟값인 -128보다 작은 값을 저장하려고 하면 언더플로우가 발생한다.
byte b = -128;
b = (byte) (b - 1); // 언더플로우 발생
System.out.println(b); // 127 출력
부동소수점 언더플로우: 부동소수점 숫자가 표현할 수 있는 최소값보다 작은 값을 저장하려고 할 때 발생한다. 이 경우, 결과는 일반적으로 0으로 처리된다.
double d = Double.MIN_VALUE;
d = d / 2; // 언더플로우 발생
System.out.println(d); // 0.0 출력
스택 언더플로우: 스택에서 데이터를 꺼낼 때, 스택이 비어 있는 경우 발생할 수 있다. 이 경우, 스택 언더플로우가 발생하여 예외가 발생할 수 있다.
Stack<Integer> stack = new Stack<>();
stack.pop(); // 스택 언더플로우 발생 (스택이 비어 있음)
요약
- Overflow: 변수나 메모리의 저장 용량을 초과하여 데이터가 잘못되거나 손실되는 상황.
- Underflow: 변수나 메모리의 저장 용량보다 작은 값을 저장하려고 할 때 데이터가 잘못되거나 0으로 처리되는 상황.
'Computer Science' 카테고리의 다른 글
자료 구조 - 복잡도 (0) | 2024.09.21 |
---|---|
트랜잭션과 무결성 (0) | 2024.09.14 |
CPU 스케줄링 알고리즘 (7) | 2024.09.07 |
메모리(Memory) (6) | 2024.09.01 |
Stack, Method, Heap 메모리 (0) | 2024.08.11 |