연산자는 '연산을 수행하는 기호'를 말한다. 자바는 사칙연산 (+, -, *, /)를 비롯한 다양한 연산자들을 제공한다.
1. 연산자와 피연산자
연산자가 연산을 수행하기 위해서는 연산의 대상이 필요한데, 이것을 '피연산자 (operand)' 라고 한다. 피연산자로는 상수, 리터럴, 변수 또는 수식 등을 사용할 수 있다.
- 연산자 (operator): 연산을 수행하는 기호
- 피연산자 (operand): 연산자의 작업 대상
x + 3
- 연산자: '+'
- 피연산자: 'x', '3'
'+' 연산자는 두개의 피연산자를 더해서 결과를 반환한다. 이와 같이 대부분의 연산자는 두개의 피연산자를 필요로 하며, 하나 또는 세개의 피연산자를 필요로 하는 연산자도 있다.
연산자는 연산을 수행한 후 항상 결과값을 반환한다.
2. 식과 대입연산자
연산자와 피연산자를 조합하여 계산하고자하는 바를 표현하는 것을 식 (expression)이라고 한다. 그리고 식을 계산하여 결과를 얻는 것을 '식을 평가 (evaluation)한다' 고 한다. 하나의 식을 평가하면 단 하나의 결과를 얻는다.
4 * x + 3 이라는 식을 예시로 프로그래밍에 적용해보자.
int x = 5;
// 작성한 식을 프로그램에 포함시키려면 식의 끝에 ';'을 붙여 하나의 문장으로 만들어야한다.
4 * x + 3; // 문장 (statement)
// 문장의 결과를 사용하기 위해서는 '=' 연산자를 사용하여 변수에 값을 저장해야한다.
int y = 4 * x + 3;
// 저장된 값을 출력하여 확인할 수 있다.
System.out.println(y); // 23
System.out.println(4 * x + 3); // 23
3. 연산자의 종류
- 연산자의 기능별 분류
종류 | 연산자 | 설명 |
산술연산자 | +, -, *, /, %, <<, >> | 사칙연산과 나머지 연산 (%) |
비교연산자 | <, >, <=, >=, ==, != | 크고 작음, 같고 다름을 비교 |
논리연산자 | &&, ||, !, &, |, ^, ~ | and, or 조건 |
대입연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type), ? :, instanceof | 기타 연산자 |
- 피연산자의 개수에 의한 분류
피연산자의 개수로 연산자를 분류하기도 하하는데, 피연산자의 개수가 하나면 '단항 연산자', 두개면 '이항연산자', 세개면 '삼항 연산자'라고 부른다. 대부분 이항 연산자이고 삼항 연산자는 '? :' 하나뿐이다.
-3 - 5
위의 식에는 두 개의 연산자가 포함되어 있다. 둘 다 기호 '-'로 나타내지만 첫번째 '-'는 부호 연산자, 두번째 '-'는 뺄셈 연산자이다. 이때는 피연산자의 개수로 구분할 수 있다.
'부호 연산자'는 '3' 하나의 피연산자를 가지지만 '뺄셈 연산자'는 '-3'과 '5' 두개의 피연산자를 가진다.
4. 연산자의 우선순위와 결합규칙
식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산순서가 결정된다. 기본적으로는 수학에서 사용하는 상식 선에서 해결이 되지만 몇몇 연산자의 경우에는 우선순위를 주의해야 한다.
- '<<' 연산자는 '+' 연산자보다 우선순위가 낫다.
- 논리 연산자(&)는 비교 연산자(==)보다 우선순위가 낮다.
- 논리 연산자 중 '&&'가 '||' 보다 우선순위가 높다.
위와 같은 예외상황이 발생할 수 있기 때문에 애매한 경우에는 괄호를 사용하여 명확하게 표현해주는 것이 좋다.
- 연산자의 결합규칙
하나의 수식에 같은 우선순위의 연산자들이 여럿 존재하는 경우에는 연산자의 결합규칙을 따라서 처리한다. 연산자의 결합규칙은 연산자마다 다르지만 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자와 대입 연산자만 그 반대인 오른쪽에서 왼쪽으로 연산을 수행한다.
※ 연산자의 우선순위 정리
- 산술 > 비교 > 논리 > 대입 순으로 수행된다.
- 단항 (1) > 이항 (2) > 삼항 (3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
종류 | 결합규칙 | 연산자 | 우선순위 |
단항연산자 | <---- | ++, --, +, -, ~, !, (type) | 높음 |
산술연산자 | ----> | *, /, % | |
+, - | |||
<<, >> | |||
비교연산자 | ----> | <, >, <=, >=, instanceof | |
==, != | |||
논리연산자 | ----> | & | |
^ | |||
| | |||
&& | |||
|| | |||
삼항연산자 | <---- | ? : | |
대입연산자 | <---- | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |= | 낮음 |
5. 산술변환 (usual arithmetic conversion)
이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하기 때문에 피연산자의 타입이 서로 다르다면 연산전에 형변환을 통해 타입을 일치시켜야 한다.
int i = 10;
float f = 20.0f;
float result = f + (float) i;
// 형변환으로 두 피연산자의 타입을 일치
대부분의 경우 작은 타입에서 큰 타입으로 변환하여 값의 손실을 예방한다. 작은 타입에서 큰 타입으로 변환하는경우에는 따로 형변환을 명시적으로 해주지 않아도 자동으로 형변환이 된다.
float result = f + i;
// 큰 타입으로 형변환시 형변환 연산자를 생략 가능하다.
이처럼 연산 전에 피연산자의 타입의 일치를 위해 자동 형변환 되는 것을 '산술 변환' 또는 '일반 산술 변환'이라고하며 이 변환은 이항 연산 뿐만 아니라 단항 연산에서도 일어난다.
[산술 변환 규칙]
1. 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
2. 피연산자의 타입이 int 보다 작은 타입이면 int로 변환된다.
※ <<, >> 연산과 ++, -- 연산의 경우에는 산술 변환이 일어나지 않는다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] 연산자 - 산술 연산자 (0) | 2021.08.11 |
---|---|
[JAVA] 연산자 - 단항 연산자 (0) | 2021.08.10 |
[JAVA] 형변환 (casting) (0) | 2021.08.03 |
[JAVA] 변수 타입 - 기본형 (primitive type) (0) | 2021.08.02 |
[JAVA] 진법 및 진법변환 (0) | 2021.08.01 |