본문 바로가기

프로그래밍/Java 프로그래밍

자바의 연산자와 연산식1

연산자와 연산식


연산에 사용되는 표시나 기호를 연산자(Operator)라고 하고 여산자와 함께 연산되는 데이터를 피연산자(Operand)라고 합니다. 연산자와 피연산자가 연산되는 과정을 기술한 것을 연산식(Expression)이라고 부릅니다.


ex) z = x + y

여기서 +는 연산자이고 x와 y는 피연산자이고 전체 문장을 연산식이라고 부릅니다.



연산자의 종류


자바 언어에서는 다양한 연산자를 제공하고 있습니다. 다음은 자바에서 제공하는 연산자입니다.


연산자 종류 

연산자 

피연산자 수 

산출값 

기능 

산술 

+, -, *, /, % 

이항 

숫자 

사칙연산 및 나머지 계산 

부호 

+, - 

단항 

숫자 

음수와 양수의 부호 

문자열 

이항 

문자열 

두 문자열을 연결 

대입 

=, +=, -=, *=, /=, %= 

이항 

다양 

우변의 값을 좌변의 변수에 대입 

 증감

++, -- 

단항 

숫자 

1만큼 증가/감소 

비교 

==, !=, >, <, >=, <=, instanceof 

이항

boolean 

값의 비교 

논리 

!, &, !, &&, !! 

단항

이항 

boolean 

논리 부정, 논리곱, 논리합 

조건 

(조건식) ? A : B 

삼항 

다양 

조건식에 따라 A 또는 B 중 하나를 선택 



연산식은 반드시 하나의 값을 산출합니다. 연산자 수가 아무리 많아도 2개 이상의 값을 산출하는 연산식은 없습니다. 그렇기 때문에 하나의 값이 올 수 있는 곳이면 어디든지 값대신에 연산식을 사용할 수 있습니다.



연산의 방향과 우선순위


연산식에는 다양한 연산자가 복합적으로 구성된 경우가 많습니다. 산술 연산식에서 덧셈(+), 뺄셈(-) 연산자보다는 곱셈(*), 나눗셈(/) 연산자가 우선 처리된다는 것을 우리는 이미 알고 있습니다. 그러면 다른 연산자들의 경우는 어떨까요? 연산자 우선순위는 연산식에서 굉장히 중요합니다. 우선순위에 따라 결과가 달라집니다. 그래서 우리는 연산자 우선순위에 대해 정확히 알아둘 필요가 있습니다.


연산자 

연산방향 

우선순위 

증감(++, --), 부허(+, -), 논리(!) 

<-------

높음 

 산술(*, /, %)

-------> 

 

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

-------> 

 

비교(==, !=) 

 -------> 

 

논리( & ) 

 -------> 

 

논리( ^ ) 

 -------> 

 

논리( | ) 

 -------> 

 

논리( &&)

 -------> 

 

논리( || ) 

 -------> 

 

조건( ? : )

 ------->  

대입(=, +=, -=, *=, /=, %=)

 <-------

 낮음



위의 표에서 아래에서 위로 올라갈 수로 우선순위가 높아지고 연산방향에 따라 피연산자를 계산합니다. 표의 내용이 굉장히 중요하기는 하지만 표만봐서는 이해가 잘 되지 않을 것입니다. 위에 적어놓지는 않았지만 우선순위가 가장 높은 것은 괄호()입니다. 그래서 우선순위를 잘 모를경우는 확실히 하기위해서 괄호를 사용하면 됩니다. 몇가지 예를 들어 설명해 보겠습니다.


x > 0 && y < 0

&&보다는 >, <의 우선순위가 높기 때문에 x > 0과 y < 0이 먼저 연산되고 그다음에 &&연산을 사용합니다.


그러면 우선순위가 같은 연산자들끼리는 어떤 순서로 처리될까요? 이 경우에는 연산의 방향에 따라 다릅니다. 대부분의 연산자는 왼쪽에서 오른쪽(-->) 으로 연산이 됩니다. 연산방향의 위의 표에 표시해놨습니다. 


100 * 2 / 3 % 5

