티스토리 뷰
연산의 과정에서는 다양한 연산자가 복잡하게 혼합된 경우가 많다. 우리는 이미 사칙 연산에서의 우선순위를 잘 알고 있다. 덧셈 뺄셈보다는 곱셈 나눗셈이 선 순위이다. 그러면 자바에서 다른 연산자들 끼리는 우선 순위가 어떨까? 다음과 같은 연산에서 누가 더 우선일까?
x > 0 && y < 0
&&연산이 먼저인가 아님 > , < 연산이 우선인가 자바 프로그램에서는 연산자의 연산 방향과 연산 순위가 이미 정해져 있다. 논리 연산자 && 보다는 비교 연산자 > , < 가 우선이다. 따라서 , 비교 연산을 먼저 수행하고 x > 0 , y < 0 에서 나오는 값을 && 연산한다. 그러면 순위가 동일한 연산자간에는 어떨까? 이 것은 연산의 방향에 따라 다르다. 자바에서는 일반적으로 동일한 순위의 연산은 좌측에서 우측으로 연산을 한다. 예컨대 , 다음 연산을 보자.
30*2 /3 %5
위 연산에서 * , / , % 은 모두 동일한 연산 순위를 갖고 있다. 이런 경우 위에서 언급한 것 처럼 왼쪽에서 오른쪽으로 연산 한다. 따라서 30 * 2 가 먼저 연산 되어 60이 나오고 그 후 60/3 이 연산 되어 20 이 산출되고 20%5 가 연산 되어 0이 나온다.
그러나 , ++ , -- , ! , ~ 같은 단항 연산자 , 부호 연산자(+ ,-) , 대입 연산자 ( = ,+= , -= 기타 등등) 는 우측에서 좌측으로 연산 한다.
x = y = z = 5 ;
위 연산은 z = 5 , y = z . x = y 순으로 연산이 된다. 따라서 x ,y .z 값은 모두 5 이다. 이처럼 연산자에 따라 연산의 순위와 방향이 틀려질 수 있으므로 조심 해서 연산해야 한다. 연산의 우선 순위와 방향에 관하여 표로 정리 하여 보자.
연산자 |
연산 순위 |
연산 방향 |
증감(++,--),부호(+,-),비트(~),논리(!) |
1 |
오른쪽에서 왼쪽으로 |
산술(*,/,%) |
2 |
왼쪽에서 오른쪽으로 |
산술(+,-) |
3 |
왼쪽에서 오른쪽으로 |
shift(<<,>>,>>>) |
4 |
왼쪽에서 오른쪽으로 |
비교(<.>,<=,=>,instance of) |
5 |
왼쪽에서 오른쪽으로 |
동등비교(==,!=) |
6 |
왼쪽에서 오른쪽으로 |
논리(&) |
7 |
왼쪽에서 오른쪽으로 |
논리(^) |
8 |
왼쪽에서 오른쪽으로 |
논리(!) |
9 |
왼쪽에서 오른쪽으로 |
논리(&&) |
10 |
왼쪽에서 오른쪽으로 |
논리(||) |
11 |
왼쪽에서 오른쪽으로 |
조건(?) |
12 |
왼쪽에서 오른쪽으로 |
대입(=,+=,-=,/=....기타 등등) |
13 |
오른쪽에서 왼쪽으로 |
위 포와 같이 자바에선 우선 순위와 방향이 정해져 있다. 그러나 , 복잡하게 연산자들이 혼합되 있다면 어떤 연산을 우선 해야 할지 곤란할 때가 종종 있다.
이럴 경우에는 ( )를 이용해서 우선 순위를 처리하는 것이 좋다.
int number 1 = 1 ;
int number 2 = 1 ;
int number 3 = 1 ;
int result = number 1 + number 2 * number 3 ;
위 코드에서 number 2 * number 3 가 먼저 연산 된 후에 그 연산 값과 number 3 의 + 연산이 수행 된다. 그런데 , number 1 + number 2 를 먼저 연산하고 싶다면 ( )를 이용 하여 (number 1 + number 2 )와 같이 묶는다면 * 연산보다 우선 연산 된다.
요약을 해보면 다음과 같다.
- 연산은 단항 , 이항 , 삼항 순서로 연산이 된다.
- 산술 ,비교, 논리,대입 연산자 순서로 연산이 된다.
- 단항 연산자 와 대입 연산자를 제외 하고 나머지 모든 연산자는 좌측에서 우측으로 연산을 한다.
- 연산이 복잡할 경우 ( )를 이용하여 연산 순위를 정해 줄 수 있다
'IT > Java' 카테고리의 다른 글
단항 연산자 (2) (0) | 2020.04.13 |
---|---|
단항 연산자 (1) (0) | 2020.04.12 |
자바 연산자 (0) | 2020.04.10 |
타입 변환(형 변환) (0) | 2020.04.08 |
데이터 타입(data type) (0) | 2020.04.08 |