λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[μš©μ–΄] μ˜€λ²„ν”Œλ‘œμš°(Overflow), μ–Έλ”ν”Œλ‘œμš°(Underflow)

좜처

ChatGPT


μ˜€λ²„ν”Œλ‘œμš°(Overflow)와 μ–Έλ”ν”Œλ‘œμš°(Underflow)λŠ” 컴퓨터 κ³Όν•™ 및 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 수치 연산을 λ‹€λ£° λ•Œ λ°œμƒν•  수 μžˆλŠ” μ€‘μš” κ°œλ…μ΄λ‹€. 이듀 κ°œλ…μ€ 특히 뢀동 μ†ŒμŠ€μ  및 μ •μˆ˜ μ—°μ‚°μ—μ„œ 값이 ν‘œν˜„ κ°€λŠ₯ν•œ λ²”μœ„λ₯Ό λ²—μ–΄λ‚  λ•Œ λ°œμƒν•œλ‹€.

 

μ˜€λ²„ν”Œλ‘œμš° Overflow

μ˜€λ²„ν”Œλ‘œμš°λŠ” μ–΄λ–€ 수치 값이 ν‘œν˜„ν•  수 μžˆλŠ” μ΅œλŒ€κ°’μ„ μ΄ˆκ³Όν–ˆμ„ λ•Œ λ°œμƒν•œλ‹€. 이둜 인해 μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όκ°€ λ‚˜νƒ€λ‚  수 μžˆλ‹€.

μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš°

μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš°λŠ” μ •μˆ˜ν˜• λ³€μˆ˜μ˜ μ΅œλŒ€κ°’μ„ μ΄ˆκ³Όν•˜λŠ” 연산이 μˆ˜ν–‰λ  λ•Œ λ°œμƒν•œλ‹€. μ»΄ν“¨ν„°λŠ” λ©”λͺ¨λ¦¬μ—μ„œ μ •μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 곡간이 μ œν•œμ μ΄κΈ° λ•Œλ¬Έμ—, νŠΉμ • λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜λŠ” 값을 μ €μž₯ν•  수 μ—†λ‹€.

 

  • μ˜ˆμ‹œ : 8λΉ„νŠΈ μ •μˆ˜ν˜• λ³€μˆ˜
    • 'byte' νƒ€μž…μ˜ λ²”μœ„ : -128 to 127
    • μ΅œλŒ€κ°’μ—μ„œ 1을 λ”ν•˜λ©΄ μ΅œμ†Œκ°’μœΌλ‘œ λŒμ•„κ°€κ²Œ λœλ‹€. (μˆœν™˜ν•˜λŠ” 방식)
byte maxByte = 127;
byte result = (byte)(maxByte + 1); // κ²°κ³ΌλŠ” -128
System.out.println("Overflow Result: " + result);

 

뢀동 μ†Œμˆ˜μ  μ˜€λ²„ν”Œλ‘œμš°

뢀동 μ†Œμˆ˜μ  μ˜€λ²„ν”Œλ‘œμš°λŠ” 뢀동 μ†Œμˆ˜μ  ν˜•μ‹μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλŠ” μ΅œλŒ€ 값을 μ΄ˆκ³Όν•˜λŠ” μ—°μ‚°μ—μ„œ λ°œμƒν•œλ‹€. 이 경우 값은 μ–‘μ˜ λ¬΄ν•œλŒ€(infinity) λ˜λŠ” 음의 λ¬΄ν•œλŒ€(-infinity)둜 μ²˜λ¦¬λœλ‹€.

  • μ˜ˆμ‹œ : 'float' νƒ€μž…μ˜ μ˜€λ²„ν”Œλ‘œμš°
    • μ΅œλŒ€κ°’ : 3.4028235e38
    • κ·Έ 이상 값을 κ³„μ‚°ν•˜λ©΄ μ–‘μ˜ λ¬΄ν•œλŒ€λ‘œ ν‘œν˜„λœλ‹€.
float largeValue = 3.4e38f;
float overflowResult = largeValue * 2.0f; // κ²°κ³ΌλŠ” Infinity
System.out.println("Float Overflow Result: " + overflowResult);

 

μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•˜λŠ” 이유

κ³ μ •λœ λΉ„νŠΈ 수

