Java 에서 Boolean 이 Null 인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 Boolean 객체를 사용할 때 null 값을 안전하게 처리하는 방법을 배우게 됩니다. boolean 기본형 타입과 비교하여 Boolean 래퍼 클래스를 다룰 때 NullPointerException의 잠재적인 위험성을 살펴볼 것입니다.

Boolean 객체의 값에 접근하기 전에 null인지 확인하는 올바른 방법, 보다 강력한 null 처리를 위해 Optional 클래스를 활용하는 방법, 그리고 실제 예제를 통해 boolean 기본형과 Boolean 래퍼 클래스 간의 null 동작의 주요 차이점을 이해하게 될 것입니다.

Boolean 객체의 Null 여부 확인

이 단계에서는 Java 에서 Boolean 객체를 사용할 때 잠재적인 null 값을 처리하는 방법을 살펴보겠습니다. 항상 true 또는 false 값을 갖는 기본형 boolean 타입과 달리, Boolean 래퍼 클래스는 null 값을 가질 수 있습니다. 주의해서 처리하지 않으면 이는 NullPointerException 오류의 흔한 원인이 됩니다.

이를 보여주는 간단한 Java 프로그램을 만들어 보겠습니다.

  1. WebIDE 편집기를 엽니다.

  2. 왼쪽의 파일 탐색기에서 ~/project 디렉토리에 있는지 확인합니다.

  3. 파일 탐색기의 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 "새 파일"을 선택한 다음 BooleanCheck.java로 이름을 지정합니다.

  4. 편집기에서 BooleanCheck.java 파일을 엽니다.

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

    public class BooleanCheck {
        public static void main(String[] args) {
            Boolean myBoolean = null;
    
            // This will cause a NullPointerException if myBoolean is null
            // if (myBoolean) {
            //     System.out.println("myBoolean is true");
            // }
    
            // Correct way to check for null before accessing the boolean value
            if (myBoolean != null && myBoolean) {
                System.out.println("myBoolean is true");
            } else if (myBoolean == null) {
                System.out.println("myBoolean is null");
            } else {
                System.out.println("myBoolean is false");
            }
        }
    }

    이 코드에서:

    • Boolean 객체 myBoolean을 선언하고 null로 초기화합니다.
    • 주석 처리된 if (myBoolean) 라인은 myBooleannull일 때 NullPointerException을 유발하는 흔한 실수를 보여줍니다.
    • if (myBoolean != null && myBoolean) 라인은 부울 값을 평가하기 전에 Boolean 객체가 null이 아닌지 확인하는 올바른 방법을 보여줍니다. && 연산자는 단락 연산자이므로, myBoolean != null이 false 이면 두 번째 부분 (myBoolean) 은 평가되지 않아 오류를 방지합니다.
  6. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  7. WebIDE 하단의 터미널을 엽니다. cd ~/project 명령을 사용하여 ~/project 디렉토리에 있는지 확인합니다.

  8. 다음 명령을 입력하고 Enter 키를 눌러 Java 프로그램을 컴파일합니다.

    javac BooleanCheck.java

    오류가 없으면 아무런 출력도 표시되지 않습니다. ~/project 디렉토리에 BooleanCheck.class 파일이 생성됩니다.

  9. 다음 명령을 입력하고 Enter 키를 눌러 컴파일된 프로그램을 실행합니다.

    java BooleanCheck

    다음 출력을 볼 수 있습니다.

    myBoolean is null

    이 출력은 프로그램이 myBooleannull임을 올바르게 식별하고 NullPointerException을 피했음을 확인합니다. Boolean 객체로 null을 처리하는 방법을 이해하는 것은 견고한 Java 코드를 작성하는 데 매우 중요합니다.

Null 처리를 위한 Optional 사용

이 단계에서는 Java 8 에 도입된 Optional 클래스를 사용하여 Java 에서 잠재적인 null 값을 처리하는 보다 현대적인 접근 방식을 살펴보겠습니다. Optional은 null 이 아닌 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너 객체입니다. 이는 값이 없을 수 있음을 명확하게 나타내는 방법을 제공하여 NullPointerException 오류를 방지하고 코드를 더 읽기 쉽게 만듭니다.

