자바 연산자(operator) 개념과 종류에 대해 알아보자
2024. 12. 26. 13:00ㆍJAVA
728x90
반응형
안녕하세요. 진득 코딩입니다.
프로그래밍을 하면서 처음에 저장해 둔 변수만을 사용할 수 없습니다.
여러 데이터들을 가공하거나 연산들을 수행할 일들이 생기게 됩니다.
이번 시간에는 자바에서 여러 연산을 수행할 때 사용하는 기호인 연산자에 대해서 알아보도록 하겠습니다.
연산자(operator)와 피연산자(operand)
- 연산자는 연산을 수행하는 기호를 말합니다.
- 연산자가 연산을 수행하기 위해서는 반드시 연산의 대상이 있어야 하는데 이를 피연산자(operand)라고 합니다.
- 피연산자로 상수, 변수 또는 식 등을 사용할 수 있습니다.
연산자(operator) : 연산을 수행하는 기호(+, -, *, / 등)
피연산자(operand) : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
- 대부분의 연산자는 두 개의 피연산자를 필요로 하며, 하나 또는 세 개의 피연산자를 필요로 하는 연산자도 있습니다.
- 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환합니다.
식과 대입연산자
- 식(expression)은 연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것입니다.
- 또한 식을 계산하여 결과를 얻는 것을 '식을 평가한다(evaluation)'이라고 합니다.
- 하나의 식을 평가(계산)하면 단 하나의 결과를 얻습니다.
- 식을 평가한 후에는 대입 연산자 '='를 사용해서 변수와 같이 값을 저장할 수 있는 공간에 결과를 저장해야 합니다.
- 변수에 저장된 값을 다른 곳에 사용하거나 화면에 출력함으로써 의미있는 결과를 얻을 수 있습니다.
연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >> | 사칙 연산(+, -, *, / )과 나머지 연산(%) |
비교 연산자 | > < >= <= == != <> | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! & | ^ ~ | '그리고(AND)'와 '또는(OR)'으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof 연산자 |
* (type)은 '형변환 연산자'를 의미합니다.
- 연산자는 크게 산술, 비교, 논리, 대입 4가지로 나눌 수 있습니다.
- 연산자를 피연산자의 개수로 분류하게 되면 피연산자의 개수가 하나면 '단항 연산자', 두 개면 '이항 연산자', 세 개면 '삼항 연산자'라고 부릅니다.
- 대부분의 연산자는 '이항 연산자'이고, 삼항 연산자는 오직 '?:' 하나뿐입니다.

