티스토리 뷰

안녕하세요. 오늘은 Java를 공부하면서 기본적인 '연산자'에 대해서 연산자가 무엇인지, 그 종류 및 연산자 우선순위에 대해서 포스팅해보려고 합니다.


1. 연산자란?


어떠한 기능 또는 어떤 대상체에 계산과 같은 처리를 수행하는 문자 또는 기호라고 볼 수 있습니다. Java에서의 연산자는 크게 단항, 이항, 삼항, 대입 연산자로 나뉘며, 이항 연산자는 산술, 비교, 논리 연산자로 나뉠 수 있습니다.


- 연산자(operator) : 어떠한 기능을 수행하는 기호 (ex +, -, *, / 등)

- 피연산자(operand) : 연산자의 작업 대상 (ex 변수, 상수, 수식 등)



2. 연산자의 종류


- 단항 연산자 : +, -, ~, ! 

피연산자가 오직 하나만 필요한 연산자이며, !는 현재 논리값을 부정하는 의미이며, true일 경우 false로 false일 경우 true로 반환합니다. ~는 부정 연산자이며 연산을 할때 피연산자를 int형으로 변화시키고 0은 1로 1은 0으로 바꾸는 역할을 합니다. 일반적으로 +1 -> -1, -1 -> +1의 값으로 데이터의 손실이 없을 경우 변환됩니다.


증감 연산자 : ++, --


- 증가 연산자(++) : 피연산자의 값을 1 증가시킵니다.

- 감소 연산자(--) : 피연산자의 값을 1 감소시킵니다.

 전위형

j = ++i;

++i;

j = i 

값이 참조되기 전에 증가시킵니다. 

 후위형

j = i++; 

j = i

i++; 

 값이 참조된 후에 증가시킵니다.



- 이항 연산자

1) 산술 연산자 : +, -, *, /, %

기본적인 사칙연산과 나머지 연산을 하는 가장 기본이 되는 연산자입니다., +, -는 값을 원하는 만큼 더하고 빼는 역할을 하고, *, / 각각 곱셉과 나눗셈을 나타내고 %는 나머지를 반환해주는 연산자입니다.


시프트 연산자 : <<, >>, >>>

시프트 연산자는 변수나 어떤 수의 비트를 이동시키는 연산자입니다. << 는 대상을 이진수로 바꾼 후 왼쪽으로 비트들을 옮기는 작업을 수행합니다. 이 때 빈 자리는 0의 값으로 채웁니다. ~처럼 비트를 직접 다루기 때문에 모든 변수 타입을 int형으로 변환한 후에 사용됩니다. >> 또한, 대상을 이진수로 바꾼 후 오른쪽으로 비트들을 옮기는 작업을 수행합니다. 마찬가지로 빈 자리는 0의 값으로 채웁니다. 마지막으로 >>>는 기본적으로 >>와 원리는 같습니다. 그러나 원 데이터가 -(음수)일 경우에도 앞쪽 비트를 0의 값으로 채웁니다. 오로지 양수 값만 다룰 수 있습니다.


2) 비교(관계) 연산자 : >, <, >=, <=, ==, !=

연산자의 왼쪽과 오른쪽의 피연산자들의 크기 관계를 비교하여 참과 거짓을 가리는 연산자입니다. <, >, <=, >= 는 순서대로 미만, 초과, 이하, 이상을 나타내며, ==, !=의 경우에는 두 피연산자의 값이 같은지 다른지 참 또는 거짓을 판별합니다.


3) 논리 연산자 : &&, ||

논리연산자에는 &&는 두 피연산자의 값이 모두 true일 경우에 true 값을, 하나라도 false일 경우에는 false 값을 결과로 반환해줍니다. ||는 두 피연산자 중 하나라도 true일 경우 true 값을 반환합니다. 여기에 비트 연산자(& ^, |)도 포함 되는데 이진수로 변화되어 작업을 수행하는 연산자입니다.


비트 연산자 : &, ^, |

& (and연산자) : 두개의 피연산자 모두 1이어야 결과값 1을 얻습니다. 그외에는 결과값 0 을 얻습니다.

ex) 0000 0000 0000 0000 0000 0000 0000 0110 = 6 & 0000 0000 0000 0000 0000 0000 0000 0100의 결과는

0000 0000 0000 0000 0000 0000 0000 0100 = 4의 결과를 반환합니다.


    - | (or연산자) : 두개의 피연산자중 한개의 피연산자 값이 1이면 결과값은 1입니다. 그외에는 결과값 0 을 얻습니다.

ex) 000 0000 0000 0000 0000 0000 0000 0111 = 7 | 0000 0000 0000 0000 0000 0000 0000 0100 = 4의 결과는

000 0000 0000 0000 0000 0000 0000 0111 = 7의 결과를 반환합니다.

           

           - ^ (xor연산자) : 두개의 피연산자의 값이 서로 다를때만 결과값 1을 얻습니다. 같을때는 0을 얻습니다. 

  ex) 0000 0000 0000 0000 0000 0000 0000 0111 = 7 ^ 0000 0000 0000 0000 0000 0000 0000 0100 = 4의 결과는

0000 0000 0000 0000 0000 0000 0000 0011 = 3의 결과를 반환합니다.


~ (not연산자) : 각 비트를 반전 시킨 값을 반환합니다. 

  ex)  var a = 0111 = 7일때 ~a의 결과는 1000 = -8의 결과를 반환합니다.


- 삼항 연산자 : ?, :

유일하게 세 개의 항으로 만들어져 있는 연산자입니다. 사용 방법으로는 조건항 ? 항1 : 항2 의 구조로 사용되는데 조건항이 참일 경우 항1의 값을 반환하고, 조건항이 거짓일 경우 항2의 값을 반환합니다. 

ex) int a = 10, int b = 20 일때, a>b ? a : b; 이면 조건항이 거짓이 되기 때문에 b를 반환합니다.


- 대입 연산자 : =

말 그대로 값을 변수에 대입하는 대입 연산자입니다. ex) int a = 10은 10의 값을 int형 변수 a에 대입한다는 의미입니다.



3. 연산자 우선순위


기본적으로 연산자에는 우선순위가 있으며, 괄호의 우선순위가 제일 높고, 산술 > 비교 > 논리 > 대입의 순서이며, 단항 > 이항 > 삼항의 순서입니다. 연산자의 연산 진행방향은 왼쪽에서 오른쪽으로 수행되며, 단항 연산자와 대입 연산자의 경우에는 오른쪽에서 왼쪽으로 수행됩니다.


기본 연산자 우선순위의 도표는 아래와 같습니다.


이상으로 자바에서의 기본적인 연산자 및 연산자 우선순위에 대한 포스팅을 마치도록 하겠습니다.