[Java-03] 연산자(Operator) - 단항 연산자, 산술 연산자
1. 연산자(operator)
- 연산자(operator) : 연산을 수행하는 기호(+, -, *, / 등)
- 피연산자(operand) : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
- 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환함
- 식(式, expression) : 연산자와 피연산자를 조합하여 계산하고자하는 바를 표현한 것
- 평가(evaluation) : 식을 계산하여 결과를 얻는 것
- 피연산자의 개수가 하나면 '단항 연산자', 두 개면 '이항 연산자', 세 개면 '삼항 연산자'라고 부름
- 연산자는 각자 우선순위를 가지고 있고, 우선순위가 높은 연산부터 실행됨
- 연산자의 결합규칙 : 같은 우선순위의 연산자들이 여러 개 있는 경우, 나름대로의 규칙을 가지고 수행함
- 대부분 왼쪽에서 오른쪽으로 수행하지만, 단항 연산자와 대입 연산자만 오른쪽에서 왼쪽으로 수행함
- 연산자의 종류 및 우선순위
종류 | 결합규칙 | 연산자 | 우선순위 |
단항 연산자 | ![]() |
++ -- + - ~ ! (type) | 높음 낮음 |
산술 연산자 | ![]() |
* / % | |
![]() |
+ - | ||
![]() |
<< >> | ||
비교 연산자 | ![]() |
< > <= >= instanceof | |
![]() |
== != | ||
논리 연산자 | ![]() |
& | |
![]() |
^ | ||
![]() |
| | ||
![]() |
&& | ||
![]() |
|| | ||
삼항 연산자 | ![]() |
? : | |
대입 연산자 | ![]() |
= += -= *= /= %= <<= >>= &= ^= != |
- 산술 변환(usual arithmetic conversion) : 연산 전에 피연산자 타입의 일치를 위해 자동 형변환되는 것
- 쉬프트 연산자, 증감 연산자를 제외한 모든 연산에서 산술 변환이 일어남
- 산술 변환의 규칙
① 두 피연산자의 타입을 같게 일치시킴 (큰 타입으로 일치)
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환
2. 단항 연산자
1) 증감 연산자 ++ --
① 증가 연산자 (++) : 피연산자의 값을 1 증가시킴
② 감소 연산자 (--) : 피연산자의 값을 1 감소시킴
- 증감연산자가 수식이나 메서드 호출에 포함된 경우 전위형일 때와 후위형일 때의 결과가 다름
타입 | 설명 | 예시 |
전위형 | 값이 참조되기 전에 증가시킴 | j = ++i; |
후위형 | 값이 참조된 후에 증가시킴 | j = i++; |
ex) 전위형과 후위형의 차이
class Ex {
public static void main(String args[]) {
int i = 5, j = 0;
// (1) 전위형
j = ++i;
System.out.println("j: " + j + ", i: " + i); // j: 6, i: 6
i = 5;
j = 0;
// (2) 후위형
j = i++;
System.out.println("j: " + j + ", i: " + i); // j: 5, i: 6
}
}
(1) 전위형 : i를 먼저 1 증가시킨 다음 j에 대입
(2) 후위형 : i를 먼저 j에 대입한 다음 1 증가시킴
- 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야 함
2) 부호 연산자 + -
- 부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환
- 부호 연산자 '+'는 잘 쓰이지 않음
- boolean형과 char형을 제외한 기본형에만 사용할 수 있음
3. 산술 연산자
1) 사칙 연산자 + - * /
- 우선순위 : +, - < *, /
나누기 연산자 /
- 0으로 나눌 수 없음 (ArithmenticException 발생)
- 두 피연산자가 모두 int타입인 경우 연산결과 또한 int타입이기 때문에 정수만 남고 소수점 이하는 버려지게 됨
ex)
int a = 10, b = 4;
a / b -> 10 / 4 = 2 (int형)
a / float(b) -> 10 / 4.0f = 10.0f / 4.0f = 2.5f (float형)
- 기본적으로 산술 변환 규칙에 의해 피연산자의 타입이 int보다 작은 타입이면 int 타입으로 변환됨
- 결과도 int 타입으로 나옴
- 크기가 작은 자료형의 값을 큰 자료형의 변수에 저장할 때는 자동으로 형변환(type conversion, casting)되지만, 반대로 큰 자료형의 값을 작은 자료형의 변수에 저장하려면 명시적으로 형변환 연산자를 사용하여 변환해주어야 함
- 연산결과가 int 타입의 범위를 넘어가면 명시적으로 형변환 연산자를 사용하여 더 큰 타입으로 변환해주어야 함
2) 나머지 연산자 %
- 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과를 반환함
- 오른쪽 피연산자로 0을 사용할 수 없음
- 피연산자로 음수를 넣을 수 잇음
- 오른쪽 피연산자로 음수도 허용하나, 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 값음
ex)
int a = 10, b= 3;
a % b -> 10 % 3 = 1
int a = -10, b = 3;
a % b -> -10 % 3 = -1
int a = 10, b = -3;
a % b -> 10 % -3 = -1
참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)