연산자의 문법 이해하기
[연산자 이해]
1. 수식 이해
(1) 수식이란?
- 피연산자와 연산자로 구성된 문장을 말한다.
- 피연산자는 상수값 또는 변수를 사용한다.
int result = 123 + 456;
/*
* 피연산자 = int result, 123, 456
* 연산자 = =, +
*
*/
2. 연산자 이해
(1) 연산자 형식
- 단항 연산자 : 피연산자가 한 개인 연산자를 말한다.
- 이항 연산자 : 피연산자가 두 개인 연산자를 말한다.
- 삼항 연산자 : 피연산자가 세 개인 연산자를 말한다.
단항 |
이항 |
삼항 |
- |
+ |
= |
<= |
& |
? : |
~ |
- |
< |
>= |
^ |
! |
* |
> |
== |
&& |
++ |
/ |
<< |
!= |
|| |
-- |
% |
>> |
|
|
(2) 연산자 종류
산술 연산자 |
+ - * / % |
대입 연산자 |
= += -= *= /= %= |
증감 연산자 |
++ -- |
관계 연산자 |
== != > < >= <= |
논리 연산자 |
! && || |
조건 연산자 |
? : |
비트 연산자 |
& | ^ ~ << >> |= ^= ~= <<= >>= |
기타 연산자 |
(자료형) instanceof |
(3) 연산자 우선순위
- 우선순위가 높은 연산자가 있는 수식이 먼저 계산된다.
우선순위 |
1 |
괄호, 단항 연산자 |
() - ~ ! ++ -- (자료형) |
2 |
산술 연산자 |
* / % + - (비트연산자) |
3 |
관계 연산자 |
== != > < >= <= instanceof |
4 |
비트 연산자 |
& | ^ ~ |
5 |
논리 연산자 |
&& || |
6 |
조건 연산자 |
? : |
7 |
대입 연산자 |
= += -= *= /= %= |
3. 산술 연산자 이해
(1) 산술 연산자란?
- 이항 연산자이다.
- 덧셈, 뺄셈, 곱셈, 나눗셈은 정수형과 실수형 계산이 가능하다.
- 나머지는 정수형 계산만 가능하다.
(2) 산술 연산자 종류
기호 |
의미 |
설명 |
+ |
덧셈 |
● 정수형과 정수형의 결과는 정수형이다. ● 정수형과 실수형의 결과는 실수형이다. ● 실수형과 실수형의 결과는 실수형이다. |
- |
뺄셈 |
* |
곱셈 |
/ |
나눗셈 |
● 정수형과 정수형의 나눗셈의 결과는 정수형이다. ● 정수형과 실수형의 나눗셈 결과는 실수형이다. ● 실수형과 실수형의 나눗셈 결과는 실수형이다. ● 0으로 나누면 실행오류가 발생한다. |
% |
나머지 |
계산 결과값은 나눗셈을 한 후 나머지 값만 도출한다. |
4. 대입 연산자 이해
(1) 대입 연산자란?
- 이항 연산자에 해당된다.
- 연산자 오른쪽에 있는 값을 왼쪽에 대입 또는 저장하는 연산자이다.
int result = 100;
int result2 = 100 + 30;
// = : 대입 연산자
// result2에서 100 + 30이 먼저 계산된 후 result에 계산된 130이 대입된다.
(2) 복합 대입 연산자란?
- 단순 대입 연산자 (=) 와 산술 연산자를 복합적으로 사용하는 연산자를 의미한다.
기호 |
사용 예 |
동일한 의미 |
+= |
sum += 3; |
sum = sum + 3; |
-= |
sum -= 3; |
sum = sum - 3; |
*= |
sum *= 3; |
sum = sum * 3; |
/= |
sum /= 3; |
sum = sum / 3; |
%= |
sum %=3; |
sum = sum % 3; |
5. 증감 연산자 이해
(1) 증감 연산자란?
- 단항 연산자이다.
- 정수형 변수의 값을 1 증가시키거나 감소할 때 사용한다.
- 변수 이름 앞 또는 뒤에 붙여 사용하며 붙이는 위치에 따라 이름이 다르다.
- 연산자 기호는 ++와 --가 있다.
(2) 전위 증감 연산자 / 후위 증감 연산자
1) 전위 증감 연산자
- 변수 이름 앞에 증감 연산자를 사용한다.
- 전체 수식을 계산하기 전 증감 연산자를 계산한 후에 수식을 계산한다.
- ex.) ++a; --b;
2) 후위 증감 연산자
- 변수 이름 뒤에 증감 연산자를 사용한다.
- 전체 수식을 계산한 다음 제일 마지막에 증감 연산자를 계산한다.
- ex.) a++; b--;
6. 관계 연산자 이해
(1) 관계 연산자란?
- 이항 연산자이다.
- 연산자를 기준으로 양쪽의 피연산자를 비교하여 참과 거짓을 판별한다.
기호 |
설명 |
사용 예 |
의미 |
== |
같다 |
A == B |
A와 B가 같다. |
!= |
다르다 |
A != B |
A와 B가 다르다. |
> |
크다 |
A > B |
A가 B보다 크다. |
< |
작다 |
A < B |
A가 B보다 작다. |
>= |
크거나 같다 |
A >= B |
A가 B보다 크거나 같다. |
<= |
작거나 같다 |
A <= B |
A가 B보다 작거나 같다. |
7. 논리 연산자 이해
(1) 논리 연산자의 개요
- 논리 연산자의 종류로는 단항 연산자 1개와 이항 연산자 2개로 나뉜다.
- 피연산자를 대상으로 참과 거짓을 판별한다.
- 피연산자란, 상수와 변수, 관계식을 의미한다.
- 참이면 true, 거짓이면 false를 의미한다.
항목 |
관계 연산자 |
논리 연산자 |
형식 |
이항 연산자 |
단항 연산자, 이항 연산자 |
동작 |
피연산자의 값을 비교 |
피연산자의 참과 거짓을 비교 |
결과값 |
참이면 true, 거짓이면 false |
(2) 논리 연산자의 종류
항목 |
기호 |
형식 |
설명 |
NOT |
! |
단항 연산자 |
피연산자를 부정 |
AND |
&& |
이항 연산자 |
피연산자 모두 참이면 참 |
OR |
|| |
이항 연산자 |
피연산자 모두 거짓이면 거짓 |
(3) 논리 연산자의 우선순위
- NOT > AND > OR
- 괄호() > 괄호 안 관계 연산자 > NOT > AND > OR > 대입 연산자(=)
8. 조건 연산자 이해
(1) 조건 연산자의 개요
- 삼항 연산자이다.
- 피연산자의 역할이 각각 있다.
1) 피연산자의 역할
- 첫 번째 피연산자 - 조건식 (참 또는 거짓)
- 두 번째 피연산자 - 조건식이 참인 경우 수행하는 상수 OR 변수 OR 수식
- 세 번째 피연산자 - 조건식이 거짓인 경우 수행하는 상수 OR 변수 OR 수식
result = (조건식) ? (상수1 or 변수1 or 수식1) : (상수2 or 변수2 or 수식2);
// 조건식이 참인 경우 : 1번 수행
// 조건식이 거짓인 경우 : 2번 수행
9. 비트 연산자 이해
(1) 비트 연산자의 개요
- 비트 단위로 연산한다.
- 종류로는 비트 논리 연산자와 비트 시프트 연산자가 있다.
종류 |
항목 |
기호 |
형식 |
설명 |
비트 논리 연산자 |
NOT |
~ |
단항 연산자 |
비트 반전 ( 0은 1로, 1은 0으로) |
AND |
& |
이항 연산자 |
피연산자 모두 1인 경우만 1 |
OR |
| |
피연산자 모두 0인 경우만 0 |
XOR |
^ |
피연산자가 서로 달라야 1 |
시프트 연산자 |
왼쪽 시프트 |
<< |
왼쪽으로 비트 이동 (부호 유지) |
오른쪽 시프트 |
>> |
오른쪽으로 비트 이동 (부호 유지) |
>>> |
부호 비트를 포함한 오른쪽으로 비트 이동 |
(2) 비트 연산자의 사용 예시
1) NOT 연산
int value = 1; // 비트 표현 : 0000 0001
int result = ~value; // 비트 표현 : 1111 1110
// 부호 비트 반전 (양수를 음수로)
// 2의 보수로 표현됨 (음수값)
2) AND 연산
int v1 = 3; // 비트 표현 : 0000 0011
int v2 = 5; // 비트 표현 : 0000 0101
int res = v1 & v2;
// & : v1가 v2의 자리가 둘 다 1 이어야 1. 하나라도 0이면 0. 둘 다 0이어도 0.
// v1 & v2 : 0000 0001
System.out.println(res); // 1
3) OR 연산
int v1 = 3; // 비트 표현 : 0000 0011
int v2 = 5; // 비트 표현 : 0000 0101
int res = v1 | v2 ;
// | : 둘 중 하나의 자리가 1이어도 1. 둘 다 0이면 0.
// v1 | v2 : 0000 0111
System.out.println(res); // 7
4) XOR 연산
int v1 = 3; // 비트 표현 : 0000 0011
int v2 = 5; // 비트 표현 : 0000 0101
int res = v1 ^ v2;
// ^ : v1과 v2 둘 중 하나만 1이어야 1. 둘 다 1일 경우도 0.
// v1 ^ v2 : 0000 0110
System.out.println(res); // 6
5) 왼쪽 시프트 연산 (부호 유지)
int value = 3;
int res = value << 1;
// value : 0000 0011
// value << 1 : 0 0000 0110 , 맨 앞에 0은 버려짐.
System.out.println(res); // 6
6) 오른쪽 시프트 연산 (부호 유지)
int value2 = 6; // 비트 표현 : 0000 0110
int res2 = value2 >> 1;
// value2 >> 1 : 0000 0011 0 , 맨 뒤에 0은 버려짐.
System.out.println(res2); // 3
7) 오른쪽 시프트 연산 (부호 포함)
int value3 = -1;
int res3 = value3 >>> 1;
System.out.println(res3);
// res3 = 2147483647 , 잘 쓰이지 않는다 해서 그냥 이렇다 라고만 알고 있는 상태. 보충 필요.