- 위의 식에서 두 연산자 모두 기호 '-'로 나타내지만 위에 있는 연산자는 이항연산자(뺄셈 연산자)이고, 아래에 있는 연산자는 단항 연산자입니다.
- 부호 연산자는 단항 연산자로 피연산자가 '10' 한개 뿐이지만, 뺄셈 연산자는 이항 연산자로 피연산자가 '10'과 '20' 두 개입니다.
- 이처럼 연산자를 기능별, 피연산자의 개수로 나누어 분류하는 것은 '연산자의 우선순위' 때문입니다.
연산자의 우선순위와 결합규칙
식 | 설명 |
-x + 3 | 단항 연산자가 이항 연산자보다 우선순위가 높다. 그래서 x의 부호를 바꾼 다음 덧셈이 수행됩니다. 여기서 '-'는 뺄셈 연산자가 아니라 부호 연산자입니다. |
x + 3 * y | 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높습니다. 그래서 '3*y'가 먼저 계산됩니다. |
x + 3 > y - 2 | 비교 연산자(>)보다 산술 연산자가 '+'와 '-'가 먼저 수행됩니다. 그래서 'x+3'과 'y-2'가 먼저 계산된 다음에 '>'가 수행됩니다. |
x > 3 && x < 5 | 논리 연산자 '&&'보다 비교 연산자가 먼저 수행됩니다. 그래서 'x > 3'와 'x < 5'가 먼저 계산된 다음에 '&&'가 수행됩니다. 식의 의미는 'x가 3보다 크고 5보다 작다'입니다. |
result = x + y * 3; | 대입 연산자는 연산자 중에서 제일 우선순위가 낮습니다. 그래서 우변의 최종 연산결과가 변수 result에 저장됩니다. |
- 식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산 순서가 결정됩니다.
- 위 표에 있는 연산순서는 상식선에서 판단이 가능한 수준의 우선순위입니다.
식 | 설명 |
x << 2 + 1 | 쉬프트 연산자(<<)는 덧셈 연산자보다 우선순위가 낮습니다. 그래서 왼쪽의 식은 'x << (2+1)'과 같습니다. |
data & 0xFF == 0 | 비트 연산자(&)는 비교 연산자(==)보다 우선순위가 낮으므로 비교 연산 후에 비트연산이 수행됩니다. 그래서 왼쪽의 식은 'data & (0xFF == 0)'과 같습니다. |
x < -1 || x > 3 && x < 5 | 논리 연산자 중에서 AND를 의미하는 '&'와 '&&'가 OR을 의미하는 '|'와 '||'보다 우선순위가 높습니다. 이처럼 수식에 AND와 OR가 함께 사용되는 경우는 다음과 같이 괄호를 사용해서 우선순위를 명확하게 하는 것이 좋습니다. x < -1 || (x > 3 && x < 5) |
- 위 표에 있는 연산자 우선순위는 주의해야 할 우선순위입니다.
- 만일 우선순위가 확실하지 않다면, 먼저 계산되어야 하는 부분을 괄호로 묶어주면 됩니다.
- 괄호는 연산자가 아니라 연산자의 우선순위를 임의로 지정할 때 사용하는 기호입니다.
연산자의 결합규칙
- 하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우, 연산을 수행하는 순서에 대한 규칙을 '연산자의 결합규칙'이라고 합니다.
- 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행합니다.
- 단항 연산자와 대입 연산자만 그 반대로, 오른쪽에서 왼쪽의 순서로, 연산을 수행합니다.
- 대입연산자는 우변의 값을 좌변에 저장하고, 저장된 값을 연산결과로 반환합니다.
1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행됩니다.
2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높습니다.
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽입니다.
종류 | 결합규칙 | 연산자 | 우선순위 |
단항 연산자 | <------ | ++ -- + - ~ ! (type) | 높음 |
산술 연산자 | ------> | * / % | |
------> | + - | ||
------> | << >> | ||
비교 연산자 | ------> | < > <= >= instanceof | |
------> | == != |
논리 연산자 | ------> | & | 낮음 |
------> | ^ | ||
------> | | | ||
------> | && | ||
------> | || | ||
삼항 연산자 | ------> | ?: | |
대입 연산자 | <------ | = += -= *= /= %= <<= >>= &= ^= |= |
- 단항연산자에 있는 '+'와 '-'는 부호연산자이고, '(type)'은 형변환 연산자입니다.
- instanceof는 객체의 타입을 확인하는 데 사용되는 연산자입니다.
산술 변환(usual arithmetic conversion)
- 이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전에 형변환 연산자로 타입을 일치시켜야 합니다.
- 두 피연산자의 타입 중에서 더 큰 타입으로 일치시키는데 그 이유는 작은 타입으로 형변환하면 원래의 값이 손실될 가능성이 있기 때문입니다.
- 이처럼 연산 전에 피연산자 타입의 일치를 위해 자동 형변환되는 것을 '산술 변환' 또는 '일반 산술 변환'이라고 합니다.
1. 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
long + int -> long + long -> long
float + int -> float + float -> float
double + float -> double + double -> double
2. 피연산자의 타입이 iont보다 작은 타입이면 int로 변환한다.
byte + short -> int + int -> int
char + short -> int + int -> int
* 모든 연산에서 '산술 변환'이 일어나지만, 쉬프트 연산자(<<, >>), 증감 연산자(++, --)는 예외입니다.
- 첫 번째 규칙은 피연산자의 값손실을 최소화하기 위한 것이고, 두 번째 규칙은 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문입니다.
- char나 short의 표현범위가 좁아서 연산 중에 오버플로우(overflow)가 발생할 가능성이 높기 때문에 만들어진 것입니다.
산술변환 - 연산 수행 직전에 발생하는 피연산자의 자동 형변환
1. 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환한다.
증감 연산자 (++, --)
- 증감연산자는 피연산자에 저장된 값을 1 증가 또는 감소시킵니다.
- 정수와 실수가 모두 가능하지만, 상수는 값을 변경할 수 없으므로 가능하지 않습니다.
- 대부분의 연산자는 피연산자의 값을 읽어서 연산에 사용할 뿐, 피연산자의 타입이나 값을 변경시키지 않습니다.
- 오직 대입연산자와 증감연산자만 피연산자의 값을 변경합니다.
- 증감연산자는 일반 산술 변환에 의한 자동 형변환이 발생하지 않으며, 연산결과의 타입은 피연산자의 타입과 같습니다.
증가 연산자(++) 피연산자의 값을 1 증가시킵니다.
감소 연산자(--) 피연산자의 값을 1 감소시킵니다.
- 증가 연산자 '++'와 감소 연산자 '--'는 피연산자 양쪽 모두 위치할 수 있습니다.
- 피연산자의 왼쪽에 위치하면 '전위형(prefix)', 오른쪽에 위치하면 '후위형(postfix)'라고 합니다.
타입 | 설명 | 사용예 |
전위형 | 값이 참조되기 전에 증가시킵니다. | j = ++i; |
후위형 | 값이 참조된 후에 증가시킵니다. | j = i++; |
- 하지만 증감연산자가 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이가 없습니다.

