프로그래밍에서 사용하는 연산자는 대부분 비슷비슷하다. Java의 경우 C언어로부터 파생된 언어라 최근 각광받는 Python에 비해 옛날에 사용하던 연산자가 조금 더 추가되어 있긴 하지만 원리만 제대로 기억한다면 크게 어려운 내용은 아니다. 이번 포스팅에서는 Java에서 사용하는 연산자의 구분 및 연산자 사용과 관련한 내용에 대해 작성해보려 한다.
1. Java의 연산자
Java의 연산자는 여러 종류로 나뉜다. 연산에 사용하는 피 연산자의 수에 따라 단항, 이항, 삼항 연산자로 분류할 수 있으며, 연산 기호에 따라 산술, 비교, 논리, 대입 연산자로 나뉜다.
2. 피연산자 수에 따른 연산자 종류
(1) 단항 연산자
단항 연산자는 하나의 피연산자에 연산 기호가 붙는 형태를 띈다. 주로 음수 및 양수의 선언 시 많이 볼 수 있는 형태다.
단항 연산자의 종류는 양/음수를 표시할 때 사용하는 +/- 뿐만 아니라 ++, --, ! 가 있다. 큰 범주에서 Type Casting 시 사용하는 괄호 및 변수형 타입 역시 단항 연산자로 볼 수 있다.
위의 예시를 보면 알겠지만, 단항 연산자는 하나의 피연산 값을 변경해야 할 필요가 있을 때 사용한다. 컴퓨터가 태동했을 무렵의 프로그래밍 언어에서는 이러한 단항 연산 기능을 제공하지 않았기 때문에 지금처럼 단순히 - 부호만 붙여도 되는 것을 a = a * (-1) 과 같은 형태로 수정해야 했다.
단항 연산자 중 부호를 지정할 때 사용하는 +/-는 초등 수학만 배웠더라도 충분히 알 수 있는 내용이라 설명할 것이 없다. 따라서, 부호지정 연산자를 제외한 나머지 단항 연산자에 대해 간략히 설명하고 넘어가려 한다.
* 증감 연산자: ++, --
증감 연산자는 하나의 정수형 변수 또는 값에 1을 더하거나(++) 빼는(--) 연산이다. 이 역시 이항 연산형태(a = a + 1) 사용의 번거로움을 해결하기 때문에 종종 사용된다. 참고로 Python은 증감연산자를 제공하지 않기 때문에 이항 연산형태를 사용하거나 대입연산자를 사용하여 값을 수정한다.
증감 연산자는 변수의 앞 또는 뒤에 붙여 사용할 수 있다. 앞과 뒤에 붙는 경우 결과가 조금씩 다르다. 앞에 증감 연산자가 사용되는 경우 어떠한 연산보다 단항 연산이 먼저 진행되나, 뒤에 증감 연산자가 사용되는 경우 일반 연산이 먼저 진행된다.
* 비트 연산자: ~
비트 연산자는 정수형 변수를 bit로 변환하여 진행하는 연산의 일종이다. 그 중 ~는 비트값에 대해 부정하는 연산자다. 만약 byte 변수에 선언된 8이라는 값에 대해 ~8 연산을 진행하면 -9 값이 나타나는데, 00001000의 부정 값이 11110111, -9이기 때문이다.
양수에 대해 ~ 연산을 진행하는 경우 -1을 곱한 값에서 1을 빼면 되며, 음수에 대한 연산을 진행하는 경우 1 값을 더한 후 -1 값을 곱하면 된다.
* 논리 부정 연산자: !
논리부정연산자는 이름에서도 알 수 있듯이 논리형 변수에 대한 부정을 진행하는 연산자다. 논리형 변수는 리터럴(값)로 true와 false를 가질 수 있는데, !는 true 값을 false로, false 값을 true로 변경하는 연산자다.
(2) 이항 연산자
이항 연산자는 말 그대로 피연산 변수 2개에 사용하는 연산을 말한다. 흔히 우리가 산수에 사용하는 덧셈, 뺄셈, 곱셈, 나눗셈 및 나머지를 구하는 산술 연산자, 비트(bit) 연산에 사용되는 비트 연산자, 비교연산자와 논리 연산자 일부가 이항 연산자로 분류된다.
단항 연산자와 마찬가지로, 산술 연산은 매우 기초적인 상식 부분이기 때문에 마찬가지로 이 포스팅에서 언급하지 않을 것이며, 비트, 비교 및 논리 연산자에 대해 간략히 알아보려 한다.
* 비트 연산자1 : <<, >>
<<와 >> 연산자는 정수형 변수에서 2 또는 1/2의 제곱승(^n) 값을 계산하는데 사용한다(n은 정수다). 위의 예시의 식 9 << 3은 아래와 같은 절차를 거쳐 72라는 값을 출력한다.
9 x 2^3 = 72
위의 그림은 보면 알겠지만 비트 연산자 <<와 >> 는 정수형 비트를 각각 한 칸 씩 오른쪽 / 왼쪽으로 이동시키는 연산자다. 이 연산자 뒤의 피연산 정수는 비트 연산을 몇 번 진행할 것인지를 나타낸다.
양수, 음수에 상관없이 << n 는 2의 n승값을 곱하고, >> n은 (1/2)^n 값을 곱하면 된다.
여기서 "산술 연산을 사용하면 될 것을 굳이 어려운 비트 연산까지 만든 이유가 뭔가요?" 라고 묻는 분들이 있을 듯 하다. PC는 0과 1로 이루어진 문구를 가장 잘 이해하는 장치다 보니, 비트 연산을 사용하면 연산에 사용되는 불필요한 메모리 사용이 사라지며, 그만큼 연산 속도가 빨라지게 된다. 이 포스팅에서 관련 내용을 확인해보자.
* 비트연산자2: &, |, ^
비트 연산자 &, |, ^는 각각 AND, OR, NOR을 의미하는 연산자다. 이 연산자는 정수의 비트 자리수에 지정된 true(1), false(0)에 대한 연산을 진행하는 것이라 생각하면 편한다.
AND(&)는 연산되는 두 값이 모두 1인 경우 결과로 1을 반환하는 연산이다. 따라서 1 & 1 연산은 1을 반환하며, 그 외의 나머지 연산은 모두 0을 반환한다.
OR(|)는 연산되는 두 값 중 하나라도 1인 경우 결과로 1을 반환하는 연산이다. 따라서 0 | 0 연산은 0을 반환하며, 그 외의 나머지 연산은 모두 1을 반환한다.
NOR(^)는 연산되는 두 값이 같은 경우에만 1 값을 반환한다. 따라서 0 ^ 0 또는 1 ^ 1만 결과로 1이 반환되고 나머지 연산은 모두 0을 반환한다.
만약 5와 7이라는 값에 대해 AND(&) 연산을 진행하는 경우, 아래와 같이 연산이 진행된다.
반면 두 값에 대해 OR(|) 연산을 진행하는 경우, 비트의 두 번 째 자리수 연산 결과가 0이 아닌 1로 변경되기 때문에 결과가 7이 나오게 된다.
동일한 방식으로 NOR(^) 연산을 진행할 수 있으며, NOR 연산 결과는 2로 반환된다.
* 비교 연산자: <, >, <=, >=, ==, !=
비교 연산자도 사실 초등 수학을 이해한 분들이라면 내용 상으로는 큰 어려움이 없는 연산이다. 하지만 프로그래밍에서 사용하는 연산 기호에 조금 익숙해질 필요가 있다. 관련 내용에 대해서는 간단히 작성만 하고 넘어가려하는데, 추후 포스팅할 조건 식에서 이와 관련있는 코드를 많이 작성할 예정이기 때문이다.
- a < b : a가 b보다 작은가?
- a > b : a가 b보다 큰가?
- a <= b : a가 b보다 작거나 같은가?
- a >= b : a가 b보다 크거나 같은가?
- a == b : a와 b가 같은가?
- a != b : a와 b가 같지 않은가?
비교 연산자의 반환값은 true와 false다.
* 논리연산자: &&, ||
논리연산자는 비교연산자 결과, 즉 boolean 자료형에 대한 연산을 진행한다. &&(AND)는 피연산값이 모두 true일 경우 true를, 나머지 연산은 false를 반환한다. 반면 ||(OR)는 피연산값 중 하나만 true라더라도 true를 반환한다. 비교연산자와 마찬가지로 논리연산 역시 조건식에서 많이 다룰 예정이다. 아래의 예시를 통해 논리연산자에 대해 간략히 알아보자.
* 대입 연산자: =, +=, -=, *=, /=, <<=, >>=
대입 연산자는 연산값을 변수에 저장할 때 사용하는 연산자다. 가장 쉽게 볼 수 있는 대입 연산자는 equal(=) 기호다. 프로그래밍에서는 equal 외에도 equal 기호 앞에 산술 및 비트연산자 <<, >>를 추가하여, 기존 변수에 추가 연산을 진행한 값을 저장하는 것도 가능하다.
(3) 삼항 연산자
삼항 연산자는 프로그래밍 언어에서 볼 수 있는 특이한 연산자다. 조건식 또는 boolean의 참과 거짓에 따라 나타나는 결과값을 모두 표시하는 연산자다.
위의 예시를 보면 삼항 연산자는 a < b ? true: false로 표시한다. a 값이 5, b 값이 7이기 때문에 a < b는 true로 반환된다. true 인 경우 물음표 뒤의 true 값이 변수 answer에 저장되고, false인 경우 false가 변수 answer에 저장된다.
다음 포스팅에서는 Java의 조건식 사용에 대해 알아보려 한다.
Fin
'Java > Java Basic' 카테고리의 다른 글
[Java Basic] 6. 루프(Loop)문 - for, while 문 (0) | 2022.06.27 |
---|---|
[Java Basic] 5. 조건식 - if, else, switch (0) | 2022.06.27 |
[Java Basic] 3. 화면 출력과 형 변환(Type Casting) (0) | 2022.06.23 |
[Java Basic] 2. 변수 선언 (0) | 2022.06.21 |
[Java Basic] 1. Java 구성 및 Java 코드의 동작 과정 (0) | 2022.06.20 |
댓글