본문 바로가기

Java/Java SE, EE

[Java/Java SE, EE] 논리 연산자

논리 연산자

논리 연산자에는 논리 부정(NOT), 논리 곱(AND), 논리 합(OR) 그리고 배타적 논리 합(XOR)이 있습니다. 논리 연산자는 피연산자가 boolean 타입인 경우에만 사용 할 수 있습니다.

구분 연산자 항의 개수 연산식 결과
논리 ! 단항 논리 부정(NOT), 피연산자가 true인 경우 false, 그 반대의 경우 true
논리 & 또는 && 이항 논리 곱(AND), 두 피연산자 모두 true인 경우 true
논리 | 또는 || 이항 논리 합(OR), 두 피연산자 중 하나라도 true인 경우 true, 모두 false인 경우 false
논리 ^ 이항 배타적 논리 합(XOR), 두 피연산자가 서로 다르면 true, 같으면 false

논리 부정(NOT)

논리 부정 연산자는 피연산자의 왼쪽에 위치하는 전위 연산자에 속합니다. 피연산자의 값이 true인 경우 false로, 그 반대의 경우 true를 반환합니다. 일반적으로 조건문에서 조건식의 값을 부정하는 경우를 검사하기 위한 용도 또는 상태 스위치를 토글(toggle) 하기 위해 사용합니다.

boolean b = true;

// if b = false
if (!b) {
   // then toggle b
   b = !b;
}

논리 곱(AND)

두 개의 피연산자 값이 모두 true인 경우 true, 하나라도 false인 경우 false를 반환합니다. 논리 곱 연산자에는 & 연산자와 && 연산자가 있습니다. & 와 && 연산자의 산출 결과는 동일하지만, 연산 과정에서 차이가 있습니다.

public static void test() {
   int seq = 0;
   // print sequence : 1
   // print sequence : 2
   if (func(++seq) & func(++seq)) { }
   
   seq = 0;
   // print sequence : 1
   if (func(++seq) && func(++seq)) { }
}

public static boolean func(int _seq) {
   System.out.println("sequence : " + _seq);
   return false;
}

 

& 연산자의 경우 두 개의 피연산자를 모두 검사합니다. 첫 번째 피연산자가 false인 경우에 논리 곱의 산출 결과는 항상 false 임에도 불구하고, 두 번째 피연산자를 검사하게 됩니다.

반면, &&  연산자의 경우 첫 번째 피연산자가 false인 경우 다음 피연산자를 검사하지 않습니다. 논리 곱의 산출 결과가 항상 false이기 때문에 두 번째 피연산자를 검사하지 않더라도 산출 결과는 무결하며, 성능상으로도 더 효율적입니다.

논리 합(OR)

두 개의 피연산자 값 중 하나라도 true인 경우 true, 모두 false인 경우 false를 반환합니다. 논리 합 연산자는 | 연산자와 || 연산자가 있습니다. | 와 || 연산자 역시 논리 곱 연산자처럼 산출 결과는 동일하지만 연산 과정에서 차이가 있습니다.

public static void test() {
   int seq = 0;
   // print sequence : 1
   // print sequence : 2
   if (func(++seq) | func(++seq)) { }
   
   seq = 0;
   // print sequence : 1
   if (func(++seq) || func(++seq)) { }
}

public static boolean func(int _seq) {
   System.out.println("sequence : " + _seq);
   return true;
}

| 와 || 연산자의 연산 과정은 논리 곱 연산자와 동일합니다. | 연산자는 두 개의 피연산자를 모두 검사하며, || 연산자는 첫 번째 피연산자 값이 true인 경우 다음 피연산자를 검사하지 않습니다. 마찬가지로 || 연산자가 | 연산자에 비해 더 효율적입니다.

배타적 논리 합(XOR)

두 피연산자가 서로 다르면 true, 같으면 false를 리턴합니다.

boolean a = true;
boolean b = false;

System.out.println(a ^ a);		// false
System.out.println(a ^ b);		// true
System.out.println(b ^ b);		// false