연산자란?
연산을 수행하는 기호이다.
용어
연산자 : 연산을 수행하는 기호
피연산자 : 연산의 작업 대상 (변수, 상수, 리터럴, 수식 등)
x + 3 // x, 3 : 피연산자 // + : 연산자
1. 식(式)과 대입 연산자
식 : 연산자와 피연산자를 조합하여 계산하는 것
식의 평가 : 식을 계산하여 결과를 얻는 것
int x = 5;
1. int y = 4 * x + 3;
2. int y = 4 * 5 + 3;
3. int y = 23;
2. 연산자의 종류
연산자 종류 | 연산자 | 피연산자 | 결과 값 | 설명 |
산술 연산 | +, -, *, /, % | 이항 | 숫자 | 사칙 연산 및 나머지 계산 |
부호 | +, - | 단항 | 숫자 | 음수, 양수 부호 |
문자열 | + | 이항 | 문자 | 두 문자열을 연결 |
대입 연산 | =, +=, -=, *=, /=, %=. &=, ^=, |=, <<=, >>=, >>>= | 이항 | 다양 | 우변의 값을 좌변에 대입 |
증감 연산 | ++, -- | 단항 | 숫자 | 1씩 증가, 감소 |
비교 연산 | ==, !=, <, >, <=, >=, instanceof | 이항 | boolean | 값을 비교 |
논리 연산 | !, &&, || | 단항, 이항 | boolean | 논리적 NOT, AND, OR 연산 |
조건 연산 | (조건식) ? A : B | 삼항 | 다양 | 조건식이 true면 A, false면 B 반환 |
비트 | ~, &, |, ^ | 단항, 이항 | 숫자, boolean | 비트 NOT, AND, OR, XOR 연산 |
비트 쉬프트 | <<, >>, >>> | 이항 | 숫자 | 비트를 좌우측으로 밀어 이동 |
- 0으로 나눌 경우 ArithmeticException 에러가 발생한다.
- 0.0으로 나눌 경우 Infinity가 출력된다.
- byte, short의 연산의 경우 int형으로 변환하여 계산된다.
- 나머지 연산 시 나누는 수로 음수를 허용하지만 부호는 무시된다.
char c = 'a' + 1; // 에러 없음
char c1 = 'a';
char c = c1 + 1; // 에러 발생
위의 예제에서 에러가 없는 경우는 리터럴 간 연산이기 때문에 컴파일 시 컴파일러가 값을 대체하여 준다.
하지만 아래 에러 발생의 경우 c1이라는 값이 변수라서 컴파일러가 계산을 못하여 에러가 발생한다.
그래서 char c = (char) c1 + 1;과 같이 캐스팅 연산자를 사용해야한다.
2.1 피연산자의 개수에 의한 분류
// 한개, 단항
x++;
// 두개, 이항
int x = 1 + 1;
// 세개, 삼항
int x = (a == 1) ? 1 : 2;
삼항 연산자는 괄호 안에 조건문이 true일 경우 : 기준 좌측, false일 경우 우측을 반환한다.
3. 연산자의 우선순위와 결합 규칙
연산자가 둘 이상일 경우 연산자의 우선순위에 의해 연산 순서가 결정된다.
int x = 5 + 3 * 4;
우선순위가 확실하지 않다면 괄호로 식을 묶어서 계산한다. EX) int x = (5 + 3) * 4;
우선 순위 | 연산자 | 피연산자 | 결합 규칙 |
1 | (), [] 연산자 | 다양 | - |
2 | 증감 (++, --), 부호 (+, -), 비트 (~), 논리 (!) | 단항 | 좌측 |
3 | 산술 (*, /, %) | 이항 | 우측 |
4 | 산술 (+, -) | 이항 | |
5 | 쉬프트 (<<, >>, >>>) | 이항 | |
6 | 비교 (<, >, <=, >=, instanceof) | 이항 | |
7 | 비교 (==, !=) | 이항 | |
8 | 논리 & | 이항(단항) | |
9 | 논리 ^ | 이항(단항) | |
10 | 논리 | | 이항(단항) | |
11 | 논리 && | 이항 | |
12 | 논리 || | 이항 | |
13 | 조건 ( ? : ) | 삼항 | |
14 | 대입 (=, +=, -=, *=, /=, %=. &=, ^=, |=, <<=, >>=, >>>=) | 이항 | 좌측 |
4. 산술 변환(usual arithmetic conversion)
산술 변환이란?
연산 수행 전에 발생하는 피연산자의 자동 형 변환으로 두 피연산자의 타입을 일치시키기 위한 변환이다.
- 작은 타입에서 큰 타입으로 변환 시 데이터 손실을 줄이기 위함
- int 보다 작은 char, short는 int로 변환
- 쉬프트 연산자 (<<, >>, >>>), 증감 연산자(++, --) 제외
int x = 10;
long y = 100;
// (long) x + y = 110;
위의 예시처럼 x를 long으로 변환하여 연산을 하는 것이다.
5. 비교 연산자
비교 연산자란?
두 피연산자를 비교하기 위한 연산자이다. true, false 중 하나의 결과가 나오며 타입이 서로 다른 두 피연산자는 자동 형 변환 후 비교된다.
5.1 대소 비교 연산자
연산자 : <, >, <=, >=
if(a > b) {}
if(a < b) {}
if(a <= b) {}
if(a >= b) {}
대소 비교 연산자는 기본형에 사용할 수 있으며 참조형과 boolean형에는 사용이 불가하다.
5.2 등가 비교 연산자
연산자 : ==, !=
if(a == b) {}
if(a != b) {}
등가 비교 연산자는 모든 자료형에 사용 가능하다.
float와 double을 비교하려면 서로 근사 값이 달라 double형을 float로 변환 후 비교해야 한다.
* 문자열 비교
문자열 비교는 ==를 사용하지 않고 equals() 함수를 사용한다.
String str1 = new String("ABC");
String str2 = "ABC";
if(str == str2) // false
if(str.equals(str2)) // true
==은 객체를 비교하여 두 개의 객체가 달라 false를 반환하지만 equals()는 내용을 비교하여 true를 반환한다.
6. 논리 연산자
논리 연산자란?
둘 이상의 조건을 AND와 OR로 연결하여 하나의 식으로 표현하는 것이다.
6.1 논리 연산자
연산자 : &&, ||, !
- && (AND) : 두 피연산자가 모두 true일 경우 true
- || (OR) : 두 피연산자 중 하나라도 true일 경우 true
- ! (부정) : true -> false, false -> true
10 < x && x < 20; // x는 10보다 크고 20보다 작다
10 < x || x < 20; // x는 10보다 크거나 20보다 작다
&&가 ||보다 우선순위가 높다.
* 효율적인 연산
- && (AND) 연산 시 왼쪽이 false면 우측은 평가하지 않는다.
- || (OR) 연산 시 왼쪽이 true이면 우측은 평가하지 않는다.
6.2 비트 연산자
비트 연산자란?
피연산자를 비트 단위로 논리 연산하는 것이다.
연산자 : &, |, ^, ~, <<, >>
- | (OR) : 한쪽이 1이면 1을 얻고 아니면 0을 얻는다.
- & (AND) : 양쪽 모두 1이면 1을 얻고 아니면 0을 얻는다.
- ^ (XOR) : 값이 서로 다를 때 1을 얻고 같으면 0을 얻는다.
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 |
// OR 연산자 '|'
// 주로 값을 변경할때 사용
1. OxAB | OxF => OxAF
10101011 (OxAB)
(|) 00001111 (OxF)
--------
1111 (OxAF)
// AND 연산자 '&'
// 주로 특정 비트의 값을 뽑을때 사용
2. OxAB & OxF => OxB
10101011 (OxAB)
(&) 00001111 (OxF)
--------
00001011 (OxB)
// XOR 연산자 '^'
// 같은 값을 두고 연산하면 원형으로 돌아옴
3. OxAB ^ OxF => OxA4
10101011 (OxAB)
00001111 (OxF)
--------
10100100 (OxA4)
(^) 00001111 (OxF)
--------
10101011 (OxAB)
- ~ (비트 전환 연산자) : 0 -> 1, 1 -> 0으로 논리 부정 연산자와 비슷하다. 1의 보수 연산자라고도 한다.
1. (~) 00001010 (10) => 11110101 (-11)
2. (~) 00001010 (10) => 11110101 (-11) + 1 => 11110110 (-10) // 1의 보수 + 1
위의 예제 중 2번을 부면 비트 전환 연산자를 이용해 1의 보수를 구하고 구한 값에 1을 더하니 마이너스 값을 얻는 걸 알 수 있다.
(-) 부호만 붙여도 양 -> 음, 음 -> 양으로 변환을 할 수 있지만 비트 연산자를 이용하게 되면 아래와 같이 부호가 다른 값을 구할 수 있다.
EX) ~N+1 : 양 -> 음
~(N-1) : 음 -> 양
- <<, >> (쉬프트 연산자) : 피연산자의 각 자리(2진수)를 '>>' 오른쪽, '<<' 왼쪽으로 이동(shift)하는 연산자이다.
자리 이동으로 범위를 벗어나게 되면 0으로 채워진다. '>>' 연산자는 이동시킬 때 부호 있는 정수는 1을 부호 없는 정수는 0을 채운다.
1. 10진수 8은 2진수 00001000이다.
2. 8 << 2는 10진수 8의 2진수를 왼쪽으로 2자리 이동하라는 것이다. // 00 001000
3. 저장범위가 넘어가면 빈자리는 0으로 채운다. // 00 00100000 (32)
위의 예시 중 2번에서 연산자 우측에 있는 피연산자는 자리를 몇 번 이동할지 정하는 숫자이다.
좌측 피연산자는 산술 변환이 되어 int보다 작은 값이면 int로 변환하지만 우측 피연산자는 타입을 일치시키지 않아도 돼서 산술 변환이 일어나지 않는다.
// >> => x / 2^n의 결과
8 >> 1 -> 4
8 >> 2 -> 2
// << => x * 2^n의 결과
8 << 1 -> 16
8 << 2 -> 32
위의 예시는 이동(쉬프트) 연산자 이용하여 x / 2^n과 x * 2^n을 구하는 식이다.
이동(쉬프트) 연산자가 *, / 보다 더 빠르기는 하나 가독성이 떨어진다.
8 >> 32 하게 되면 int타입이 32bit여서 제자리 값이 된다. 그래서 8 >> 34는 8 >> 2와 같다.
7. 조건 연산자
조건 연산자는 유일한 삼항 연산자이다.
연산자 : ? :
// (조건문) ? 식1 : 식2
// 조건식이 true면 식1을 false면 식2를 수행한다.
x > y ? x : y;
x > 0 ? 1 : (x == 0 ? 0 : -1);
if문으로 바꿔서 사용이 가능하며 결합 규칙은 오른쪽에서 왼쪽으로 진행된다.
8. 대입 연산자
대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며 결합 규칙은 오른쪽에서 왼쪽으로 진행된다.
연산자 : =, op=(op와=사이에 공백 없음)
연산자 | 설명 |
= | 왼쪽의 피연산자에 오른쪽의 피연산자를 대입 |
+= | 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
-= | 왼쪽의 피연산자에 오른쪽의 피연산자를 뺀 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
*= | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
/= | 왼쪽의 피연산자에 오른쪽의 피연산자로 나눈 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
%= | 왼쪽의 피연산자에 오른쪽의 피연산자로 나눈 후, 그 나머지 값을 왼쪽의 피연산자에 대입 |
&= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
|= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
^= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
<<= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 이동 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
>>= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 이동 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
>>>= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 이동 후, 그 결과 값을 왼쪽의 피연산자에 대입 |
n = 5 // 대입
n += 5 // 더한 후 대입
n -= 5 // 뺀 후 대입
n *= 5 // 곱한 후 대입
n /= 5 // 나눈 후 대입
n %= 5 // 나눈 후 나머지 대입
n &= 5 // AND 후 대입
n |= 5 // OR 후 대입
n ^= 5 // XOR 후 대입
n <<= 5 // 왼쪽으로 이동 후 대입
n >>= 5 // 부호 유지하면 오른쪽으로 이동 후 대입
n >>>= -5 // 부호 상관 없이 오른쪽으로 이동 후 대입
참조
https://kephilab.tistory.com/28
4. Java 자바 - 연산자 종류, 연산자 우선순위
1. 연산자 종류 연산자 종류 연산자 피연산자 수 산출값 설명 산술 연산 +, -, *, /, % 이항 숫자 사칙연산 및 나머지계산 한다. 부호 +, - 단항 숫자 음수 / 양수 부호 문자열 + 이항 문자 두 문자를 연
kephilab.tistory.com
https://tcpschool.com/java/java_operator_assignment
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'개발 언어 > Java' 카테고리의 다른 글
[Java] 배열 (0) | 2021.08.19 |
---|---|
[Java] 제어문 (0) | 2021.08.18 |
[Java] 형변환 (0) | 2021.08.18 |
[Java] 실수형의 소수점 표현 방식과 BigDecimal (0) | 2021.08.13 |
[Java] 오버 플로우, 언더 플로우 (0) | 2021.08.12 |