HOWTO · Java
Java의 XOR 연산자
검증된 예제와 흔한 주의점을 통해 Java의 ^ 연산자를 불리언 및 정수 XOR에 사용하는 방법을 설명합니다.
이 페이지의 내용
Java에서 ^는 XOR(배타적 OR) 연산자입니다. 정확히 하나의 조건만 참이어야 할 때 boolean 값에 사용하거나, 비트 XOR가 필요할 때 정수 값에 사용합니다. 거듭제곱 연산자가 아니며 Java에는 ** 연산자가 없습니다. Java Language Specification은 두 ^ 형태를 정의합니다.
조건에는 불리언 형식을, 비트나 마스크에는 정수 형식을 선택하세요. 이 연산자는 현재 Java 릴리스에서 사용할 수 있습니다. 예제는 OpenJDK 17.0.20.1에서 실행했고, 준비 과정에서는 현재 JDK 26 릴리스 정보를 확인했습니다.
불리언 값에 XOR 사용하기
두 불리언 피연산자의 XOR은 값이 다를 때만 true입니다. 진리표는 다음과 같습니다.
| 왼쪽 | 오른쪽 | left ^ right |
|---|---|---|
false |
false |
false |
false |
true |
true |
true |
false |
true |
true |
true |
false |
&& 및 ||와 달리 ^는 두 피연산자를 모두 평가합니다. value != null && value.isReady() 같은 단락 평가 보호 조건 대신 사용하지 마세요. 메서드 호출도 여전히 평가됩니다. 두 불리언 식을 모두 안전하게 평가할 수 있고 “정확히 하나”가 규칙일 때 사용하세요.
이 검증된 예제는 불리언 XOR과 정수 XOR을 함께 보여 줍니다.
public class BooleanAndIntegerXor {
public static void main(String[] args) {
System.out.println(true ^ false);
System.out.println(true ^ true);
System.out.println(0b1100 ^ 0b1010);
}
}
출력:
true
false
6
처음 두 줄은 불리언 규칙을 보여 줍니다. 정수에서 0b1100 ^ 0b1010의 결과는 0b0110, 즉 십진수 6입니다. 입력 비트가 다른 위치에서만 결과 비트가 1이 됩니다.
정수 값과 마스크에 XOR 사용하기
비트 단위 형식은 byte, short, char, int, long 같은 정수 기본형을 받습니다. Java는 연산 전에 이항 수치 승격을 적용하므로, 작은 정수형이 포함된 식의 결과는 대개 int입니다. float와 double은 XOR 피연산자가 될 수 없습니다. 대상 형식에 정말 필요할 때만 캐스팅하세요. 캐스팅은 비트를 버릴 수 있습니다.
XOR은 선택한 비트를 토글할 때 유용합니다. flags가 정수이고 mask가 변경할 비트를 나타내면, flags ^ mask는 정확히 그 비트만 뒤집습니다. x ^ y ^ y는 x이므로 같은 마스크를 다시 적용하면 원래 비트가 복원됩니다. 이 가역성은 제어된 비트 조작에 유용하지만, 더 명확한 애플리케이션 로직을 대신하지는 않습니다.
짝이 없는 값 하나 찾기
정수 XOR은 다른 모든 값이 정확히 두 번 나타날 때 짝이 없는 값 하나를 찾는 간결한 방법입니다. x ^ x는 0이고 0 ^ x는 x이므로 같은 값은 상쇄됩니다.
public class UniqueNumberXor {
public static void main(String[] args) {
int unique = 0;
for (int value : new int[] {4, 9, 4}) {
unique ^= value;
}
System.out.println(unique);
}
}
출력:
9
이 방법은 경계 조건에 민감하며 일반적인 “고유 숫자 찾기” 알고리즘이 아닙니다. 짝이 없는 값이 하나이고 다른 모든 값이 정확히 두 번 나타날 때만 작동합니다. 예를 들어 다른 값이 세 번 나타나면 고유한 값 하나를 찾지 못합니다. 발생 규칙이 다르거나 빈도도 필요하다면 개수를 세는 방법을 선택하세요.
적합한 경우 더 명확한 대안 선택하기
두 불리언 값의 불일치를 비교할 때는 !=가 ^보다 의도를 더 직접적으로 드러낼 수 있습니다. 정수가 홀수인지 짝수인지 검사하려면 & 1을 사용하세요. 패리티 연산은 XOR이 아니라 AND입니다. XOR로 두 변수를 교환하는 것은 잘 알려진 기법이지만, Java에서는 임시 변수나 일반 대입이 더 명확하고 별칭 오류도 피합니다.
핵심 구분은 간단합니다. ^는 boolean 값에서는 배타적 OR을, 정수에서는 비트 XOR을 뜻합니다. 피연산자 형식을 확인하고, 두 불리언 쪽이 모두 평가된다는 점을 기억하며, 중복 상쇄에 의존하기 전에 데이터 가정을 명시하세요.