Java 에서 Boolean 객체가 Null 인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 Boolean 래퍼 객체가 null인지 안전하게 확인하는 방법을 배우게 됩니다. 기본형 boolean 타입과 달리, Boolean 클래스는 null 값을 가질 수 있으며, 이를 제대로 처리하지 않으면 NullPointerException이 발생할 수 있습니다.

직접적인 null 검사, null 과 true/false 검사 결합, 그리고 더 강력한 null 처리를 위한 Optional 클래스 활용 등, null Boolean 객체를 처리하는 다양한 기술을 살펴볼 것입니다. 이 랩을 마치면 Java 에서 Boolean 래퍼 객체를 사용할 때 흔히 발생하는 문제점을 피할 수 있게 될 것입니다.

Boolean 래퍼 Null 여부 테스트

이 단계에서는 Java 에서 Boolean 래퍼 객체를 처리하는 방법을 살펴보고, 특히 Boolean 객체가 null인지 확인하는 데 중점을 둡니다. true 또는 false만 가질 수 있는 기본형 boolean 타입과 달리, Boolean 래퍼 클래스는 null 값도 가질 수 있습니다. 주의해서 처리하지 않으면 이는 NullPointerException의 흔한 원인이 됩니다.

이를 시연하기 위해 간단한 Java 프로그램을 만들어 보겠습니다.

  1. WebIDE 의 왼쪽 파일 탐색기에서 ~/project 디렉토리를 엽니다.

  2. ~/project 디렉토리 내의 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 "New File"을 선택합니다.

  3. 새 파일의 이름을 BooleanCheck.java로 지정하고 Enter 키를 누릅니다.

  4. Code Editor 에서 BooleanCheck.java 파일을 엽니다.

  5. 다음 Java 코드를 복사하여 편집기에 붙여넣습니다.

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean myBoolean = null;
    
            // Attempting to directly use a null Boolean in a conditional
            // will cause a NullPointerException
            // if (myBoolean) {
            //     System.out.println("This will not be printed if myBoolean is null.");
            // }
    
            // Correct way to check if a Boolean wrapper is null
            if (myBoolean == null) {
                System.out.println("myBoolean is null.");
            } else {
                System.out.println("myBoolean is not null.");
            }
    
            // Another way to check the boolean value safely
            if (Boolean.TRUE.equals(myBoolean)) {
                 System.out.println("myBoolean is true.");
            } else if (Boolean.FALSE.equals(myBoolean)) {
                 System.out.println("myBoolean is false.");
            } else {
                 System.out.println("myBoolean is null (checked using equals).");
            }
        }
    }
  6. Ctrl + S (Mac 에서는 Cmd + S) 를 눌러 파일을 저장합니다.

  7. 이제 Java 프로그램을 컴파일해 보겠습니다. WebIDE 하단의 터미널을 엽니다. ~/project 디렉토리에 있는지 확인합니다. 그렇지 않은 경우, cd ~/project를 입력하고 Enter 키를 누릅니다.

  8. javac 명령을 사용하여 코드를 컴파일합니다.

    javac BooleanCheck.java

    오류가 없으면 명령이 출력 없이 완료됩니다. 이는 ~/project 디렉토리에 BooleanCheck.class 파일이 생성되었음을 의미합니다.

  9. java 명령을 사용하여 컴파일된 Java 프로그램을 실행합니다.

    java BooleanCheck
  10. 터미널에서 다음 출력을 볼 수 있습니다.

    myBoolean is null.
    myBoolean is null (checked using equals).

이 출력은 == null 검사 및 Boolean.TRUE.equals() / Boolean.FALSE.equals() 패턴을 사용하여 코드가 Boolean 객체를 null로 올바르게 식별했음을 확인합니다. 주석 처리된 코드는 null Booleanif 조건에서 직접 사용하려고 시도할 경우 발생할 수 있는 상황을 보여주며, 이는 NullPointerException을 발생시킵니다.

null Boolean 객체를 안전하게 처리하는 방법을 이해하는 것은 Java 프로그래밍에서 흔한 오류를 피하는 데 매우 중요합니다.

Null 및 True/False 확인 결합

이전 단계에서 Boolean 객체가 null인지 확인하는 방법을 살펴보았습니다. 종종 Booleantrue, false 또는 null인지 확인해야 합니다. 이러한 검사를 효율적이고 안전하게 결합하는 것이 중요합니다.

