논리 연산자
논리 연산자에는 논리 부정(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
'Java > Java SE, EE' 카테고리의 다른 글
[Java/Java SE, EE] 비트 시프트 연산자 (0) | 2022.01.16 |
---|---|
[Java/Java SE, EE] 비트 논리 연산자 (0) | 2022.01.11 |
[Java/Java SE, EE] 부호(+, -) 연산자 (0) | 2022.01.10 |
[Java/Java SE, EE] 증감(++, --) 연산자 (0) | 2022.01.10 |
[Java/Java SE, EE] 산술 연산자 (0) | 2022.01.10 |