위이 연산식에 나오는 연산자는 모두 같은 우선순위를 가지고 있습니다. 그러므로 왼쪽에서부터 오른쪽으로 연산이 됩니다. 그래서 우선 100 * 2가 계산되어 200이 나오고 200 을 3으로 나눠서 66이 나옵니다. 66을 %를 이용하여 나머지를 계산하면 1이 나옵니다.



단항 연산자


단항 연산자는 피연산자가 단 하나뿐인 연산자를 말하며, 여기에는 부호 연산자(+, -), 증감 연산자(++, --), 논리 부정 연산자(!)가 있습니다.


부호 연산자(+, -)

부호 연산자는 양수 및 음수를 표시하는 +, -를 말합니다. boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용할 수 있습니다.

+는 변수값의 부호를 유지하고 -는 변수값의 부호를 변경하는데 사용합니다.




위의 예제에서 보듯이 result1은 x와 같지만 result2는 부호가 다릅니다. 라인 12는 주석처리를 해놓았는데 이는 byte b가 - 연산을 하면서 정수형으로 바뀌때문에 에러가 발생하기 때문입니다.


증감 연산자(++, --)


또하나의 단항연산자인 증감연산자에 대해 살펴보겠습니다. 이 연산자는 변수값을 1 증가시키거나(++) 1 감소(--) 시키는 연산자를 말합니다. boolean 타입을 제외한 모든 기본 타입의 피연산자에 사용할 수 있습니다. 그런데 이 연산자를 사용할 때 조심해야하는 점이 있습니다. 증감연산자가 피연산자의 앞에 쓰였는지 뒤에 쓰였는지에 따라 연산 순서가 바뀌기 때문입니다. 피연산자의 앞에 쓰이면 먼저 증감을 한다음에 사용을 하지만 피연산자의 뒤에 쓰이면 먼저 사용을 한다음에 증감을 합니다. 이것을 설명으로 알기는 어렵기때문에 다음 예제를 통해 살펴보도록 하겠습니다.




잘보이지 않지만 처음에 int x = 10; int y = 10; int z;로 선언되었습니다. 처음에 x를 출력하기 전에 x++와 ++x를 하였습니다. 그래서 x는 1씩 증가하여 12를 출력하게 됩니다. y는 출력하기 전에 y--와 --y를 실행하였기 때문에 8을 출력하였습니다. 여기까지는 전혀 어려운 점이 없습니다. 그러나 라인 18을 보면 z = x++; 연산식을 사용한 후에 z와 x를 출력하는데 z는 12이고 x는 13입니다. 이는 x++는 먼저 사용을 하고 증가시키기 때문입니다. 위의 출력에서 볼 수 있듯이 지금 x는 12입니다. 

z = x++; 연산식은 z = x; x++; 로 나뉠 수 있습니다. 먼저 x값을 z에 대입한 후에 증가를 합니다. 그래서 위와 같은 결과를 나타내게 됩니다. 하지만 z = ++x; 후의 출력 결과를 보면 z와 x는 모두 14를 가지고 있습니다. 이는 x++; z = x;로 나눌 수 있습니다. 2개의 연산식으로 나눠보면 쉽게 이해할 수 있습니다. 마지막 z = ++x + y++;를 보면 ++연산자가 +연산자보다 우선순위가 높으므로 ++x와 y++를 먼저하게 됩니다. ++x는 x를 1 증가 시키고 그 값을 x에 저장하므로 x값에 15를 가지게 되고 y++는 y값을 연산식에 넣고 난 후에 증가를 하게 됩니다. 그래서 15 + 8이 되고 결과값은 23이 됩니다. x는 이미 증가시켰으므로 15값을 갔지만 y는 연산식에 값을 넣고 난 후에 증가하므로 9가 됩니다. 이것은 많은 프로그래머들이 헷갈리고 있습니다. 좀 더 간단하고 깔끔하게 작성할 수는 있지만 헷갈린다면 이항 연산자를 쓰거나 문장을 분리해서 사용하도록 하는 것이 좋습니다.



논리 부정 연산자(!)


논리 부정 연산자는 true를 fase로, false를 true로 변경하기 때문에 boolean 타입에서만 사용할 수 있습니다. 논리 부정연산자는 조건문과 제어문에서 조건식의 값을 부정하도록 해서 실행 흐름을 제어할 때 주로 사용합니다.