연산자란?

연산을 수행하는 기호이다.

용어
연산자 : 연산을 수행하는 기호
피연산자 : 연산의 작업 대상 (변수, 상수, 리터럴, 수식 등)
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

+ Recent posts