연산자
연산자는 '연산을 수행하는 기호'를 말한다.
java에서는 사칙연산을 비롯해서 다양한 연산자를 제공하는데 이러한 연산자가 연산을 수행하려면 대상이 있어야 한다.
이것을 '피연산자(operand)'라고 한다.
연산자 : 연산을 수행하는 기호 ( + , - , * , / , % 등)
피연산자 : 연산자의 작업 대상 (변수, 상수, 리터럴, 수식)
연산자의 개수를 보면 많지만 비슷한 것들끼리 종류별로 묶으면 많지 않다.
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >> | 사칙 연산과 나머지 연산(%) |
비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! & | ^ ~ | 그리고(AND)와 또는(OR)으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기 타 | (type) ? : instanceof | 형변환 연산자, 삼항 연산자, instanceof연산자 |
# 피연산자의 분류
: 피연산자의 개수가 1개면 단항 연산자, 2개면 이항 연산자, 3개면 삼항연산자라고 한다.
- 2 - 5
여기서 '-2'의 '-'는 부호연산자
'-2' 와 '5' 사이의 '-' 는 뺄셈(산술) 연산자
여기서 피 연산자는 '-2' 와 '5' 이렇게 두 개이다.
연산자의 우선순위
식에 사용된 연산자가 둘 이상인 경우에는 연산자의 우선순위에 의해서 연산 순서가 결정됩니다.
우리가 일상에서 마주하는 연산자와 다를게 없으니 겁먹을 필요가 1도 없습니다.
식 | 설명 |
-x +3 | 단항 연산자가 이항 연산자보다 우선순위가 높다 → x의 부호를 먼저 바꾸고 덧셈 수행 |
x + 5 * y | 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다. |
x + 1 > y - 2 | 비교 연산자보다 산술 연산자가 먼저 수행된다 |
x > 1 && x <5 | 논리 연산자'&&'보다 비교 연산자'<'가 먼저 수행된다. |
result = x + y * 3 | 대입 연산자는 우선순위가 가장 낮다. |
단항 연산자
1. 증감 연산자
증감연산자는 피연산자에 저장된 값을 증가 또는 감소시키는 역할을 한다. (상수는 불가능)
피연산자로는 정수와 실수가 모두 가능하지만, 상수는 값을 변경할 수 없으므로 불가능하다.
또 증감연산자는 변수에만 사용되는 단항연산자이다
- 증가 연산자 (++) - 피연산자의 값을 1 증가
- 감소 연산자 ( -- ) - 피연산자의 값을 1 감소
증감연산자는 단항 연산자이지만 증감연산자는 양쪽 모두에 붙일 수 있다.
피연산자의 왼쪽에 붙으면 전위형, 오른쪽에 붙으면 후위형이라고 한다.
타입 | 설명 | ex |
전위형 | 값이 참조되기 전에 증가 | a = ++i; |
후위형 | 값이 참조 된 후에 증가 | a = i++; |
- 전위형(prefix)은 증가연산이 먼저 되고 할당이 된다.
- 후위형(postfix)은 변수가 먼저 할당이 되고 증가연산이 후에 이루어 진다.
이렇게 증감연산자는 연산의 순서를 잘 생각하여 코드를 작성해야 한다.
2. 부호 연산자(+, -)
부호연산자는 boolean 과 char 를 제외한 기본형에만 사용 가능
: - 는 부호를 반대로 변경한 결과를 반환 (음수 → 양수 / 양수 → 음수)
산술 연산자 ( + - * / % )
주의할 점
/ 와 % 는 0으로 나눌 수 없다.
% 는 나머지 연산자로 몫으로 나눈 나머지를 반환한다. ex) 5 % 2 = 1
나누는 수로 음수도 허용되지만 부호는 무시된다.
비트 연산자 ( & | ^ ~ >> << )
1. 비트 논리연산자 ( & | ^ )
비트단위로 연산한 값을 반환하고 실수는 허용하지 않는다. (정수와 문자만 허용)
| 는 OR 연산, & 는 AND 연산, ^ 는 XOR 연산(서로 다를 때만 참)을 수행한다.
X | Y | X | Y | X & Y | X ^ Y |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
2. 비트 전환연산자 ( ~ )
피연산자를 2진수로 표현했을 때 0은 1로, 1은 0으로 바꾼다.
X | ~ X |
1 | 0 |
0 | 1 |
3. 쉬프트 연산자 ( << >> )
<<
- 부호에 상관없이 2진수를 표현한 값들을 왼쪽으로 2자리 이동
- 자리에서 벗어난 값들은 버려지고 빈자리는 0으로 채움
ex ) 8 << 2
00001000 → 00100000 → 32
>>
- 부호를 유지한 채 양수인 경우 0, 음수인 경우는 빈자리를 1로 채운다.
ex ) - 8 >> 2
11111000 → 11111110 → - 2
ex > 8 >> 2
00001000 → 00000010 → 2
비교 연산자
" 비교 연산자 : 값 간의 비교 (논리) "
" 비교연산자 자체로 하나의 조건 "
비교 연산자는 주로 조건문과 반복문의 조건식에 사용되고 연산 결과는 논리형 true와 false로 이루어 진다.
비교 연산자는 이항 연산자이다. 그러므로 피연산자의 타입이 서로 같아야 하고 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 현 변환되어 피연산자의 타입을 일치시키고 난 후에 비교한다.
비교 연산자는 아래와 같이 대소비교 연산자( <, <=, >, >= )와 등가비교 연산자(==, !=)로 나누어 볼 수 있다.
-
대소비교 연산자
대소비교 연산자 | 연산 결과 |
> | 좌변 값이 크면 true 아니면 false |
< | 좌변 값이 작으면 true 아니면 false |
>= | 좌변 값이 크거나 같으면 true 아니면 false |
<= | 좌변 값이 작거나 같으면 true 아니면 false |
-
등가비교 연산자
등가비교 연산자 | 연산 결과 |
== | 두 값이 같으면 true |
!= | 두 값이 다르면 true |
논리 연산자
" 조건이 여러 개가 있을 때 조합하는 방법 "
- 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식 만을 허용한다.
- 연산의 결과는 boolean
- && - 하나라도 거짓이 있으면 거짓
- || - 하나라도 참이 있으면 참
- ! - 반대(반전) 표현 : 단항에도 붙을 수 있고 다항연산보다 먼저 실행
&& (AND 결합) | 피연산자 양쪽 모두 true이어야 true |
|| (OR 결합) | 피연산자 중 어느 한 쪽이 true이면 true |
! (논리부정 연산자) | 피연산자가 true이면 false로, false이면 true로 반대로 바꾸는 것 |
1. x는 30보다 크고 50보다 작다.
2. x는 2의 배소 또는 3의 배수이다.
3. x는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
- 위에서 괄호를 사용한 이유는 '&&'가 '||'보다 우선순위가 높기 때문이고 만약 괄호를 사용하지 않으면 '&&'를 먼저 연산한다.
- 위처럼 하나의 식에 '&&'와 '||'가 둘 다 포함된 경우에는 어떠한 경우라도 괄호를 사용해서 우선순위를 명확히 해 주는 것이 좋다.
조건 연산자 (삼항 연산자)
- 조건 연산자는 조건식, 식1, 식2 로 총 3개의 피연산자로 두는 삼항 연산자이며 삼항 연산자는 조건 연산자 뿐이다.
조건식의 결과가 true 이면 식1이, false이면 식2의 결과를 받는다.
조건식 'x > y' 의 결과가 true이면 변수 max 값에는 x 의 값이 저장되고. false 이면 y의 값이 저장된다.
만약 x = 15, y =5라고 가정했을 때, 위 코드는 다음과 같은 과정으로 계산된다.
조건 연산자는 조건문인 if문으로 바꿔 쓸 수 있다.
max = (x > y) ? x : y ; → 이 조건연산자는 아래의 if문과 같다.
복합 대입 연산자
- 대입 연산자를 기준으로 오른쪽의 값을 왼쪽에 저장한다.
ex ) i = i + 3 → i += 3; // 이때 '+=' 이렇게 결합된 두 연산자는 공백 없이 붙여 써야 한다.
= | op= |
i = i + 2 ; | i += 2 ; |
i = i - 2 ; | i -= 2 ; |
i = i * 2 ; | i *= 2 ; |
i = i / 2 ; | i /= 2 ; |
i = i % 2 ; | i %= 2; |
i = i << 2 ; | i <<= 2; |
i = i & 2 ; | i &= 2 ; |
i = i * (5 + a); | i *= (5 + a) |
마지막 줄처럼 대입 연산자의 우변이 둘 이상의 항으로 이루어져 있는 경우에
'i *= 5 + a' 를 'i = i * 5 + a'와 같이 오해하지 않도록 하자.
'Programming > Java' 카테고리의 다른 글
[Java] 조건문 (if, switch) 개념 및 활용 예제 (0) | 2020.04.13 |
---|---|
[Java] 형 변환 (Type Conversion) - 개념 및 규칙 (강제, 자동) (0) | 2020.04.12 |
[Java] 변수 (Variable), 자료형 & 참조형, Stack & Heap (0) | 2020.04.12 |
[Java] public static void main(String [] args) 의미 알아보기 (3) | 2020.04.12 |
[Java] 자바의 특징 (0) | 2020.04.12 |