공부/Java

[Java-03] 연산자(Operator) - 비교 연산자, 논리 연산자, 비트 연산자

줭♪(´▽`) 2021. 2. 8. 18:25

1. 비교 연산자

1) 대소비교 연산자  <  >  <=  >=

- 기본형 중에는 boolean형을 제외한 나머지 자료형에 사용가능

- 참조형에는 사용불가

 

비교연산자 연산결과
> 좌변 값이 크면 true, 아니면 false
< 좌변 값이 작으면 true, 아니면 false
>= 좌변 값이 크거나 같으면 true, 아니면 false
<= 좌변 값이 작거나 같으면 true, 아니면 false

 

2) 등가비교 연산자  ==  !=

- 모든 자료형(기본형, 참조형)에 사용가능

※ '==' 는 대입연산자 '='과 다르다는 점에 유의

 

비교연산자 연산결과
== 두 값이 같으면 true, 아니면 false
!= 두 값이 다르면 true, 아니면 false

 

3) 문자열 비교

- 문자열을 비교할 때는 비교 연산자 '==' 대신 equals()라는 메서드를 사용해야 함

- 비교 연산자 '=='를 사용하는 것은 같은 객체인지 확인하는 것임

 

2. 논리 연산자

1) 논리 연산자  &&  ||  !

 

논리연산자 연산결과
|| (OR결합) 피연산자 중 어느 한 쪽만 true이면 true
&& (AND결합) 피연산자 양쪽 모두 true이어야 true

- 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 한느 조건식만 허용

 

- x와 y 값에 따른 논리 연산결과

x y x || y x && y
true true true true
true false true false
false true true false
false false false false

 

효율적인 연산(short circuit evaluation)

- 논리 연산자는 효율적인 연산을 함
- || (OR 연산)의 경우 피연산자 중 어느 한 쪽만 '참'이어도 전체 연산결과가 '참'이므로 다른 피연산자의 값을 평가하지 않음
- && (AND 연산)의 경우 피연산자 중 어느 한 쪽만 '거짓'이어도 전체 연산결과가 '거짓'이므로 다른 피연산자의 값을 평가하지 않음

 

2) 논리 부정 연산자  !

- 피연산자가 true이면 false를, false면 true를 결과로 반환

- !를 여러 번 사용하여 연산할 수 있음

 

3) 비트 연산자  &  |  ^ 

- 피연산자를 비트단위로 논리 연산

 

비트연산자 연산결과
| (OR연산자) 피연산자 중 한 쪽의 값이 1이면 결과는 1, 그 외에는 0
& (AND연산자) 피연산자 양 쪽이 모두 1이어야만 결과는 1
^ (XOR연산자) 피연산자의 값이 서로 다를 때만 결과는 1, 같을 때는 0

 

x y x | y x & y x ^ y
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1
0 0 0 0 0

 

4) 비트 전환 연산자  ~

- 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꿈

 

5) 쉬프트 연산자  <<  >>

- 피연산자의 각 자리를(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동(shitf)함

- '<<' : 피연산자의 부호에 상관없이 각 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채움

- '>>' : 각 자리를 오른쪽으로 이동시키며 부호있는 정수는 부호를 유지하기 위해 왼쪽 피연산자가 음수인 경우 빈자리를 1로 채우고, 양수인 경우 빈자리를 0으로 채움

- 좌측 피연산자는 int타입으로 자동 변환되고 연산결과 또한 int타입이 됨

- 우측 피연산자는 피연산자의 타입을 일치시킬 필요가 없기 때문에 산술변환이 적용되지 않음

 

x << n     =    x * 2n
x >> n     =    x / 2n

 

 

3. 그 외의 연산자

1) 조건 연산자  ?  :

1. 조건식의 평가결과가 true면 연산결과는 식1
2. 조건식의 평가결과가 false면 연산결과는 식2

 

public class Test {
	public static void main(String[] args) {
    	int x = 10, y = 5, result = 0;
        result = (x > y) ? x : y;	// 조건식이 true이므로 result는 x의 값인 10
        result = (x == y) ? 0 : 1;	// 조건식이 false이므로 result는 1
    }
}

 

- 조건 연산자를 중첩해서 사용하면 셋 이상 중의 하나를 결과로 얻을 수 있음

ex) result = x > 0 ? 1 : ( x == 0 ? 0 : -1);

- 두 피연산자의 타입이 다른 경우, 산술 변환이 발생

 

2) 대입 연산자  = 

- 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용

- 가장 낮은 우선순위를 가지고 있어 식에서 제일 나중에 수행됨

- 오른쪽에서 왼쪽으로 수행됨

- lvalue(left value) : 대입 연산자의 왼쪽 피연산자 (반드시 값을 변경할 수 있는 것, 리터럴이나 상수같은 값을 저장할 수 없는 것은 불가능)

- rvalue(right value) : 대입 연산자의 오른쪽 피연산자 (변수, 식, 상수 모두 가능)

 

3) 복합 대입 연산자  op= 

- 대입 연산자는 다른 연산자(op)와 결합하여 'op='와 같은 방식으로 사용될 수 있음

- 두 연산자는 반드시 공백없이 붙여 써야 함

ex) i = i + 3i += 3 으로 표현될 수 있음

ex) i = i * (10 + j)  i *= 10 + j 으로 표현될 수 있음

ex) +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |= 등

 

 

참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)