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

JavaBeginner
지금 연습하기

소개

이 랩에서는 NullPointerException 오류를 방지하기 위한 기본 기술인 Java 에서 객체가 null 인지 확인하는 필수적인 기술을 배우게 됩니다. 가장 기본적인 방법인 등가 연산자 (==) 를 사용하여 참조 변수를 null과 직접 비교하는 것부터 시작합니다.

이를 바탕으로, 객체의 존재 여부와 올바른 유형을 모두 확인하기 위해 null 검사를 유형 검사와 결합하는 방법을 살펴봅니다. 마지막으로, 잠재적으로 null 값을 처리하는 더 관용적이고 안전한 방법을 제공하여 더 강력하고 가독성이 좋은 코드를 장려하는 현대적인 Java 기능인 Optional 클래스를 사용하는 방법을 자세히 살펴보겠습니다.

등가 연산자를 사용하여 Null 확인

이 단계에서는 Java 에서 null을 확인하는 가장 기본적인 방법 중 하나인 등가 연산자 (==) 를 사용하는 방법을 살펴보겠습니다. Java 프로그래밍에서 오류를 방지하려면 null을 처리하는 방법을 이해하는 것이 중요합니다.

Java 에서 null은 참조 변수가 어떤 객체도 가리키지 않음을 나타내는 특수한 값입니다. 변수를 상자, 객체를 상자 안에 넣는 물건이라고 생각해보세요. 상자가 비어 있으면 변수는 null입니다. null 참조를 사용하려고 하면 (빈 상자에서 무언가를 사용하려고 하는 것과 같이) 종종 NullPointerException이 발생하며, 이는 초보자에게 흔하고 답답한 오류입니다.

등가 연산자를 사용하여 null을 확인하는 방법을 보여주는 간단한 Java 프로그램을 만들어 보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다 (아직 열려 있지 않은 경우).

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

    public class HelloJava {
        public static void main(String[] args) {
            String message = null; // String 변수를 선언하고 null 로 설정
    
            // 등가 연산자를 사용하여 message 변수가 null 인지 확인
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is: " + message);
            }
    
            message = "Hello, World!"; // String 객체를 변수에 할당
    
            // 값을 할당한 후 다시 확인
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is: " + message);
            }
        }
    }

    이 코드에서:

    • message라는 String 변수를 선언하고 처음에 null로 설정합니다.
    • 등가 연산자 (==) 가 있는 if 문을 사용하여 messagenull인지 확인합니다.
    • message == null이 true 이면 "The message is null."을 출력합니다.
    • false 이면 메시지 자체를 출력합니다.
    • 그런 다음 문자열 "Hello, World!"를 message 변수에 할당합니다.
    • 다른 출력을 보기 위해 null 검사를 다시 수행합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 터미널에서 javac 명령을 사용하여 프로그램을 컴파일합니다.

    javac HelloJava.java

    오류가 없으면 컴파일이 성공한 것입니다.

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

    java HelloJava

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

    The message is null.
    The message is: Hello, World!

    이 출력은 ==를 사용한 null 검사가 올바르게 작동했음을 확인합니다. messagenull일 때 첫 번째 if 조건이 true 였습니다. 값을 할당한 후 두 번째 if 조건은 false 였고 else 블록이 실행되었습니다.

등가 연산자 (==) 를 사용하는 것은 Java 에서 참조 변수가 null인지 확인하는 표준적이고 권장되는 방법입니다. 간단하고 명확하며 효율적입니다.

Null 및 유형 검사 결합

이 단계에서는 null 검사와 객체의 유형 검사를 결합하는 방법을 배우겠습니다. 이는 객체를 수신하고 사용하기 전에 null이 아니고 특정 유형인지 확인해야 하는 일반적인 시나리오입니다.

Java 는 객체가 특정 클래스의 인스턴스인지 또는 특정 인터페이스를 구현하는지 확인하기 위해 instanceof 연산자를 제공합니다. 논리 AND 연산자 (&&) 를 사용하여 이를 null 검사와 결합할 수 있습니다.

HelloJava.java 프로그램을 수정하여 이를 시연해 보겠습니다.

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

  2. 기존 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            Object myObject = "This is a String"; // Object 변수 선언
    
            // myObject 가 null 이 아니고 String 의 인스턴스인지 확인
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject; // Object 를 String 으로 캐스팅
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
    
            myObject = null; // 객체를 null 로 설정
    
            // null 로 설정한 후 다시 확인
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject;
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
    
            myObject = 123; // 객체를 Integer 로 설정
    
            // Integer 로 설정한 후 다시 확인
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject;
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
        }
    }

    이 업데이트된 코드에서:

    • Object 유형의 변수 myObject를 선언합니다. Object는 Java 의 모든 클래스의 기본 클래스이므로 모든 객체에 대한 참조를 가질 수 있습니다.
    • 먼저 StringmyObject에 할당합니다.
    • if 조건 myObject != null && myObject instanceof String은 두 가지를 확인합니다.
      • myObject != null: 객체 참조가 null이 아닌가요?
      • myObject instanceof String: 객체가 String 클래스의 인스턴스인가요?
    • && 연산자는 if 블록 내부의 코드가 실행되려면 두 조건이 모두 true 여야 함을 의미합니다.
    • 둘 다 true 이면 (String) myObject를 사용하여 myObjectString으로 캐스팅하고 메시지를 출력합니다. 캐스팅은 myObjectObject로 선언되었고 실제로 String임을 컴파일러에 알려야 하므로, 이를 하나로 처리할 수 있도록 필요합니다.
    • 두 조건 중 하나라도 false 이면 (객체가 null이거나 String이 아닌 경우) else 블록이 실행됩니다.
    • 그런 다음 myObjectnull로 설정한 다음 Integer로 설정하여 (이는 String이 아님) if 조건을 테스트합니다.
  3. 파일을 저장합니다.

  4. 프로그램을 컴파일합니다.

    javac HelloJava.java
  5. 프로그램을 실행합니다.

    java HelloJava

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

    The object is a non-null String: This is a String
    The object is null or not a String.
    The object is null or not a String.

    이 출력은 if 조건이 객체가 non-null String인 경우와 null이거나 String이 아닌 경우를 올바르게 식별했음을 보여줍니다.

