변수의 부호를 유지하거나 변경
| 연산식 | 설명 |
|---|---|
| +피연산자 | 피연산자의 부호 유지 |
| -피연산자 | 피연산자의 부호 변경 |
증감 연산자는 변수의 값을 1 증가시키거나 1 감소시킴
| 연산식 | 설명 |
|---|---|
| ++피연산자 | 피연산자의 값을 1 증가시킴 |
| —피연산자 | 피연산자의 값을 1 감소시킴 |
| 피연산자++ | 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴 |
| 피연산자— | 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴 |
| 연삭식 | 설명 |
|---|---|
| + | 덧셈 연산 |
| - | 뺄셈 연산 |
| * | 곱셈 연산 |
| / | 나눗셈 연산 |
| % | 나눗셈의 나머지를 산출하는 연산 |
타입이 허용하는 최대값을 벗어나는 것
타입이 허용하는 최소값을 벗어나는 것

오버플로우, 언더플로우가 발생하면, 해당 정수 타입의 최소값 또는 최대값으로 되돌아간다.
byte 타입일 경우 최대값 127에서 1을 더하면 128이 되어 오버플로우가 발생하고, 연산 결과는 최소값인 -128이 된다. 그리고 다시 1을 더하면 -127이 된다.
산술 연산을 정확하게 계산하고 싶다면 실수 타입의 사용은 지양해야 한다. 정확한 계산이 필요하다면 정수 연산으로 변경하여 연산 과정을 가져야 한다.
package ch03.sec04;
public class AccuracyExample1 {
public static void main(String[] args) {
int apple = 1;
double pieceUnit = 0.1;
int number = 7;
double result = apple - number * pieceUnit;
System.out.println("사과 1개에서 남은 양: " + result);
}
}

부동 소수점 방식을 사용하는 실수 타입에서 정확한 계산이 발생하지 않을 수도 있다.
숫자를 0으로 나누거나(/), 나머지(%)를 구하고자 하는 경우 예외가 발생(ArithmeticException)한다. 컴퓨터는 무한대의 값을 정수로 표현할 수 없다.
하지만 0.0으로 나누는 경우에는 예외가 발생하는 것이 아닌 Infinity 또는 NaN이 된다. 이 값에서 어떤 값을 연산하더라도 Infinity, NaN의 값이다. 그래서 이 상태에서 연산을 계속 수행하면 안 된다.
Double.isInfinite(), Double.isNaN()을 사용하여 해당 연산의 결과가 Infinity, NaN인지 확인하고 다음 연산을 수행해줘야 한다.
package ch03.sec05;
public class InfinityAndNaNCheckExample {
public static void main(String[] args) {
int x = 5;
double y = 0.0;
double z = x / y;
//double z = x % y;
//잘못된 코드
System.out.println(z + 2);
//알맞은 코드
if (Double.isInfinite(z) || Double.isNaN(z)) {
System.out.println("값 산출 불가");
} else {
System.out.println(z + 2);
}
}
}
동등(==, !=), 크기(<, <=, >, >=)를 평가해서 boolean 타입으로 산출
흐름 제어문인 조건문, 반복문에서 실행 흐름을 제어할 때 주로 사용된다.
피연산자의 타입이 다를 경우에는 비교 연산을 수행하기 전에 타입을 일치시킨다. ‘A’==65라면 A를 65로 변환한 다음 비교한다.
0.1f==0.1에서는 false가 반환된다. 부동 소수점을 사용하는 실수타입은 0.1을 정확히 표현할 수 없고, float과 double 타입의 정밀도 차이 때문에 정확히 같은 값이라고 볼 수 없다.
| 구분 | 연산식 | 설명 |
|---|---|---|
| AND(논리곱) | &&, & | 피연산자가 모두 true일 경우에만 연산 결과가 true |
| OR(논리합) | ||
| XOR(배타적 논리합) | ^ | 피연산자가 하나는 true이고 다른 하나가 false일 경우에만 연산 결과가 true |
| NOT(논리 부정) | ! | 피연산자의 논리값을 바꿈 |
흐름 제어문인 조건문, 반복문 등에서 주로 사용된다.
bit 단위로 논리 연산을 수행한다. 정수 타입(byte, short, int, long)만 피연산자가 될 수 있다. 산출 결과가 1,0으로 산출된다.
| 구분 | 연산식 | 설명 |
|---|---|---|
| AND | & | 두 비트 모두 1일 경우에만 연산 결과가 1 |
| OR | ||
| XOR | ^ | 두 비트 중 하나는 1이고 다른 하나는 0일 경우 연산 결과는 1 |
| NOT | ~ | 보수 |
자바에서는 바이트 타입이 부호 있는 정수(signed byte)로 처리되기 때문에, 0~255 범위의 부호 없는 바이트(unsigned byte) 값을 사용해야 할 경우가 생긴다. 자바에서는 개발자의 편리성을 위해서 Byte.toUnsignedInt()코드를 제공한다.
비트를 좌측 또는 우측으로 밀어서 이동시키는 연산
| 구분 | 연산식 | 설명 |
|---|---|---|
| shift | a<<b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동한다. 오른쪽 빈자리는 0으로 채운다. 와 동일한 결과이다. |
a>>b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동한다. 왼쪽 빈자리는 최상위 부호 비트와 같은 값으로 채운다. 와 동일한 결과이다. | |
a>>>b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동한다. 왼쪽 빈자리는 0으로 채운다. |
=: 우측의 피연산자의 값을 변수에 저장한다+=: 변수 = 변수 + 피연산자-=: 변수 = 변수 - 피연산자*=: 변수 = 변수 * 피연산자/=: 변수 = 변수 / 피연산자%=: 변수 = 변수 % 피연산자&=: 변수 = 변수 & 피연산자|=: 변수 = 변수 | 피연산자^=: 변수 = 변수 ^ 피연산자<<=: 변수 = 변수 << 피연산자>>=: 변수 = 변수 >> 피연산자>>>=: 변수 = 변수 >>> 피연산자조건식 ? true일 때 값 : false일 때 값
괄호를 사용해서 우선순위를 확실하게 정해주는 것이 좋다.