이전 예제를 수정하여 Optional<Boolean>을 사용해 보겠습니다.

  1. WebIDE 편집기에서 BooleanCheck.java 파일을 엽니다.

  2. 파일의 전체 내용을 다음 새 코드로 바꿉니다.

    import java.util.Optional;
    
    public class BooleanCheck {
        public static void main(String[] args) {
            // Creating an Optional that contains a Boolean value
            Optional<Boolean> optionalBooleanPresent = Optional.of(true);
    
            // Creating an Optional that is empty (represents null)
            Optional<Boolean> optionalBooleanEmpty = Optional.empty();
    
            // Handling the present Optional
            if (optionalBooleanPresent.isPresent()) {
                System.out.println("optionalBooleanPresent has a value: " + optionalBooleanPresent.get());
            } else {
                System.out.println("optionalBooleanPresent is empty");
            }
    
            // Handling the empty Optional
            if (optionalBooleanEmpty.isPresent()) {
                System.out.println("optionalBooleanEmpty has a value: " + optionalBooleanEmpty.get());
            } else {
                System.out.println("optionalBooleanEmpty is empty");
            }
    
            // Using orElse to provide a default value if the Optional is empty
            Boolean valueOrDefault = optionalBooleanEmpty.orElse(false);
            System.out.println("Value from optionalBooleanEmpty orElse(false): " + valueOrDefault);
    
            // Using ifPresent to perform an action only if a value is present
            optionalBooleanPresent.ifPresent(value -> System.out.println("Value is present: " + value));
        }
    }

    이 업데이트된 코드에서:

    • java.util.Optional 클래스를 가져옵니다.
    • 두 개의 Optional<Boolean> 객체를 생성합니다. 하나는 값을 포함하고 (Optional.of(true)) 다른 하나는 비어 있습니다 (Optional.empty()).
    • isPresent()를 사용하여 Optional에 값이 있는지 확인합니다.
    • get()을 사용하여 Optional에서 값을 검색합니다. 참고:Optional에서 get()을 호출하면 NoSuchElementException이 발생하므로 항상 먼저 isPresent()로 확인하거나 다른 Optional 메서드를 사용하십시오.
    • orElse(false)를 보여줍니다. 이는 값이 있으면 포함된 값을 반환하고, 그렇지 않으면 지정된 기본값 (이 경우 false) 을 반환합니다.
    • ifPresent()를 보여줍니다. 이는 람다 표현식을 사용하고 Optional에 값이 있는 경우에만 실행합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. WebIDE 하단의 터미널을 엽니다. cd ~/project 명령을 사용하여 ~/project 디렉토리에 있는지 확인합니다.

  5. 다음 명령을 입력하고 Enter 키를 눌러 Java 프로그램을 컴파일합니다.

    javac BooleanCheck.java

    컴파일이 성공하면 새 BooleanCheck.class 파일이 생성됩니다.

  6. 다음 명령을 입력하고 Enter 키를 눌러 컴파일된 프로그램을 실행합니다.

    java BooleanCheck

    다음 출력을 볼 수 있습니다.

    optionalBooleanPresent has a value: true
    optionalBooleanEmpty is empty
    Value from optionalBooleanEmpty orElse(false): false
    Value is present: true

    이 출력은 Optional을 사용하여 null을 사용하는 것보다 더 명시적이고 안전한 방식으로 값의 존재 또는 부재를 처리하는 방법을 보여줍니다. Optional을 사용하면 코드를 더 명확하게 만들고 NullPointerException의 발생 가능성을 줄일 수 있습니다.

Primitive 타입 vs Wrapper 타입 테스트