- 결과를 보면 두 번 모두 i의 초기값 5에서 1이 증가된 6이 출력된 것을 알 수 있습니다.
- 위 경우에서는 어떤 수식에 포함된 것이 아니라 단독적으로 사용되었기 때문에 차이가 없습니다.
- 그러나 다른 수식에 포함되거나 메서드의 매개변수로 사용된 경우, 전위형(++i)과 후위형(i++)의 결과는 다릅니다.

- 전위형은 변수(피연산자)의 값을 먼저 증가시킨 후에 변수의 값을 읽어오는 반면, 후위형은 변수의 값을 먼저 읽어온 후에 값을 증가시킵니다.
- 전위형의 경우 증감연산자를 식의 이전으로, 후위형의 경우 증감연산자를 식의 이후로 떼어내서 생각하면 쉽습니다.

- 위 예제는 메서드 호출에 증감연산자가 사용된 예입니다.
- i는 값이 증가되기 전에 참조되므로 println()에게 i에 저장된 값 5를 넘겨주고 나서 i의 값이 증가하기 때문에 5가 출력됩니다.
- j는 j에 저장된 값을 증가시킨 후에 println()에게 값을 넘겨주므로 6이 출력됩니다.
- 결과적으로는 i, j 모두 1씩 증가되어 6이 됩니다.
- 증감연산자를 사용하면 코드가 간결해지지만, 지나치면 코드가 복잡해져 이해하기 어려워집니다.
- 때문에 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 지양해야 합니다.
부호 연산자 (+, -)

- 부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환합니다.
- 피연산자가 음수면 양수, 양수면 음수가 연산의 결과가 됩니다.
- 부호연산자 '+'는 하는 일이 없으며, 쓰이는 경우도 거의 없습니다.
- 부호 연산자는 boolean형과 char형을 제외한 기본형에만 사용할 수 있습니다.
- 부호연산자는 덧셈, 뺄셈연산자와 같은 기호를 쓰지만 다른 연산자입니다.
- 기호는 같아도 피연산자의 개수가 달라서 구별이 가능합니다.
이번 시간에는 연산에 사용되는 연산자들에 대해서 알아보았습니다.
포스팅 중에 이해가 안 되시는 부분이 있다면 댓글에 남겨주시면 아는 수준 안에서 성심껏 답변해 드리도록 하겠습니다.
이번 포스팅은 여기까지입니다.
끝까지 봐주셔서 감사합니다.😊
728x90
반응형
LIST
'JAVA' 카테고리의 다른 글
자바 비교 연산자와 논리 연산자에 대해 알아보자 (0) | 2024.12.30 |
---|---|
자바 산술 연산자에 대해 알아보자 (2) | 2024.12.27 |
형변환으로 다른 타입으로 변환해보자 (0) | 2024.12.24 |
기본형 타입 중 정수형과 실수형에 대해 알아보자 (0) | 2024.12.23 |
기본형 타입 중 논리형과 문자형에 대해 알아보자 (4) | 2024.12.20 |