[java] 논리연산자 &&,||와 비트연산자 &,| 차이

알고리즘 문제 풀이 중 아무 생각없이 논리연산자인 &&와 ||를 사용했다.
비트연산자도 논리연산자처럼 쓰이기 때문에 & , | 와의 차이점을 알고있었는데, 습관적으로 && 와 || 만 쓰다보니 어느 상황에 어떤 연산자를 써야하는지 헷갈렸다.
이번 기회에 확실히 정리해보자.


1. 비트 연산자

& , |비트 연산자이다.
그러나 JAVA 에서는 논리 연산자처럼 사용 가능하다.
왜냐하면 결과 값이 ||와 &&를 사용했을 때와 같기 때문이다.


  • | : 비트 비교시, 하나라도 1이면 1을 반환한다.

          0 | 0 == 0
          0 | 1 == 1
          1 | 0 == 1
          1 | 1 == 1


  • & : 비트 비교시, 두 비트 모두가 1인 경우만 1을 반환한다.

          0 & 0 == 0
          0 & 1 == 0
          1 & 0 == 0
          1 & 1 == 1




2. 논리 연산자

논리 연산자는 논리식을 판단하여, 참(true)과 거짓(false)을 반환한다.


  • || : 논리식 중에서 하나라도 참이면 참(1)을 반환한다. (OR 연산)
  • && : 논리식이 모두 참이면 참(1)을 반환한다. (AND 연산)






3. &,| 와 &&,|| 연산자의 차이점

이 둘은 모두 같은 결과를 반환한다.
&와 &&는 모든 조건이 참일 때만 참이고, |와 ||는 하나의 조건만 참이면 참이다.


이 둘의 차이점은

&와 |는 이미 앞에서 조건식의 결과가 결정이 나도, 뒤의 조건까지 끝까지 검사한다는 점이다.

따라서 결과값이 달라질 수 있으니 잘 구분해서 사용해야 한다.

int A = 1;
String B = null;

if(A==0 && B=="b") { //왼쪽이 false이므로 오른쪽 조건체크 x
	System.out.println("&& : good");
} 
if(A==0 & B=="b") { //왼쪽이 false여도 오른쪽 조건체크 o
	System.out.println("& : good");
}

[출력 결과]
&& : good (정상적으로 출력)
NullPointerException 예외 발생




int A = 1;
String B = null;

if(A==1 || B=="b") { //왼쪽이 true이므로 오른쪽 조건체크 x
	System.out.println("|| : good");
}
if(A==1 | B=="b") { //왼쪽이 true여도 오른쪽 조건체크 o
	System.out.println("| : good");
}

[출력 결과]
|| : good (정상적으로 출력)
NullPointerException 예외 발생


⇒ 일반적인 경우는 같은 결과값이 출력되겠지만, String 변수 B의 값이 null인 경우 결과값이     달라지는 것을 볼 수 있다.
    따라서 NullPointerException 예외처리를 하고싶으면 둘을 구분해서 써야한다!!




참고링크 |
탐P슨님 blog


Categories:

Updated:

Leave a comment