HOWTO · Java

Java에서 AND 및 OR 연산자 사용하기

Java의 &&와 ||로 불리언 조건을 결합하고 단락 평가와 &·|의 차이를 이해합니다.

이 페이지의 내용

&&는 모든 조건이 참이어야 할 때, ||는 하나만 참이면 될 때 사용합니다. 두 연산자는 단락 평가를 수행하므로 오른쪽 값이 결과를 바꿀 수 있을 때만 평가합니다. 따라서 text != null && !text.isEmpty()에서는 text가 null이면 isEmpty()를 호출하지 않습니다.

!는 불리언 조건을 반전합니다. Java는 boolean 또는 Boolean을 요구하며 숫자나 문자열을 자동으로 참·거짓으로 바꾸지 않습니다. Java Language Specification에 규칙이 있습니다.

&&, ||, ! 선택하기

&&는 두 피연산자가 모두 참일 때만 참이고, ||는 하나가 참이면 참입니다. 아래 프로그램은 Polyglot의 OpenJDK 11.0.32에서 컴파일하고 실행했습니다.

public class LogicalOperators {
    public static void main(String[] args) {
        boolean hasTicket = true;
        boolean isMember = false;

        System.out.println("ticket && member: " + (hasTicket && isMember));
        System.out.println("ticket || member: " + (hasTicket || isMember));
        System.out.println("!member: " + !isMember);

        int age = 20;
        boolean canEnter = age >= 18 && age <= 65;
        System.out.println("can enter: " + canEnter);
    }
}
ticket && member: false
ticket || member: true
!member: true
can enter: true

null을 먼저 검사하기

public class ShortCircuitBoundary {
    public static void main(String[] args) {
        String text = null;

        boolean safe = text != null && !text.isEmpty();
        System.out.println("&& with null: " + safe);

        try {
            boolean unsafe = text != null & !text.isEmpty();
            System.out.println("& with null: " + unsafe);
        } catch (NullPointerException exception) {
            System.out.println("& with null: NullPointerException");
        }
    }
}
&& with null: false
& with null: NullPointerException

&&에서는 왼쪽의 false가 결과를 결정하므로 오른쪽을 역참조하지 않습니다. &는 양쪽을 모두 평가하므로 여기서는 표시한 예외가 발생합니다. Scanner.nextLine()은 null을 반환하지 않으며, 이 가드는 null일 수 있는 반환값·설정·필드에 사용합니다.

단락 평가가 보호하지 않는 경우

단락 평가는 왼쪽만으로 결과가 정해질 때 오른쪽만 건너뜁니다. Boolean enabled = null에는 enabled != null && enabled 검사가 필요합니다. enabled && otherCondition은 언박싱 중 NullPointerException을 낼 수 있습니다. 반드시 수행해야 하는 작업을 건너뛸 수 있는 쪽에 두지 마세요.

&&를 &로 바꾸지 않기

&와 |는 boolean에 사용할 수 있지만 항상 양쪽을 평가하고, 정수에서는 비트 연산자이기도 합니다. 일반 가드에는 &&와 ||를 사용하고, 단락 평가로 건너뛸 수 있는 index++ 같은 부작용을 조건에 넣지 마세요.