세 가지 가능성을 모두 처리하는 방법을 보여주기 위해 BooleanCheck.java 프로그램을 수정해 보겠습니다.

  1. Code Editor 에서 BooleanCheck.java 파일이 아직 열려 있지 않은 경우 엽니다. ~/project 디렉토리에 있어야 합니다.

  2. BooleanCheck.java의 기존 코드를 다음 코드로 바꿉니다. 이 버전에는 null, true, 및 false Boolean 값에 대한 예제가 포함되어 있습니다.

    public class BooleanCheck {
    
        public static void main(String[] args) {
            Boolean booleanValue1 = null;
            Boolean booleanValue2 = true;
            Boolean booleanValue3 = false;
    
            System.out.println("Checking booleanValue1 (null):");
            checkBoolean(booleanValue1);
    
            System.out.println("\nChecking booleanValue2 (true):");
            checkBoolean(booleanValue2);
    
            System.out.println("\nChecking booleanValue3 (false):");
            checkBoolean(booleanValue3);
        }
    
        // A helper method to demonstrate the checks
        public static void checkBoolean(Boolean value) {
            if (value == null) {
                System.out.println("Value is null.");
            } else if (value) { // This is safe because we already checked for null
                System.out.println("Value is true.");
            } else { // If not null and not true, it must be false
                System.out.println("Value is false.");
            }
    
            // Another common pattern using equals for safety
            System.out.print("Using equals: ");
            if (Boolean.TRUE.equals(value)) {
                 System.out.println("Value is true.");
            } else if (Boolean.FALSE.equals(value)) {
                 System.out.println("Value is false.");
            } else {
                 System.out.println("Value is null.");
            }
        }
    }

    이 업데이트된 코드에서:

    • Boolean 객체를 입력으로 받는 도우미 메서드 checkBoolean을 정의합니다.
    • checkBoolean 내부에서 먼저 value == null을 사용하여 valuenull인지 확인합니다.
    • null이 아닌 경우, value를 사용하여 부울 값이 true인지 안전하게 확인합니다. Java 는 래퍼가 null이 아닌 경우에만 Boolean 래퍼를 기본형 boolean으로 자동 언박싱하기 때문에 이 방법이 작동합니다.
    • null이 아니고 true도 아닌 경우, false여야 하며, 이는 else 블록에서 처리됩니다.
    • 또한 Boolean.TRUE.equals(value)Boolean.FALSE.equals(value) 패턴을 다시 포함합니다. 이는 특히 equals가 호출되는 객체가 null인 경우 잠재적인 NullPointerException을 방지하려는 경우에 유용한, 값을 확인하는 또 다른 안전한 방법입니다.
  3. 파일을 저장합니다 (Ctrl + S 또는 Cmd + S).

  4. 터미널에서 수정된 프로그램을 컴파일합니다.

    javac BooleanCheck.java
  5. 컴파일된 프로그램을 실행합니다.

    java BooleanCheck
  6. 다음 출력을 볼 수 있으며, 코드가 각 경우를 처리하는 방식을 보여줍니다.

    Checking booleanValue1 (null):
    Value is null.
    Using equals: Value is null.
    
    Checking booleanValue2 (true):
    Value is true.
    Using equals: Value is true.
    
    Checking booleanValue3 (false):
    Value is false.
    Using equals: Value is false.

이 단계에서는 null, true, 및 false 값을 고려하여 Boolean 래퍼 객체의 상태를 확인하는 강력한 방법을 보여줍니다. 이는 안전하고 신뢰할 수 있는 Java 코드를 작성하기 위한 기본적인 기술입니다.

Optional 클래스 활용

최신 Java (Java 8 이상) 에서는 Optional 클래스가 종종 값이 존재할 수도 있고 존재하지 않을 수도 있는 값을 나타내는 데 사용됩니다. 이렇게 하면 값이 누락될 수 있는 경우를 명시적으로 만들어 코드에서 NullPointerException의 수를 줄이는 데 도움이 될 수 있습니다. Optional<Boolean>이 항상 가장 일반적인 사용 사례는 아니지만, OptionalBoolean과 같은 래퍼 타입에 적용하는 방법을 이해하는 좋은 방법입니다.