μ»΄ν“¨ν„°λŠ” κ³ μ •λœ λΉ„νŠΈ 수λ₯Ό μ‚¬μš©ν•΄ 숫자λ₯Ό ν‘œν˜„ν•˜κΈ° λ•Œλ¬Έμ— 더 큰 숫자λ₯Ό ν‘œν˜„ν•  수 μ—†λ‹€.

뢀동 μ†Œμˆ˜μ  ν‘œν˜„

뢀동 μ†Œμˆ˜μ μ€ μ§€μˆ˜μ™€ κ°€μˆ˜λ₯Ό μ‚¬μš©ν•΄ 숫자λ₯Ό ν‘œν˜„ν•˜λ―€λ‘œ ν‘œν˜„ κ°€λŠ₯ν•œ λ²”μœ„κ°€ μ œν•œλœλ‹€.

 

μ–Έλ”ν”Œλ‘œμš° Underflow

μ–Έλ”ν”Œλ‘œμš°λŠ” 수치 값이 ν‘œν˜„ν•  수 μžˆλŠ” κ°€μž₯ μž‘μ€ 값보닀 μž‘μ•„μ‘Œμ„ λ•Œ λ°œμƒν•œλ‹€. 이둜 인해 값이 0에 κ°€κΉŒμš΄ κ°’μœΌλ‘œ μΆ•μ†Œλ˜κ±°λ‚˜ 0으둜 처리될 수 μžˆλ‹€.

 

뢀동 μ†Œμˆ˜μ  μ–Έλ”ν”Œλ‘œμš°

뢀동 μ†Œμˆ˜μ  μ–Έλ”ν”Œλ‘œμš°λŠ” 맀우 μž‘μ€ 값을 μ²˜λ¦¬ν•  λ•Œ λ°œμƒν•˜λ©°, κ·Έ 값이 0에 λ„ˆλ¬΄ κ°€κΉŒμ›Œμ Έμ„œ 더 이상 ν‘œν˜„ν•  수 μ—†λŠ” 경우 λ°œμƒν•œλ‹€. μ΄λŸ¬ν•œ μƒν™©μ—μ„œ 값은 0으둜 μ²˜λ¦¬λ˜κ±°λ‚˜ λΉ„μ •κ·œν™”λœ 숫자둜 μ €μž₯λœλ‹€.

  • μ˜ˆμ‹œ : 'float' νƒ€μž…μ˜ μ–Έλ”ν”Œλ‘œμš°
    • μ΅œμ†Œκ°’ : 1.4e-46
    • 이보닀 μž‘μ€ 값을 κ³„μ‚°ν•˜λ©΄ 0으둜 ν‘œν˜„λœλ‹€.
float smallValue = 1.4e-45f;
float underflowResult = smallValue / 10.0f; // κ²°κ³ΌλŠ” 0.0
System.out.println("Float Underflow Result: " + underflowResult);

 

μ •μˆ˜ μ–Έλ”ν”Œλ‘œμš°

μ •μˆ˜ μ–Έλ”ν”Œλ‘œμš°λŠ” μ •μˆ˜ν˜• λ³€μˆ˜μ˜ μ΅œμ†Œκ°’λ³΄λ‹€ μž‘μ€ 값을 λ§Œλ“€λ €κ³  ν•  λ•Œ λ°œμƒν•œλ‹€.

  • μ˜ˆμ‹œ : 8λΉ„νŠΈ μ •μˆ˜ν˜• λ³€μˆ˜
    • 'byte' νƒ€μž…μ˜ λ²”μœ„ : -128 to 127
    • μ΅œμ†Œκ°’μ—μ„œ 1을 λΉΌλ©΄ μ΅œλŒ€κ°’μœΌλ‘œ λŒμ•„κ°€κ²Œ λœλ‹€.
byte minByte = -128;
byte result = (byte)(minByte - 1); // κ²°κ³ΌλŠ” 127
System.out.println("Underflow Result: " + result);

 

μ–Έλ”ν”Œλ‘œμš°κ°€ λ°œμƒν•˜λŠ” 이유

정밀도 손싀

맀우 μž‘μ€ 뢀동 μ†Œμˆ˜μ  값은 0에 κ·Όμ ‘ν•  λ•Œ 정밀도λ₯Ό μžƒκ²Œ λœλ‹€.

λΉ„μ •κ·œν™” 숫자

뢀동 μ†Œμˆ˜μ  ν‘œν˜„μ—μ„œ λ„ˆλ¬΄ μž‘μ€ μˆ˜λŠ” λΉ„μ •κ·œν™”λœ μƒνƒœλ‘œ μ €μž₯될 수 있으며, μ΄λŠ” 정확성이 떨어진닀.

 

