연산자 : 연산을 수행하는 기호(+, -, *, / 등등)
피연산자 : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
| 종류 | 결합규칙 | 연산자 | 우선순위 |
|---|---|---|---|
| 단항 연산자 | <ㅡㅡ | ++ -- + - ~ ! (type) | 높음 |
| 산술 연산자 | ㅡㅡ> | * / % | |
| ㅡㅡ> | + - | ||
| ㅡㅡ> | << >> | ||
| 비교 연산자 | ㅡㅡ> | < > <= >= instanceof | |
| ㅡㅡ> | == != | ||
| 논리 연산자 | ㅡㅡ> | & | |
| ㅡㅡ> | ^ | ||
| ㅡㅡ> | | | ||
| ㅡㅡ> | && | ||
| ㅡㅡ> | || | ||
| 삼항 연산자 | ㅡㅡ> | ?: | |
| 대입 연산자 | <ㅡㅡ | = += -= *= /= %= <<== >>== &= ^= |= | 낮음 |
+와 -는 부호연산자이고, (type)은 형변환 연산자이다instanceof는 객체의 타입을 확인하는 연산자이다.
- 산술 > 비교 > 논리 > 대입 순으로 실행. 대입은 제일 마지막에 수행된다.
- 단항 > 이항 > 삼항 순으로 실행. 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
++ --증감 연산자가 피연산자의 어느 쪽에 붙느냐에 따라 결과가 다르다.
public class Main {
public static void main(String[] args) {
int i=5; j=0;
j = i++;
System.out.println("i=" + i + ", j=" + j);
i=5; // 결과 비교 위해 처음 값으로 변경
j=0;
j = ++i;
System.out.println("i=" + i + ", j=" + j);
}
}
결과는 위의 식은 i=6, j=5 가 나오고 아래 식은 i=6, j=6 이 나온다.
증감 연산자를 사용하면 코드가 간결해지지만, 과해진다면 오히려 이해하기 어려워진다.
int x=5;
x = x++ - ++x;
이렇게 하나의 식에 여러 번을 작성하는 것을 바람직하지 않다.
산술 연산자에는 사칙 연산자(+, -, *, /)와 나머지 연산자(%)가 있다.
산술 연산자는 일상생활에서 자주 사용하는 익숙한 것이라 주의할 것들 몇개만 짚고 가려한다.
System.out.println(3/0); // 실행하면 오류(ArithmeticException) 발생
0.0f 나 0.0d 로 나누는 것은 가능하다. System.out.println(3/0.0f); // Infinity 가 출력됨.
int 타입인 경우, 연산결과 역시 int 타입이다.int 타입의 값인 2를 얻는다. byte a = 10;
byte b = 20;
byte c = a + b; // 값 손실 오류 발생
System.out.println(c);
a와 b는 int형보다 작은 byte형이기 자료형이 int형으로 변환된다.a+b의 결과가 byte가 아닌 int이기 때문에 타입 에러가 나는 것이다. byte a = 10;
byte b = 20;
byte c = (byte)(a * b);
System.out.println(c);
위의 코드의 결과는 44 가 나온다. 결과값으로 300 이 나와야 하지만 형변환에서 배운 것처럼 int형에서 byte형으로 형변환을 했기 때문에 값 손실이 발생하기 때문이다.
int a= 1_000_000;
int b = 2_000_000;
long c = a * b; // a * b = 2,000,000,000,000 ??
System.out.println(c);
long 타입은 2 * 1012를 저장하기 충분하기에 그대로 출력되는 것을 예상한다.int타입과 int타입의 연산 결과는 int타입이기 때문에int 타입의 값이므로 long형으로 자동 형변환되어도 값은 변하지 않는다. int a= 1_000_000;
int b = 2_000_000;
long c = (long)a * b;
System.out.println(c);
의도하는 결과를 얻기 위해서는 연산 식에서 형변환을 시켜주어야 한다.
char c1 = 'a';
char c2 = c1 + 1; // 라인 2 컴파일 에러;
char c2 = 'a' + 1; // 라인 3
c1++; // 라인 4
int형으로 자동 변환되어 값 손실 오류가 발생조건 연산자는 조건식, 식1, 식2, 세 개의 피연산자를 필요로 하는 삼항 연산자이다.
true 이면 식1이, false이면 식2가 수행된다. if(x > y) {
result = x;
} else {
result = y;
}
x와 y의 값을 비교해 큰 값을 result에 넣는 식이다.
이 식을 조건 연산자로 바꾸면 훨씬 간략하게 쓸 수 있다.
result = (x > y) ? x : y;
true라면( x 가 크다면) x 가 result로 저장false라면 y 가 result로 저장