Language/JAVA

[JAVA] 산술 연산자

IT수정 2024. 9. 3. 16:32

산술 연산자

연산식 설명
피연산자 + 피연산자 덧셈 연산
피연산자 - 피연산자 뺄셈 연산
피연산자 * 피연산자 곱셈 연산
피연산자 / 피연산자 나눗셈 연산
피연산자 % 피연산자 나눗셈의 나머지를 산출하는 연산

 

산술 연산자의 특징은 다음과 같다.

  • 피연산자가 정수 타입 이면 연산의 결과는 int 타입이다.
  • 피연산자가 정수 타입이고, 그 중 하나가 long 타입이면 연산의 결과는 long 타입이다.
  • 피연산자 중 하나가 실수 타입이면 연산의 결과는 실수 타입이다.

 

오버플로우와 언더플로우

오버플로우(Overflow)란 타입이 허용하는 최대값을 벗어나는 것을 말한다. 반대로 언더플로우(Underflow)는 타입이 허용하는 최소값을 벗어나는 것을 말한다. 정수 타입 연산에서 오버플로우나 언더플로우가 발생하면 해당 정수 타입의 최소값 또는 최대값으로 되돌아간다.

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

 

산술 연산을 정확하게 계산하고 싶다면 실수 타입을 사용하지 않는 것이 좋다. 다음 예제는 사과 조각을 나누는 코드이다. 출력 결과를 보면 result 값이 정확히 0.3이 되지 않는다. 이것은 부동 소수점 방식을 사용하는 실수 타입에서 흔히 일어난다.

int apple = 1;
double pieceUnit = 0.1;
int number = 7;
double result = apple - number*pieceUnit;
System.out.println(result); // 0.29999999999999993

 

다음 코드처럼 정수 연산으로 변경해서 계산하는게 정확하다.

int apple = 1;
int totalPieces = apple * 10;
int number = 7;
int result = totalPieces - number;
System.out.println(result); // 3

 

나눗셈 연산 후 NaN과 Infinity 처리

나눗셈또는 나머지 연산에서 좌측 피연산자가 정수이고 우측 피연산자가 0일 경우 예외(ArithmeticException)가 발생한다. 무한대의 값을 정수로 표현할 수 없기 때문이다.

5 / 0; // 예외 발생
5 % 0; // 예외 발생

 

하지만 좌측 피연산자나 우측 피연산자가 실수 타입이면 예외가 발생하지 않고 연산의 결과는 Infinity(무한대) 또는 NaN(Not a Number)이 된다.

5 / 0.0; // Infinity
5 % 0.0; // NaN

 

Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 안된다. 데이터가 엉망이 될 수 있다. 그렇기 때문에 결과가 Infinity 또는 NaN인지 먼저 확인하고 다음 연산을 수행하는 것이 좋다. 이를 확인하기 위해서는 Double.isInfinite()Double.isNaN()를 사용한다. 결과값은 논리 타입으로 산출된다.

boolean result = Double.isInfinite(변수);
boolean result = Double.isNaN(변수);

 

'Language > JAVA' 카테고리의 다른 글

[JAVA] 논리 연산자  (0) 2024.09.03
[JAVA] 비교 연산자  (0) 2024.09.03
[JAVA] 부호 연산자와 증감 연산자  (0) 2024.09.03
[JAVA] print 메소드  (0) 2024.09.03
[JAVA] 자동 타입 변환과 강제 타입 변환  (0) 2024.09.03