자바 연산자 우선순위(Operator Precedence)

Java 2016. 10. 18. 21:58

Java 연산자 우선순위(Operator Precedence)

우선순위(Precedence)

우선순위는 하나의 수식에 다른 종류의 연산자들이 사용되었을때, 어떤 연산자를 먼저 계산(평가)해야하는지를 정해놓은 것이다. 가령 수학에서 덧셈과 곱셈이 사용된 수식에서 무엇을 먼저 계산하는지에 따라 결과에 큰 차이를 보이게 되는데, 이 처럼 어떤 연산을 먼저 수행해야 하는지 정해놓지 않는다면 혼란이 발생하게 된다. 프로그래밍에서도 연산자의 우선순위를 명확히 해놓아 다른 의미로 계산되는것을 방지하고 있다. 만약 우선순위를 별도로 정해놓지 않았다면 모든 연산자들과 피연사자들을 일일이 괄호로 묶어야 하는 불편함이 있을 것이다.

연산자의 우선순위는 여러 프로그래밍 언어에서와 비슷한데, 대체적으로 우선순위는 이항/삼항 연사자 보다는 단항 연산자가, 복잡한 연산자 보다는 기본적이고 필수적인 연산자가, 논리적인 연산자 보다는 산술 연산자가 우선순위가 높은것을 알 수 있다.

연산자의 우선순위가 명확히 결정 되어있다 하더라도 모든 사람들이 연산자의 우선순위를 외우고 있는것은 아니므로, 자주 쓰이는 연산자의 조합이 아니라면 혼동의 여지가 있으므로 추가적인 괄호를 사용하여 명확히 해주는것이 좋은 프로그래밍 습관일 것이다.

결합방향(Associativity)

연산자의 우선순위를 결정했다 하더라도 동일한 피연산자에 같은 우선순위의 연산자들이 사용되어있다면 피연산자에 어떤 연산자들을 먼저 결합하여 처리해야 할것인가 하는 문제가 남는다.

상식적으로 같은 우선순위에 있는 덧셈과 뺄셈중 어느것을 먼저 하던지, 곱셈과 나눗셈중 어느것을 먼저 하는지에 대해 결과가 달라질 수 있는가 싶겠지만 프로그래밍 언어에서는 자료형에서 값이 표현할 수 있는 범위가 있기 때문에 여러 연속된 연산에서 중간 계산 결과에 따라 오버플로우나 언더플로우가 나타나 연산 결과에 영향을 미치는 경우가 생길 수 있다.

결합 방향을 조정해야 할 경우 괄호를 사용해서 프로그래머의 결합 방향에 대한 의도를 표현 할 수 있다.

연산자 우선순위, 결합방향 표

Description, Level, Associativity 열의 생략된 항목은 위의 가까운 값과 같다, 같은 Level을 가지는 연산자들은 같은 우선순위를 가진다

Operator Description Level Associativity
[] access array element 1 left to right
. access object member
() invoke a method
++ post-increment
-- post-decrement
++ pre-increment 2 right to left
-- pre-decrement
+ unary plus
- unary minus
! logical NOT
~ bitwise NOT
() cast 3 right to left
new object creation
* multiplicative 4 left to right
/
%
+ - additive 5 left to right
+ string concatenation
<< >> shift 6 left to right
>>>
< <= relational type comparison 7 left to right
> >=
instanceof
== equality 8 left to right
!=
& bitwise AND 9 left to right
^ bitwise XOR 10 left to right
| bitwise OR 11 left to right
&& conditional AND 12 left to right
|| conditional OR 13 left to right
?: conditional 14 right to left
= += -= assignment 15 right to left
*= /= %=
&= ^= |=
<<= >>= >>>=

2016-10-20 오후 6:13:38

'Java' 카테고리의 다른 글

자바 컴파일시 인코딩 문제  (0) 2016.10.14

설정

트랙백

댓글