이 단계에서는 Optional<Boolean>을 사용하여 누락된 부울 값의 가능성을 처리하도록 프로그램을 수정합니다.

  1. Code Editor 에서 BooleanCheck.java 파일을 엽니다. ~/project 디렉토리에 있어야 합니다.

  2. Optional<Boolean>을 사용하는 다음 코드로 기존 코드를 바꿉니다.

    import java.util.Optional;
    
    public class BooleanCheck {
    
        public static void main(String[] args) {
            Optional<Boolean> optionalBoolean1 = Optional.empty(); // Represents no value
            Optional<Boolean> optionalBoolean2 = Optional.of(true); // Represents the value true
            Optional<Boolean> optionalBoolean3 = Optional.of(false); // Represents the value false
    
            System.out.println("Checking optionalBoolean1 (empty):");
            checkOptionalBoolean(optionalBoolean1);
    
            System.out.println("\nChecking optionalBoolean2 (true):");
            checkOptionalBoolean(optionalBoolean2);
    
            System.out.println("\nChecking optionalBoolean3 (false):");
            checkOptionalBoolean(optionalBoolean3);
        }
    
        // A helper method to demonstrate checking Optional<Boolean>
        public static void checkOptionalBoolean(Optional<Boolean> optionalValue) {
            if (optionalValue.isPresent()) {
                // Get the boolean value if present
                Boolean value = optionalValue.get();
                if (value) {
                    System.out.println("Value is present and true.");
                } else {
                    System.out.println("Value is present and false.");
                }
            } else {
                System.out.println("Value is not present (empty Optional).");
            }
    
            // Another way using orElse
            System.out.print("Using orElse(false): ");
            boolean result = optionalValue.orElse(false);
            System.out.println("Result: " + result);
    
            // Using ifPresent
            System.out.print("Using ifPresent: ");
            optionalValue.ifPresent(val -> System.out.println("Value is present: " + val));
            if (!optionalValue.isPresent()) {
                 System.out.println("Value is not present.");
            }
        }
    }

    이 버전에서:

    • java.util.Optional 클래스를 가져옵니다.
    • 값이 없는 경우 Optional.empty()를 사용하고 값이 있는 경우 Optional.of()를 사용하여 Optional<Boolean> 객체를 생성합니다.
    • checkOptionalBoolean 메서드는 이제 Optional<Boolean>을 받습니다.
    • optionalValue.isPresent()를 사용하여 값이 있는지 확인합니다.
    • 값이 있는 경우 optionalValue.get()을 사용하여 값을 검색합니다. 참고: isPresent()를 확인한 후에만 get()을 호출하십시오. 그렇지 않으면 NoSuchElementException이 발생합니다.
    • 또한 Optional이 비어 있는 경우 기본값 (이 경우 false) 을 제공하는 orElse(false)를 시연합니다.
    • ifPresent()를 사용하면 값이 있는 경우에만 작업을 수행할 수 있습니다.
  3. 파일을 저장합니다 (Ctrl + S 또는 Cmd + S).

  4. 터미널에서 수정된 프로그램을 컴파일합니다.

    javac BooleanCheck.java
  5. 컴파일된 프로그램을 실행합니다.

    java BooleanCheck
  6. 다음 출력을 볼 수 있습니다.

    Checking optionalBoolean1 (empty):
    Value is not present (empty Optional).
    Using orElse(false): Result: false
    Using ifPresent: Value is not present.
    
    Checking optionalBoolean2 (true):
    Value is present and true.
    Using orElse(false): Result: true
    Using ifPresent: Value is present: true
    
    Checking optionalBoolean3 (false):
    Value is present and false.
    Using orElse(false): Result: false
    Using ifPresent: Value is present: false

이 출력은 Optional<Boolean>을 사용하여 부울 값의 존재 또는 부재를 명시적으로 처리하는 방법을 보여줍니다. 이는 단순히 nullable Boolean을 사용하는 것보다 잠재적으로 누락된 데이터를 처리하는 더 강력한 방법을 제공합니다.

요약

이 Lab 에서 우리는 Java 에서 Boolean 래퍼 객체가 null인지 확인하는 방법을 배웠습니다. 기본형 boolean 타입과 Boolean 래퍼 클래스의 차이점을 살펴보고, null Boolean 객체를 다룰 때 NullPointerException이 발생할 수 있음을 강조했습니다. 우리는 등가 연산자 (== null) 를 사용하여 null을 확인하는 올바른 방법을 시연했으며, Boolean.TRUEBoolean.FALSEequals() 메서드를 사용하여 부울 값을 안전하게 확인하는 방법도 보여주었습니다. 이러한 기술은 nullable Boolean 객체로 작업할 때 런타임 오류를 방지하는 데 매우 중요합니다.