본문 바로가기
개발/자바 웹 개발

[자바 웹 개발] 산술 연산자_오버플로우, NaN과 Infinity 연산

by 겜더지 2024. 4. 21.

산술연산자 오버플로우 NaN Infinity (배경: 이젠아카데미컴퓨터학원 종로캠퍼스)

본 포스팅은 '이젠아카데미컴퓨터학원 종로캠퍼스'에서 진행한 윤대명 선생님의 강의를 듣고 공부한 내용을 정리한 것입니다.

*참고 자료: 신용권, 『이것이 자바다』, 한빛미디어(주), 2015.

자바 Java 기본서 사러 가기

 

이것이 자바다

COUPANG

www.coupang.com

목차


    1. 산술 연산자

    *boolean 타입을 제외한 모든 기본 타입에서 사용 가능합니다.

    *결과값을 산출할 때 Overflow(값이 넘치는 경우, 값이 범위를 벗어나는 경우)를 주의해야 됩니다.

    *정확한 계산은 정수를 사용하는 게 좋습니다.

    *NaN, Infinity 연산은 주의해야 합니다.

    연산식 설명
    + 덧셈
    - 뺄셈
    * 곱셈
    / 나눗셈
    % 나머지
    예를 들면, [10 % 3 = 1]

    1-1. [예제] 산술 연산자 1

    산술연산자 예제 (화면 캡처_출처: Eclipse)
    산술연산자 예제 (화면 캡처_출처: Eclipse)

    ↘모든 연산 결과, 정수와 정수의 연산 결과는 정수입니다. int 타입이 됩니다. int 타입의 값을 byte에는 넣을 수 없습니다. 연산된 결과(+, -, *, /, %)는 전부다 int입니다. 최소 int 이상에 담아야 합니다. 아니면 형 변환까지 거쳐야 합니다.

    산술연산자 예제 (화면 캡처_출처: Eclipse)

    ↘double형은 int로 나누면, double형이 나옵니다. 그래서 double형이 받을 수 있는 것입니다.


    1-2. [예제] 산술 연산자 2

    산술연산자 예제 (화면 캡처_출처: Eclipse)
    산술연산자 예제 (화면 캡처_출처: Eclipse)


    1-3. [예제] 산술 연산자 3

    산술연산자 예제 (화면 캡처_출처: Eclipse)


    1-4. [예제] 산술 연산자 4

    산술연산자 예제 (화면 캡처_출처: Eclipse)


    1-5. [예제] 산술 연산자 5

    산술연산자 예제 (화면 캡처_출처: Eclipse)


    1-6. [예제] char 타입 연산 1

    char 타입 연산 예제 (화면 캡처_출처: Eclipse)
    char 타입 연산 예제 (화면 캡처_출처: Eclipse)
    char 타입 연산 예제 (화면 캡처_출처: Eclipse)
    char 타입 연산 예제 (화면 캡처_출처: Eclipse)


    1-7. [예제] char 타입 연산 2

    char 타입 연산 예제 (화면 캡처_출처: Eclipse)


    1-8. [예제] char 타입 연산 3

    char 타입 연산 예제 (화면 캡처_출처: Eclipse)


    1-9. [예제] char 타입 연산 4

    char 타입 연산 예제 (화면 캡처_출처: Eclipse)


    1-10. [예제] 오버플로우 1

    오버플로우 예제 (화면 캡처_출처: Eclipse)

    ↘이런 연산을 하면 안 된다는 걸 보여줍니다.

    오버플로우 예제 (화면 캡처_출처: Eclipse)

    ↘long형으로 작업을 하면 우리가 원하는 결과를 얻을 수 있습니다. 굳이 타입을 8개나 놓고 구분하는 이유입니다.


    1-11. [예제] 오버플로우 2

    오버플로우 예제 (화면 캡처_출처: Eclipse)


    1-12. [예제] 산술 연산 전에 오버플로우를 탐지

    산술 연산 전에 오버플로우 탐지 예제 (화면 캡처_출처: Eclipse)
    산술 연산 전에 오버플로우 탐지 예제 (화면 캡처_출처: Eclipse)


    1-13. [예제] 정확하게 계산할 때에는 부동소수점 타입을 사용하지 않는다.

    정확하게 계산해야 할 때는 부동소수점(실수) 타입을 사용하지 않는 것이 좋다.

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.81.

    부동소수점 타입을 사용하지 않기 예제 (화면 캡처_출처: Eclipse)

    출력된 결과를 보면 result 변수의 값은 0.29999999999999993이 되어 정확히 0.3이 되지 않는다. 이것은 이진 포맷의 가수를 사용하는 부동소수점 타입(float, double)은 0.1을 정확히 표현할 수 없어 근사치로 처리하기 때문이다.

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.82.

    부동소수점 타입을 사용하지 않기 예제 (화면 캡처_출처: Eclipse)

    항상 숫자가 들어가는 연산에 있어서는 결과를 꼭 봐야 합니다. 특히나 double형이나 float 가지고 하는 작업은 소수점을 꼭 보고, 내가 원하는 게 안 나왔을 때는 다른 방법을 찾으면 됩니다.


    2. NaN과 Infinity 연산

    *0으로 나누는 것은 연산에 있어서 있을 수 없습니다. ArithmeticException 에러가 발생합니다. (Arithmetic은 산술연산, Exception은 예외.) 작업을 할 때 0으로 절대로 나누면 안 됩니다.

    자바는 프로그램 실행 도중 예외가 발생하면 실행이 즉시 멈추고 프로그램은 종료된다.

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.83.
    그러나 실수 타입인 0.0 또는 0.1f로 나누면 ArithmeticException이 발생하지 않고, / 연산의 결과는 Infinity(무한대) 값을 가지며, % 연산의 결과는 NaN(Not a Number)을 가진다.

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.83.

    2-1. [예제] Infinity와 NaN

    Infinity와 NaN 예제 (화면 캡처_출처: Eclipse)
    Infinity와 NaN 예제 (화면 캡처_출처: Eclipse)

    ↘z를 출력해 보면, 정말 Infinity가 나오는 걸 볼 수 있습니다. 절대로 실수 0.0으로 나누지 맙시다.

    Infinity와 NaN 예제 (화면 캡처_출처: Eclipse)
    Infinity와 NaN 예제 (화면 캡처_출처: Eclipse)

    ↘Infinity에 2를 더하면 Infinity입니다.

    Infinity와 NaN 예제 (화면 캡처_출처: Eclipse)


    2-2. [예제] "NaN" 문자열의 문제점

    "NaN" 문자열의 문제점 예제 (화면 캡처_출처: Eclipse)
    "NaN" 문자열의 문제점 예제 (화면 캡처_출처: Eclipse)

    ↘[val]은 NaN입니다. 10000.0에 NaN을 더하니 결국은 NaN이 나왔습니다.


    2-3. [예제] "NaN"을 체크하고 연산 수행

    "NaN"을 체크하고 연산 수행 예제 (화면 캡처_출처: Eclipse)


    3. 확인문제

    3-1. [확인 문제] 산술 연산자 1

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.103.

    ↘[534/30]의 몫이 똑같이 나누어 준 개수가 됩니다. 나눗셈해서 몫과 나머지를 구하면 됩니다.

    산술 연산자 문제 (화면 캡처_출처: Eclipse)


    3-2. [확인 문제] 산술 연산자 2

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.103.
    산술 연산자 문제 (화면 캡처_출처: Eclipse)

    ↘356을 100으로 나누면 3.56이 나옵니다. int를 int로 나누니 결과는 3이 됩니다.


    3-3. [확인 문제] 산술 연산자 3

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.104.

    *사다리꼴의 넓이 = (윗면 + 밑면) * 높이 / 2

    산술 연산자 문제 (화면 캡처_출처: Eclipse)
    산술 연산자 문제 (화면 캡처_출처: Eclipse)

    ↘괄호가 제일 중요합니다. 괄호를 치는 순간, 괄호부터 연산이 됩니다.

    산술 연산자 문제 (화면 캡처_출처: Eclipse)

    ↘만약에 [.]이 빠져버리면 [52.5]가 아니라 [52.0]가 나옵니다. [2.0]으로 나눠서 소수점 자리가 나오게 한 것입니다.


    3-4. [확인 문제] Infinity와 NaN

    신용권, 『이것이 자바다』, 한빛미디어(주), 2015년, p.105.
    Infinity와 NaN 문제 (화면 캡처_출처: Eclipse)
    Infinity와 NaN 문제 (화면 캡처_출처: Eclipse)


    쿠팡 파트너스
    쿠팡 파트너스