이 단계에서는 Java 의 기본형 boolean 타입과 Boolean 래퍼 클래스의 주요 차이점을 강조하고, 특히 null이 될 수 있는지 여부에 대해 살펴보겠습니다. 부울 값을 사용할 때 NullPointerException을 피하려면 이러한 차이점을 이해하는 것이 중요합니다.

  • 기본형 boolean: 이는 Java 의 기본 데이터 타입입니다. true 또는 false의 두 값 중 하나만 가질 수 있습니다. 기본형 boolean 변수는 절대 null이 될 수 없습니다.
  • Boolean 래퍼 클래스: 이는 기본형 boolean 값을 래핑하는 객체입니다. 객체이므로 Boolean 변수는 Boolean 객체에 대한 참조 ( true 또는 false를 포함) 를 가질 수 있거나 null 값을 가질 수 있습니다.

이러한 차이점을 보여주는 간단한 프로그램을 만들어 보겠습니다.

  1. WebIDE 편집기를 엽니다.

  2. 왼쪽의 파일 탐색기에서 ~/project 디렉토리에 있는지 확인합니다.

  3. 파일 탐색기의 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 "새 파일"을 선택한 다음 PrimitiveVsWrapper.java로 이름을 지정합니다.

  4. 편집기에서 PrimitiveVsWrapper.java 파일을 엽니다.

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

    public class PrimitiveVsWrapper {
        public static void main(String[] args) {
            // Declaring a primitive boolean
            boolean primitiveBoolean = true;
    
            // Declaring a Boolean wrapper object
            Boolean wrapperBoolean = null; // Wrapper can be null
    
            System.out.println("Primitive boolean value: " + primitiveBoolean);
    
            // Checking if the wrapper Boolean is null before printing
            if (wrapperBoolean == null) {
                System.out.println("Wrapper Boolean is null");
            } else {
                System.out.println("Wrapper Boolean value: " + wrapperBoolean);
            }
    
            // Attempting to assign null to a primitive boolean will cause a compile-time error
            // primitiveBoolean = null; // Uncommenting this line will cause an error
        }
    }

    이 코드에서:

    • 기본형 boolean을 선언하고 true로 초기화합니다.
    • Boolean 래퍼 객체를 선언하고 null로 초기화합니다. 이는 래퍼 클래스에 유효합니다.
    • 기본형 부울 값을 출력합니다.
    • 래퍼 부울 값을 출력하기 전에 null인지 확인하여 래퍼 타입에 대한 null 검사의 필요성을 보여줍니다.
    • 주석 처리된 라인은 null을 기본형 boolean에 할당할 수 없음을 보여줍니다. 이 줄의 주석 처리를 해제하고 컴파일을 시도하면 컴파일 오류가 발생합니다.
  6. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  7. WebIDE 하단의 터미널을 엽니다. cd ~/project 명령을 사용하여 ~/project 디렉토리에 있는지 확인합니다.

  8. 다음 명령을 입력하고 Enter 키를 눌러 Java 프로그램을 컴파일합니다.

    javac PrimitiveVsWrapper.java

    오류가 없으면 PrimitiveVsWrapper.class 파일이 생성됩니다.

  9. 다음 명령을 입력하고 Enter 키를 눌러 컴파일된 프로그램을 실행합니다.

    java PrimitiveVsWrapper

    다음 출력을 볼 수 있습니다.

    Primitive boolean value: true
    Wrapper Boolean is null

    이 출력은 기본형 boolean이 값 (true) 을 보유하는 반면, Boolean 래퍼 객체는 null을 보유할 수 있음을 명확하게 보여줍니다. 이러한 차이점은 Java 프로그램을 설계하고 잠재적인 누락된 값을 처리할 때 중요합니다.

요약

이 Lab 에서는 Java 에서 Boolean 객체를 사용할 때 잠재적인 null 값을 처리하는 방법을 배웠습니다. 기본형 boolean 타입과 달리 Boolean 래퍼 클래스는 null이 될 수 있으며, 이는 NullPointerException 오류로 이어질 수 있음을 확인했습니다. != null 검사를 논리적 AND 연산자 (&&) 와 결합하여 Boolean 객체가 null이 아닌지 확인하는 올바른 방법을 시연했습니다. 이렇게 하면 객체가 null 이 아닌 경우에만 부울 값이 평가되어 런타임 오류를 방지할 수 있습니다.