연산자 (Operator)
연산을 수행하는 기호
연산자와 피연산자
•
연산자(Operator) : 연산을 수행하는 기호 (+, -, * / 등)
•
피연산자(Operand) : 연산의 대상 (변수, 상수, 리터럴, 수식)
•
연산자가 피연산자로 연산 수행 → 결과값 반드시 반환
식과 대입 연산자
•
식(expression) : 연산자와 피연산자의 조합으로 계산하고자 하는 바를 표현한 것
•
평가(evaluation) : 식을 계산하여 결과를 얻는 것
•
연산을 통한 의미있는 결과를 얻기까지의 과정
y = 2 * 10 + 2; // 식의 평가 결과를 변수에 저장 후 세미콜론
System.out.println(y) // 변수 y 값을 화면에 출력
System.out.println(2 * 10 + 2) // 결과를 변수에 저장하지 않고 바로 사용 가능
Java
연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >> | 사칙연산과 나머지 연산 |
비교 연산자 | > < >= <= == != | 대소 비교 |
논리 연산자 | && || ! & \ ^ ~ | AND와 OR로 조건 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환, 삼항, instanceof 연산자 |
피연산자 개수에 의한 분류
종류 | 예 | 비고 |
단항 연산자 | -2 | |
이항 연산자 | -2 -4 | 연산자의 종류에 따라 우선순위가 달라짐. |
삼항 연산자 | ?: |
연산자의 우선순위과 결합규칙
연산자의 우선 순위
식 | 설명 |
-x + 2 | 단항 연산자 > 이항 연산자 |
x + 2 * y | 곱셈, 나눗셈 > 덧셈, 뺄셈 |
x + 2 > y - 2 | 비교 연산자 > 산술 연산자 |
x > 3 && x < 5 | 논리 연산자 > 비교 연산자 |
result = x + y * 2; | 대입 연산자는 가장 후순위 |
x << 2 + 1 | 덧셈 연산자 > 쉬프트 연산자 |
data & 0xFF == 0 | 비교 연산자 > 비트 연산자 |
x < -1 || x > 3 && x < 5 | &, && > |, || |
1. 산술 > 비교 > 논리 > 대입
2. 단항 > 이항 > 삼항
3. 단항 연산자와 대입 연산자를 제외, 모든 연산의 진행 방향은 왼쪽 → 오른쪽
연산자의 결합 규칙
종류 | 결합규칙 | 연산자 | 우선순위 |
단항 연산자 | <- | ++ -- + - ~ ! (type) | 높음 |
산술 연산자 | -> | * / % + - << >> | |
비교 연산자 | -> | < > <= >= instanceof == != | |
논리 연산자 | -> | & ^ | && || | |
삼항 연산자 | -> | ?: | |
대입 연산자 | <- | = += -= *= /= %= <<= >>= &= ^= |= | 낮음 |
산술 변환 (Usual Arithmetic Conversion)
연산 전 피연산자들의 타입을 서로 일치시키기 위해 자동 형변환이 되는 것
•
산술 변환의 규칙
1.
두 피연산자의 타입을 같게(값손실 방지를 위해 보다 큰 타입으로)
long + int -> long + long -> long
float + int -> float + float -> float
double + float -> double + double -> double
Java
2.
피연산자의 타입이 int보다 작은 타입이면 int로 변환(효율적 처리와 오버플로우 방지)
byte + short -> int + int -> int
char + short -> int + int -> int
Java
3.
연산 결과의 타입은 통일된 피연산자의 타입으로
int / int -> int
11 / 2 -> 5
int / (float)int -> int / float -> float / float -> float
11 / (float)2 -> 11 / 2.0f -> 11.0f / 2.0f -> 5.5f
Java
3.
쉬프트(<<, >>)와 증감(++, --) 연산자는 산술 변환에서 제외