산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
단항(1) > 이항(2) >삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
단항 연산자와 대입 연산자를 제외한 모든 연상의 진행방향은 왼쪽에서 오른쪽이다.
다음 코드는 컴파일해도 오류가 나지 않는다.
char c2 = 'a' + 1;
System.out.println(c2);
왜냐하면, 'a' + 1은 리터럴끼리의 연산이기 때문에 런타임에 값이 변하지 않는다. 그래서 컴파일러가 컴파일할 때 계산해서 그 결과로 c2를 대체한다.
char c2 = 'b'
System.out.println(c2);
따라서 두 코드는 같다.
char c1 = 'a';
char c2 = c1 + 1;
하지만 바로 위 코드는 컴파일 에러가 발생한다.
값의 손실을 줄이기 위해 c1이 int로 변환되고, c1 + 1의 결과는 int가 되는데,
char 자료형을 가진 c2에는 그 보다 큰 값의 범위를 가진 int를 저장할 수 없기 때문이다.
int time = 86400;
int time = 60 * 60 * 24;
위의 두 코드에서 숫자들은 전부 리터럴이다. 따라서 컴파일러에 의해서 미리 계산되기 때문에 실행 시의 성능차이가 없다. 코드의 가독성과 유지보수를 위해 아래 쪽의 코드를 조금 더 추천한다.
x || y 에서, x가 True라면 y를 연산하지 않는다. x && y도 마찬가지로, x가 False면 y를 연산하지 않는다.
왜냐하면 x || y 에서 x가 참이면 무조건 참이고, x && y도 x가 거짓이면 무조건 거짓이기 때문이다.
따라서 and나 or 연산자에 따라서 연산결과가 참이거나 거짓일 확률이 높은 것을 왼쪽에다 두면 연산속도가 빨라질 수 있다.
조건 연산자 ? :는 다음과 같은 형태를 가진다.
조건식 ? 식1 : 식2
조건식이 참이라면 식1을 반환하고, 거짓이면 식2를 반환한다.
int x = 3;
int y = 5;
int result = (x > y) ? x : y;
위와 같은 코드에서 x > y는 거짓이므로 result는 y, 즉 5가 된다.
조건 연산자를 여러번 중첩하면 코드가 간략해지지만 가독성이 떨어지므로 꼭 필요할 때 한 번 정도만 중첩하는 것이 좋다.
또한 식1과 식2의 자료형이 다른 경우, 자동형변환이 일어난다.