Java/Java 개념 정리

[이것이 자바다] 03 연산자

안정민 2023. 3. 19. 02:56

1. 오버플로우와 언더플로우

-오버플로우(Overflow)란, 타입이 허용하는 최대값을 벗어나는 것을 이야기하며, 반대로 언더플로우(underflow)는 타입이 허용하는 최소값을 벗어나는 것을 이야기한다.

-오버플로우와 언더플로우가 발생되면 실행에러를 발생시키는 것이 아닌 해당 정수 타입의 최소값(오버플로우의 경우) 혹은 최대값(언더플로우의 경우)으로 되돌아간다.

- 예를 들어, byte 타입의 경우 최대값 127에서 1을 더하면 128이 되어 오버플로우가 발생, 연산의 결과는 -128이 되며 1을 더하여도 127로 복귀하지 않고 -127이 된다.

byte value = 127;
value++;
System.out.println(value); //-128

-마찬가지로 -128에서 1을 뺴면 -129가 되어 언더플로우가 발생하는데, 연산 결과는 최대값인 127이 되며 마찬가지로 -1을 한다고 하더라도 다시 -128로 복귀하지 않고 연산 결과는 126이 된다.

-byte 타입이 아닌 short, int, long 타입은 값의 범위만 다를 뿐 오버플로우 및 언더플로우가 발생하였을 때 마찬가지로 최소값 및 최대값으로 되돌아간다.

 

 

2. 나눗셈 연산 후 NaN과 Infinity 처리

- 나눗셈(/) 혹은 나머지 (%) 연산에서 좌측 피연산자가 정수이고 우측 피연산자가 0일 경우 예외 (Arithmetic Exception)이 발생하며 이유는 무한대의 값을 정수로 표현할 수 없기 때문이다.

-그러나 좌측 피연산자가 실수이거나, 우측 피연산자가 0.0 또는 0.0f이면 예외가 발생하지 않고 연산의 결과는 Infinity 또는 NaN(Not a Number)가 된다.

5/0.0 의 경우 연산의 결과는 Infinity

5%0.0의 결과는 NaN

-Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 데이터가 엉망이 될 수 있으므로 이를 확인하는 작업이 필수적으로 선행되어야 한다.

-/ 와 % 연산의 결과가 Infinity 또는 NaN인지 확인하기 위해서는 Double.isInfinite()Double.isNaN() 메소드를 사용한다. 이렇게 하면 변수값이 Infinity 또는 NaN일 경우 true를, 그렇지 않다면 false를 산출한다.

 

 

3.문자열 비교연산자

-문자열을 비교할 때에는 동등연산자(==,!=) 대신 equals(), !equals() 메소드를 사용한다

- 그 이유는 5장에서 자세히 설명 ++링크 달기