연산자와 피 연산자
연산자가 연산을 수행하려면 반드시 연산의 대상이 있어야 하는데, 이것을 피 연산자(operand)라고 한다. 피 연산자로 상수, 변수 또는 식 등을 사용할 수 있다.
연산자(operator) 연산을 수행하는 기호(+,-,*,/등)
피 연산자(operand) 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
대부분의 연산자는 두 개의 피연산자를 필요로 하며, 하나 또는 세 개의 피연산자를 필요로 하는 연산자도 있다.
연산자는 피연산자로 연산을 수행하고 나면 항상 결괏값을 반환한다.
식과 대입 연산자
하나의 식을 평가(계산)하면 단 하나의 결과를 얻는다.
연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >> | 사칙 연산(+,-,*,/)과 나머지 연산(%) |
비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! & | ^ ~ | '그리고(AND)'와 또는(OR)'으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof연산자 |
피연자의 개수에 의한 분류
피연산자의 개수로 연산자를 분류하기도 하는데, 피연산자의 개수가 하나면 단항 연산자, 두 개면 이항 연산자, 세 개면 삼항 연산자라고 부른다.
연산자를 기능별, 피연산자의 개수별로 나누어 분류하는 것은 연산자의 우선순위 때문이다.
연산자의 우선순위와 결합 규칙
기본적으로 곱셈과 나눗셈은 덧셈과 뺄셈보다 우선순위가 높다.
식 | 설명 |
-x + 3 | 단항 연산자가 이항 연산자보다 우선순위가 높다. 그래서 x의 부호를 바꾼 다음 덧셈이 수행된다. 여기서 '-'는 뺄셈 연산자가 아니라 부호 연산자이다. |
x + 3 * y | 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다. 그래서 '3 * y'가 'x + 3'보다 먼저 계산된다. |
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 | 쉬프트 연산자(<<)는 덧셈 연산자보다 우선순위가 낮다. 그래서 왼쪽 식은2+1가 먼저 계산된다. |
data & 0xFF == 0 | 비트연산자(&)는 비교 연산자(==)보다 우선순위가 낮으므로 비교연산 후에 비트연산이 수행된다. 그래서 왼쪽의 식은 0xFF == 0이 먼저 계산된다. |
x < -1 || x > 3 && x < 5 | 논리 연산자 중에서 AND를 의미하는 &와 &&가 OR을 의미하는 |와||보다 우선순위가 높다/ 이처럼 수식에 AND와 OR가 함께 사용되는 경우는 괄호를 사용해서 우선순위를 명확히 하는 것이 좋다. |
연산자의 결합 규칙
결합 규칙은 연산자마다 다르지만, 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자와 대입 연산자만 오른쪽에서 왼쪽의 순서로 연산을 수행한다.
1. 산술> 비교> 논리> 대입. 대입은 제일 마지막에 수행된다.
2. 단항(1)> 이항(2)> 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방식은 왼쪽에서 오른쪽이다.
산술 변환(usual arithmetic conversion)
이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전에 먼저 형 변환 연산자로 타입을 일치시켜야 한다.
int i = 10;
float f = 20.0f;
float result = f + (float)i; //형변환으로 두 피연산자의 타입을 일치
산술 변환이란? 연산 수행 직전에 발생하는 피연산자의 자동 형변환
1 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치).
2 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.