부호 연산자
- 변수의 부호를 유지
+하거나 변경-하는 연산자
정수 타입(byte, short, int) 연산의 결과는 int 타입이다.
다음의 경우, 부호를 변경하는 것도 연산이므로 int 타입 변수에 대입해야 한다.
byte b = 100;
byte result = -b; // 컴파일 에러 !
int result = -b; // ok
증감 연산자
- 변수의 값을 1 증가시키거나 1 감소시키는 연산자
| 연산식 | 설명 |
|---|---|
| ++피연산자 | 피연산자의 값을 1 증가시킴 |
| --피연산자 | 피연산자의 값을 1 감소시킴 |
| 피연산자++ | 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴 |
| 피연산자-- | 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴 |
| 연산식 | 설명 |
|---|---|
| x + y | 덧셈 연산 |
| x - y | 뺄셈 연산 |
| x * y | 곱셈 연산 |
| x / y | 나눗셈 연산 |
| x % y | 나눗셈의 나머지를 산출 |
산술 연산의 특징
int 타입이다.long 타입이면 연산의 결과는 long타입이다.산술 연산을 정확하게 계산하고 싶다면 실수 타입을 사용하지 않는 것이 좋다. (부동 소수점 방식 때문)
오버플로우
- 타입이 허용하는 최대값을 벗어나는 것
언더플로우
- 타입이 허용하는 최소값을 벗어나는 것
정수 타입 연산에서 오버플로우 또는 언더플로우가 발생되면,
해당 정수 타입의 최소값 또는 최대값으로 되돌아간다.
ex) byte 타입일 경우, 최대값 127에서 1을 더하면 -128이 된다.
최소값 -128에서 1을 빼면 127이 된다.
만약 연산 과정에서 int 타입에서 오버플로우 또는 언더플로우 발생 가능성이 있다면, long 타입으로 연산하도록 해야 한다.
정수 / 0, 정수 % 0일 때 ArithmeticException이 발생한다.
(무한대의 값을 정수로 표현할 수 없기 때문)
실수 /(%) x, x /(%) 0.0(0.0f)일 때 예외가 발생하지 않고, 연산의 결과는 Infinity 또는 NaN이 된다.
이를 확인하는 메소드
Double.isInfinite()Double.isNaN()동등(==, !=), 크기(<, <=, >, >=)를 평가 ->
trueorfalse
문자열 비교 시 동등 연산자 대신
equals()와!equals()사용
피연산자의 타입이 다를 경우 비교 연산을 수행하기 전에 타입을 일치시킨다.
0.1f == 0.1는 false이다.0.1f == (float) 0.1이 바람직하다 -> true| 구분 | 연산식 | 설명 |
|---|---|---|
| AND(논리곱) | && 또는 & | |
| OR(논리합) | || 또는 | | |
| XOR(배타적 논리합) | ^ | 하나는 t, 하나는 f일 때 true |
| NOT(논리 부정) | ! |
&&와 &의 차이
&&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false를 산출&는 두 피연산자를 모두 평가해서 산출 결과를 냄&&가 더 효율적으로 동작함(||도 마찬가지) bit 단위로 논리 연산을 수행한다.
0과 1이 피연산자가 된다.
따라서 2진수 0과 1로 저장되는 정수 타입(byte, short, int, long)만 피연산자가 될 수 있다.
| 구분 | 연산식 | 설명 |
|---|---|---|
| AND(논리곱) | & | 두 비트 모두 1 -> 1 |
| OR(논리합) | | | 두 비트 중 하나만 1 -> 1 |
| XOR(배타적 논리합) | ^ | 하나는 1, 다른 하나는 0 -> 1 |
| NOT(논리 부정) | ~ | 보수 |
byte, short, char 타입 피연산자를 int 타입으로 자동 변환한 후 연산 수행
-> 연산 결과도 int 타입
이게 왜 필요한가?
Byte.toUnsignedInt() 메소드를 사용해도 됨비트 연산자에는 논리 연산자와 이동 연산자가 있다.
비트 이동 연산자는 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다.

대입 연산자는 우측 피연산자의 값을 좌측 피연산자인 변수에 대입한다.
우측 피연산자 = 리터럴, 변수, 다른 연산식이 올 수 있다.
단순 대입 연산자와 복합 대입 연산자가 있다.

삼항 연산자는 총 3개의 피연산자를 가진다.

int score = 85;
char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C');
System.out.printf("%d 점은 %c 등급 입니다.", score, grade);
()는 최우선순위를 가진다.()로 묶는 것을 추천한다.