본문 바로가기

프로그래밍언어/JAVA

[JAVA] 연산자 - 산술 연산자

반응형

1. 사칙 연산자 (+, -, *, /)

 

사칙 연산자는 프로그래밍에서 가장 빈번하게 사용되는 연산자로 +, -, *, /  이루어져 있으며, * / 연산에서의 우선순위가 +, - 보다 높다.

 

나누기의 경우 피연산자가 정수형인 경우 나누는 수로 0 사용할  없다. 만일 0으로 나눈다면 실행 시에 에러가 발생한다. 또한 나머지의 결과는 피연산자의 타입을 따라간다.

 

10 (int) / 4 (int) -> 2 (int)
// 소수점 이하는 버린다.

 

나누기 연산자의  피연산자가 모두 int 타입인 경우 연산결과 역시 int 타입이다. 그렇기 때문에 실제 결과가 2.5이어도 int 타입의 값인 2 결과로 가지게 된다. 이때 반올림이 발생하지 않는다. 그래서 정확환 결과를 얻기 위해서는 정수형과 정수형의 나누기시에 실수형으로 형변환을 하여 연산을 해야하는 경우도 있다.

 

또한 피연산자가 정수형인 경우, 나누는 수로 0ㅇ을 사용할  없다. 만일 0으로 나누게 되면 실행 시에ArithmeticException 오류가 발생하게 된다. 부동 소수점값인 0.0f, 0.0d 나누는 것은 가능하지만  결과는Infinity 된다.

 

- 피연산자가 무한대와 0.0 때의 나눗셈, 나머지 연산 결과

 

x y x / y x % y
유한수 ±0.0 ±Infinity NaN
유한수 ±Infinity ±0.0 x
±0.0 ±0.0 NaN NaN
±Infinity 유한수 ±Infinity NaN
±Infinity ±Infinity NaN NaN

 

 NaN Not a Number 약자로 숫자가 아니라는 뜻이다.

 

byte a = 10;
byte b = 10;
byte c = a + b;

 

앞서 연산자에서 말했던 것과 같이 int보다 작은 타입의 경우 모두 int 형변환을 시켜준다. 그렇기 때문에 위의 a + b 연산도 byte + byte  아닌 int + int 연산이 이루어진다. 그렇기 때문에 세번째 줄에서 byte c에세 a + b 연산의 결과를 저장하려고 하면 byte int 저장하는 상황이 발생하기 때문에 타입이 맞지 않아서 오류가 발생하게된다.

 

이때 a + b 결과를 byte  형변환을 해주어도 올바를 결과를 얻을 수는 없다. 작은 타입에서  타입으로는 값의손실도 없고 자동 형변환이 되는 반면에  타입에서 작은 타입으로 변환하는 경우 변환과정에서 누락되는 bit들이 발생하여 값에 손실이 발생한다.

 

이와 유사한 예시로 int + int 수행하지만 만약  값이 int 범위를 넘어가는 경우 값의 손실이 일어난다.  이유는 int + int 결과 또한 피연산자들의 타입을 따라 long 아닌 int 결과가 출력되기 때문에 int 넘어가는 값에 대한 손실이 발생한다. 그렇기 때문에 산술 연산자 사용시에 피연산자 타입의 범위와 결과값을  고려하여 연산을 수행해야 한다.

 

사칙연산의 피연산자는 숫자뿐만 아니라 문자도 가능하다. char 타입도 앞에서 설명한 것과 같이 유니코드로 정수의 형식으로 값이 저장되기 때문에 숫자를 표현하는 타입들과 호환이 된다. 그렇기 때문에 문자형과 숫자를 연산을 하게 되면 숫자로  값이 출력되고,  결과를 다시 문자형으로 형변환하는 경우 결과에 대응하는 문자로변환되게 된다.

 

 

2. 나머지 연산자 (%)

 

나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고  나머지 값을 결과로 반환하는 연산자이다. 나누는 수로 0 사용할  없고, 피연산자로 정수만 혀용한다. 주로 짝수, 홀수 또는 배수 검사 등에 주로 사용된다.

 

나머지 연산자는 나누는 수로 음수도 사용가능하다. 그러나 부호는 무시되기 때문에 결과는 음수의 절대값으로나눈 나머지와 결과가 같다.

 

System.out.println(10 % 8);
// 2

System.out.println(10 % -8);
// 2
반응형

'프로그래밍언어 > JAVA' 카테고리의 다른 글

[JAVA] 연산자 - 논리 연산자  (0) 2021.08.13
[JAVA] 연산자 - 비교 연산자  (0) 2021.08.12
[JAVA] 연산자 - 단항 연산자  (0) 2021.08.10
[JAVA] 연산자 (Operator)  (0) 2021.08.10
[JAVA] 형변환 (casting)  (0) 2021.08.03