μ˜€λ²„ν”Œλ‘œμš°μ™€ μ–Έλ”ν”Œλ‘œμš°μ˜ 영ν–₯

데이터 손싀

값이 μ΅œλŒ€ λ˜λŠ” μ΅œμ†Œ λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜λ©΄ 데이터 손싀이 λ°œμƒν•  수 μžˆλ‹€.

논리 였λ₯˜

예기치 μ•Šμ€ 결과둜 인해 ν”„λ‘œκ·Έλž¨μ˜ 논리적 흐름이 잘λͺ»λ  수 μžˆλ‹€.

λ¬΄ν•œ 루프 및 ν”„λ‘œκ·Έλž¨ 좩돌

μ˜€λ²„ν”Œλ‘œμš°λ‚˜ μ–Έλ”ν”Œλ‘œμš°λ‘œ 인해 λ°œμƒν•˜λŠ” 잘λͺ»λœ λ°μ΄ν„°λŠ” ν”„ν¬κ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ ν•΄μΉ  수 μžˆλ‹€.

 

μ˜ˆμ‹œ μ½”λ“œ

μ˜€λ²„ν”Œλ‘œμš° μ˜ˆμ‹œ

public class OverflowExample {
    public static void main(String[] args) {
        int maxInt = Integer.MAX_VALUE;
        System.out.println("Max Int: " + maxInt);
        
        // μ˜€λ²„ν”Œλ‘œμš° λ°œμƒ
        int overflowInt = maxInt + 1;
        System.out.println("Overflow Int: " + overflowInt); // κ²°κ³ΌλŠ” -2147483648
    }
}

 

μ–Έλ”ν”Œλ‘œμš° μ˜ˆμ‹œ

public class UnderflowExample {
    public static void main(String[] args) {
        double minDouble = Double.MIN_VALUE;
        System.out.println("Min Double: " + minDouble);
        
        // μ–Έλ”ν”Œλ‘œμš° λ°œμƒ
        double underflowDouble = minDouble / 2;
        System.out.println("Underflow Double: " + underflowDouble); // κ²°κ³ΌλŠ” 0.0
    }
}

 

 

μ˜€λ²„ν”Œλ‘œμš°μ™€ μ–Έλ”ν”Œλ‘œμš°μ˜ 예방

λ²”μœ„ 검사

μ—°μ‚° 전에 값이 μ˜€λ²„ν”Œλ‘œμš°λ‚˜ μ–Έλ”ν”Œλ‘œμš° λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.

데이터 νƒ€μž… ν™•μž₯

ν•„μš”ν•œ 경우 더 큰 데이터 νƒ€μž…μœΌλ‘œ ν™•μž₯ν•˜μ—¬ λ²”μœ„λ₯Ό λŠ˜λ¦°λ‹€.( int -> long, float -> double λ“±)

μ•ˆμ „ν•œ μ—°μ‚°

Javaμ—μ„œλŠ” 'Math.addExact'와 같은 λ§€μ„œλ“œλ₯Ό μ‚¬μš©ν—€ μ˜€λ²„ν”Œλ‘œμš°λ₯Ό 감지할 수 μžˆλ‹€.

try {
    int result = Math.addExact(Integer.MAX_VALUE, 1);
} catch (ArithmeticException e) {
    System.out.println("Overflow detected!");
}

 

κ²°λ‘ 

μ˜€λ²„ν”Œλ‘œμš°μ™€ μ–Έλ”ν”Œλ‘œμš°λŠ” 컴퓨터 κ³Όν•™μ—μ„œ 수치 μ—°μ‚°μ˜ μ€‘μš”ν•œ κ°œλ…μ΄λ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” 데이터 손싀과 ν”„λ‘œκ·Έλž¨μ˜ 였λ₯˜λ₯Ό μ΄ˆλž˜ν•  수 μžˆμœΌλ―€λ‘œ, ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 이λ₯Ό 적절히 μ΄ν•΄ν•˜κ³  μ˜ˆλ°©ν•˜κΈ° μœ„ν•œ μ „λž΅μ„ 채택해야 ν•œλ‹€. 각 데이터 νƒ€μž…μ˜ λ²”μœ„μ™€ ν•œκ³„λ₯Ό μ΄ν•΄ν•˜κ³ , 상황에 λ§žλŠ” μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž˜λ° 기법을 μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.