!= nullinstanceof를 결합하는 것은 null일 수도 있는 특정 유형의 객체를 안전하게 사용해야 할 때 Java 에서 표준 패턴입니다.

Optional 을 사용하여 Null 처리

이 단계에서는 Java 8 에 도입된 Java 에서 잠재적인 null 값을 처리하는 보다 현대적인 접근 방식인 Optional 클래스를 살펴보겠습니다. Optional은 non-null 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너 객체입니다. 이는 값의 존재 또는 부재를 보다 명시적으로 나타내는 방법을 제공하여 NullPointerException의 위험을 줄이는 데 도움이 됩니다.

Optional을 사용하면 코드 전체에 흩어져 있는 null 검사에 의존하기보다는 값의 부재 가능성을 생각하고 해당 경우를 적절하게 처리하도록 권장합니다.

Optional을 사용하도록 HelloJava.java 프로그램을 수정해 보겠습니다.

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

  2. 기존 코드를 다음으로 바꿉니다.

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            // 값을 포함하는 Optional 생성
            Optional<String> optionalMessageWithValue = Optional.of("Hello from Optional!");
    
            // 비어 있는 Optional 생성 (null 을 나타냄)
            Optional<String> optionalMessageWithoutValue = Optional.empty();
    
            // 값이 있는 Optional 처리
            if (optionalMessageWithValue.isPresent()) {
                String message = optionalMessageWithValue.get(); // 값이 있으면 값 가져오기
                System.out.println("Optional with value: " + message);
            } else {
                System.out.println("Optional with value is empty.");
            }
    
            // 값이 없는 Optional 처리
            if (optionalMessageWithoutValue.isPresent()) {
                String message = optionalMessageWithoutValue.get();
                System.out.println("Optional without value: " + message);
            } else {
                System.out.println("Optional without value is empty.");
            }
    
            // ifPresent 를 사용하여 Optional 을 처리하는 보다 간결한 방법
            optionalMessageWithValue.ifPresent(msg -> System.out.println("Using ifPresent: " + msg));
    
            // Optional 이 비어 있는 경우 기본값을 제공하기 위해 orElse 사용
            String messageOrDefault = optionalMessageWithoutValue.orElse("Default Message");
            System.out.println("Using orElse: " + messageOrDefault);
        }
    }

    이 코드에서:

    • Optional 클래스를 가져옵니다.
    • Optional.of()를 사용하여 값을 포함하는 Optional<String>을 만듭니다. Optional.of()null을 전달하면 NullPointerException이 발생합니다. 값이 null일 수 있는 경우 대신 Optional.ofNullable()을 사용하십시오.
    • Optional.empty()를 사용하여 빈 Optional<String>을 만듭니다.
    • optionalMessageWithValue.isPresent()를 사용하여 Optional에 값이 있는지 확인합니다. 값이 있으면 optionalMessageWithValue.get()를 사용하여 값을 검색할 수 있습니다. 주의:Optional에서 get()을 호출하면 NoSuchElementException이 발생합니다.
    • Optional을 유사하게 처리하는 것을 보여줍니다.
    • 값이 있는 경우에만 지정된 작업을 실행하는 ifPresent()를 보여줍니다. 이는 값이 있는 경우 값에 대해 작업을 수행하는 더 깔끔한 방법입니다.
    • 값이 있으면 값을 반환하고, 그렇지 않으면 기본값을 반환하는 orElse()를 보여줍니다. 이는 대체 값을 제공하는 데 유용합니다.
  3. 파일을 저장합니다.

  4. 프로그램을 컴파일합니다.

    javac HelloJava.java
  5. 프로그램을 실행합니다.

    java HelloJava

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

    Optional with value: Hello from Optional!
    Optional without value is empty.
    Using ifPresent: Hello from Optional!
    Using orElse: Default Message

    이 출력은 Optional을 사용하여 기존의 null 검사에 비해 값의 존재 또는 부재를 보다 명시적이고 안전하게 처리하는 방법을 보여줍니다. Optional은 모든 null 검사를 대체하는 것은 아니지만, 값의 부재가 유효하고 예상되는 시나리오에서 API 를 설계하고 코드를 작성하는 데 유용한 도구입니다.

요약

이 Lab 에서는 Java 에서 객체가 null 인지 확인하는 기본적인 기술을 배웠습니다. 가장 기본적인 방법인 등가 연산자 (==) 를 사용하여 참조 변수를 null과 직접 비교하는 것부터 시작했습니다. 이 간단한 검사는 NullPointerException 오류를 방지하는 데 필수적입니다.

그런 다음, 더 발전된 시나리오로 넘어갔지만, 제공된 내용은 기본적인 등가 검사만 자세히 설명합니다. 완전한 Lab 에서는 null 검사를 유형 검사와 결합하고, 잠재적인 null 값을 보다 우아하고 표현력 있게 처리하도록 설계된 최신 Java 기능인 Optional 클래스를 활용하여 더 깨끗하고 안전한 코드를 장려하는 내용을 다룰 것입니다.