연산식에는 다양한 연산자가 복합적으로 구성된 경우가 많다. 산술 연산식에서 덧셈(+), 뺄셈(-) 연산자보다는 곱셈(*), 나눗셈(/) 연산자가 우선 처리된다는 것을 우리는 이미 알고 있다. 그러면 다른 연산자들의 경우는 어떨까? 예를 들어 다음과 같은 연산식에서 && 연산자가 먼저 처리될까 아니면 >, < 연산자가 먼저 처리될까?


x > 0 && y < 0


프로그램에서는 연산자의 연산 방향과 연산자 간의 우선순위가 정해져 있다. &&보다는 >, < 가 우선순위가 높기 때문에 x > 0과 y < 0이 먼저 처리되고, &&는 x > 0 과 y < 0의 산출값을 가지고 연산하게 된다. 그러면 우선순위가 같은 연산자들끼리는 어떤 순서로 처리가 될까? 이 경우에는 연산의 방향에 따라 달라진다. 대부분의 연산자는 왼쪽에서부터 오른쪽으로(→) 연산을 시작한다. 예를 들어 다음 연산식을 보자.


100 * 2 / 3 % 5


*, /, %는 같은 우선순위를 갖고 있다. 이 연산자들은 연산 방향이 왼쪽에서 오른쪽으로 수행된다. 100 * 2가 제일 먼저 연산되어 200이 산출되고, 그 다음 200 / 3이 연산되어 66이 산출된다. 그 다음으로 66 % 5가 연산되어 1이 나온다.

하지만 단항 연산자(++, --, ~, !), 부호 연산자(+, -), 대입 연산자(=, +=, -=, ...)는 오른쪽에서 왼쪽(←)으로 연산된다. 예를 들어 다음 연산식을 보자.


a =b = c = 5;


위 연산식은 c = 5, b= c, a = b 순서로 실행된다. 실행되고 난 후에는 a, b, c의 값이 모두 5가 된다. 이와 같이 어떤 연산자를 사용하느냐에 따라 연산의 방향과 우선순위가 정해져 있기 때문에 복잡한 연산식에서는 주의가 필요하다. 다음은 연산자의 연산 방향과 우선순위를 정리한 표이다.


연산자

연산 방향

우선순

증감(++, --), 부호(+, -), 비트(~), 논리(!)

높음

산술(*, /, %)


산술(+, -)

쉬프트(<<, >>, >>>)

비교(<, >, <=, >=, instanceof)

비교(==, !=) 

논리(&) 

논리(^) 

논리(|)

논리(&&)

논리(||)

조건(?:) 

대입(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=)

낮음


이렇게 우선순위와 연산 방향이 정해져 있다 하더라도 여러 가지 연산자들이 섞여 있다면 어느 연산자가 먼저 처리될지 매우 혼란스러울 것이다. 그래서 괄호()를 사용해서 먼저 처리해야 할 연산식을 묶는 것이 좋다. 예를 들어 다음 산술 연산식을 ①이 먼저 연산되고 ②가 나중에 연산된다.


int var1 = 1;

int var2 = 3;

int var3 = 2;

int result = var1 + var2 * var3;

                               ①

                     ②


만약 var1 + var2를 먼저 연산하고 싶다면 괄호()를 사용하면 된다. 괄호 부분의 연산은 최우선순위를 갖기 때문에 다른 연산자보다 우선 연산된다.


int result = (var1 + var2) * var3;

                       ①

                                ②


지금까지 연산의 방향과 우선순위를 정리하면 다음과 같다.


1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.

2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.

3. 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다(→).

4. 복잡한 연산식에는 괄호()를 사용해서 우선순위를 정해준다.

+ Recent posts