[Java] 연산자

2022. 6. 6. 01:18

▶ 들어가기 전에

프로그래밍에서 연산자는 필수적인 요소 중 하나이다. 그러므로 이번 포스팅에서 연산자에 대해 개념을 정리하고 실수하기 쉬운 부분을 정리하고자 한다.


 

▶ 연산자란?

연산자(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

BELATED ARTICLES

more