[Java] 연산자
▶ 들어가기 전에
프로그래밍에서 연산자는 필수적인 요소 중 하나이다. 그러므로 이번 포스팅에서 연산자에 대해 개념을 정리하고 실수하기 쉬운 부분을 정리하고자 한다.
▶ 연산자란?
연산자(Operator)는 '연산을 수행하는 기호'를 말한다.
자바에서 연산자는 사칙연산(+, -, *, /)을 비롯해서 다양한 연산자들을 제공한다.
연산자가 연산을 수행할 때 대상이 되는 연산 대상을 피연산자(Operand)라고 한다.
피연산자에는 변수, 상수, 리터럴, 수식 등이 있다.
연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.
1. 연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >> | 사칙 연산과 나머지 연산 |
비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! & | ^ ~ | '그리고(AND)'와 '또는(OR)'으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ? : instanceof | 형변환 연산자, 삼항 연산자, instanceof 연산자 |
2. 연산자의 결합 규칙과 우선 순위
연산자의 결합 규칙은 연산자마다 다르지만, 대부분 왼쪽에서 오른쪽으로 수행한다.
연산자의 우선 순위는 아래에 따라 정해진다.
- 산술 > 비교 > 논리 > 대입. 대입은 마지막에 수행된다.
- 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선 순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
종류 | 결합 규칙 | 연산자 | 우선순위 |
단항 연산자 | <---------- | ++ -- + - ~ ! (type) | 높음 낮음 |
산술 연산자 | ----------> | * / % | |
----------> | + - | ||
----------> | << >> | ||
비교 연산자 | ----------> | < > <= >= instanceof | |
----------> | == != | ||
논리 연산자 | ----------> | & | |
----------> | ^ | ||
----------> | | | ||
----------> | && | ||
----------> | || | ||
삼항 연산자 | ----------> | ? : | |
대입 연산자 | <---------- | = += -= *= /= %= <<= >>= &= ^= |= |
3. 산술 변환
연산 수행 직전에 발생하는 피연산자의 자동 형변환
- 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
▶ 단항 연산자
증감 연산자 ++ --
- 증가 연산자(++): 피연산자의 값을 1 증가시킨다.
- 감소 연산자(--): 피연산자의 값을 1 감소시킨다.
피연산자의 왼쪽에 위치하면 '전위형(prefix)', 오른쪽에 위치하면 '후위형(postfix)'이라고 한다.
타입 | 설명 | 사용 예 |
전위형 | 값이 참조되기 전에 증가시킨다. | j = ++i; |
후위형 | 값이 참조된 후에 증가시킨다. | j = i++; |
▶ 산술 연산자
사칙 연산자(+, -, *, /)
곱셈(*), 나눗셈(/) 연산자가 덧셈(+), 뺄셈(-) 연산자보다 우선순위가 높다.
피연산자가 정수형일 경우, 나누는 수를 0으로 할 수 없다.
아래 표는 나눗셈 연산자와 나머지 연산자의 피연산자가 무한대(Infinity) 또는 0.0인 경우의 결과이다.
x | y | x / y | x % y |
유한수 | ±0.0 | ±Infinity | NaN |
유한수 | ±Infinity | ±0.0 | X |
±0.0 | ±0.0 | NaN | NaN |
±Infinity | 유한수 | ±Infinity | NaN |
±Infinity | ±Infinity | NaN | NaN |
나머지 연산자(%)
왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자
나눗셈처럼 나누는 수로 0을 사용할 수 없다.
나머지 연산자는 주로 짝수, 홀수, 배수 검사 등에 사용됨.
▶ 비교 연산자
대소비교 연산자
- > : 좌변 값이 크면 true, 아니면 false
- < : 좌변 값이 작으면 true, 아니면 false
- >= : 좌변 값이 크거나 같으면 true, 아니면 false
- <= : 좌변 값이 작거나 같으면 true, 아니면 false
등가비교 연산자
- == : 두 값이 같으면 true, 아니면 false
- != : 두 값이 다르면 true, 아니면 false
0.1 == 0.1f 의 결과는 false이다.
0.1f는 2진수로 저장시 오차가 발생하는 수이기 때문에
float f = 0.1f // f에 0.10000000149011612로 저장된다.
double d = 0.1; // d에 0.10000000000000001로 저장된다.
문자열의 비교는 == 대신 equals() 메서드를 사용해야 한다.
▶ 논리 연산자
- || (OR 결합) : 피연산자 중 어느 한 쪽만 true이면 true를 결과로 얻는다.
- && (AND 결합) : 피연산자 양 쪽 모두 true이어야 true를 결과로 얻는다.
효율적인 연산
OR 연산(||)의 경우, 두 피연산자 중 하나라도 참이면 결과가 참이 된다.
그러므로 좌측 피연산자가 참일 경우 우측 피연산자의 값은 연산하지 않는다.
AND 연산(&&)의 경우, 두 피연산자 중 하나라도 거짓이면 결과가 거짓이 된다.
그러므로 좌측 피연산자가 거짓일 경우 우측 피연산자의 값은 연산하지 않는다.
이를 통해 중요한 피연산자 연산을 좌측에 두게 되면 더 효율적인 연산이 가능해진다.
▶ 비트 연산자
- | (OR 연산자) : 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
- & (AND 연산자) : 피연산자 중 양 쪽의 값이 모두 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
- ^ (XOR 연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
비트 전환 연산자 ~
이 연산자는 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다. !와 유사하다.
쉬프트 연산자 << >>
피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동(shift)한다고 해서 쉬프트 연산자라고 부른다.
❶ 10진수 8은 2진수로 '00001000' 이다.
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
❷ '8 << 2'는 10진수 8의 2진수를 왼쪽으로 2자리 이동시킨다.
0 | 0 | 0 | 0 | 1 | 0 |
❸ 자리이동으로 인해 저장범위를 벗어난 값는 버려지고, 빈자리는 0으로 채워진다.
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
❹ '8 << 2'의 결과는 2진수로 '00100000'이 된다. (10진수로 32)
- x << n은 x * 2^n 결과와 같다.
- x >> n은 x / 2^n 결과와 같다.
'BackEnd > Java' 카테고리의 다른 글
[Java] 배열 (0) | 2022.06.19 |
---|---|
[Java] 조건문과 반복문 (0) | 2022.06.11 |
[Java] 변수 (Variable) (0) | 2022.05.29 |
[Java] JVM (0) | 2022.04.30 |
[Java] Java란? (0) | 2022.04.30 |