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

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 의 ArrayList가 null 인지 확인하기 위한 다양한 기술을 살펴봅니다. null 값 처리는 견고한 Java 프로그래밍의 기본 측면이며, 이를 올바르게 수행하는 방법을 이해하는 것은 NullPointerException 오류를 방지하는 데 필수적입니다.

가장 기본적인 방법인 동등 연산자 (==) 를 사용하여 직접 null 을 확인하는 것부터 시작합니다. 이어서, null 확인과 빈 목록 확인을 결합하여 두 시나리오를 모두 효과적으로 처리하는 방법을 배웁니다. 마지막으로, 잠재적으로 null 값을 처리하는 보다 표현력 있고 안전한 방법을 제공하는 최신 Java 기능인 Optional 클래스의 사용을 살펴봅니다.

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

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

Java 에서 null은 변수가 어떤 객체도 참조하지 않음을 나타내는 특수한 값입니다. 빈 상자와 같다고 생각할 수 있습니다. 상자는 존재하지만 그 안에 아무것도 없습니다. null인 변수를 객체를 참조하는 것처럼 사용하려고 하면 (예: 메서드를 호출하는 경우) NullPointerException이 발생하며, 이는 Java 에서 매우 흔한 오류입니다.

동등 연산자 (==) 는 두 값을 비교하는 데 사용됩니다. 객체 참조를 null과 비교할 때 ==는 참조가 null 값을 가리키는지 확인합니다.

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

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

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

    public class HelloJava {
        public static void main(String[] args) {
            String message = null; // Declaring a String variable and setting it to null
    
            // Checking if the message variable is null
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is not null: " + message);
            }
    
            message = "Hello, World!"; // Assigning a String object to the variable
    
            // Checking again after assigning a value
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is not null: " + message);
            }
        }
    }
    

    이 코드에서:

    • message라는 String 변수를 선언하고 처음에 null로 설정합니다.
    • message == null 조건을 사용하여 변수가 null인지 확인하는 if 문을 사용합니다.
    • 변수가 null인지 아닌지를 나타내는 메시지를 출력합니다.
    • 그런 다음 실제 String 값 ("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 not null: Hello, World!
    

    이 출력은 == null 검사가 message 변수가 null일 때와 값을 가질 때를 올바르게 식별했음을 확인합니다.

동등 연산자 (==) 를 사용하는 것은 Java 에서 null을 확인하는 가장 간단한 방법입니다. 그러나 이것은 참조가 null인지 확인하는 데만 작동한다는 것을 기억하는 것이 중요합니다. 문자열이 비어 있는지 (예: ""와 같이 문자가 없는 경우) 확인하지 않습니다. 다음 단계에서 빈 문자열을 처리하는 방법을 살펴보겠습니다.

Null 및 Empty 검사 결합

이전 단계에서는 == 연산자를 사용하여 변수가 null인지 확인하는 방법을 배웠습니다. 그러나 Java 에서는 특히 String 객체를 다룰 때 변수가 null인지 뿐만 아니라 "비어 있는지"도 확인해야 하는 경우가 많습니다. 빈 문자열은 존재하지만 문자가 없는 String 객체입니다 (예: ""). 반면에 null 문자열은 변수가 어떤 String 객체도 전혀 참조하지 않음을 의미합니다.

null 문자열에서 isEmpty() 또는 length()와 같은 메서드를 호출하려고 하면 NullPointerException이 발생합니다. 따라서 null과 빈 문자열을 유사하게 처리하려는 경우 (예: "비어 있음" 또는 "누락됨"으로 간주) 두 조건을 모두 확인해야 합니다.

이를 수행하는 가장 일반적인 방법은 먼저 문자열이 null인지 확인한 다음, null이 아닌 경우 isEmpty() 메서드를 사용하여 비어 있는지 확인하는 것입니다.

이러한 검사를 결합하는 것을 보여주기 위해 HelloJava.java 프로그램을 수정해 보겠습니다.

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

  2. 현재 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            String text1 = null;
            String text2 = ""; // An empty string
            String text3 = "Hello"; // A non-empty string
    
            System.out.println("Checking text1 (null):");
            if (text1 == null || text1.isEmpty()) {
                System.out.println("text1 is null or empty.");
            } else {
                System.out.println("text1 is not null and not empty: " + text1);
            }
    
            System.out.println("\nChecking text2 (empty):");
            // It's crucial to check for null first!
            if (text2 == null || text2.isEmpty()) {
                System.out.println("text2 is null or empty.");
            } else {
                System.out.println("text2 is not null and not empty: " + text2);
            }
    
            System.out.println("\nChecking text3 (not empty):");
            if (text3 == null || text3.isEmpty()) {
                System.out.println("text3 is null or empty.");
            } else {
                System.out.println("text3 is not null and not empty: " + text3);
            }
        }
    }
    

    이 업데이트된 코드에서:

    • 세 개의 String 변수를 소개합니다: text1 (null), text2 (empty), text3 (not empty).
    • 논리 OR 연산자 (||) 를 사용하여 null 검사 (text == null) 와 빈 검사 (text.isEmpty()) 를 결합합니다.
    • 조건 text == null || text.isEmpty()textnull이거나 textnull이 아니고 text.isEmpty()가 true 인 경우 true 가 됩니다.
    • 중요: null 검사 (text == null) 는 || 조건에서 먼저 나와야 합니다. textnull인 경우 || 조건의 첫 번째 부분 (text == null) 이 true 이고 Java 는 "단락 평가"를 사용하여 두 번째 부분 (text.isEmpty()) 을 건너뛰므로 NullPointerException을 방지합니다. isEmpty() 검사가 먼저 나오고 textnull인 경우 오류가 발생합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

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

    java HelloJava
    

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

    Checking text1 (null):
    text1 is null or empty.
    
    Checking text2 (empty):
    text2 is null or empty.
    
    Checking text3 (not empty):
    text3 is not null and not empty: Hello
    

    이 출력은 결합된 검사가 null 문자열 (text1) 과 빈 문자열 (text2) 을 모두 "null or empty"로 올바르게 식별하는 동시에 비어 있지 않은 문자열 (text3) 을 올바르게 식별함을 보여줍니다.

이 결합된 검사 (string == null || string.isEmpty()) 는 null과 빈 문자열을 모두 처리해야 할 때 Java 에서 매우 일반적인 패턴입니다. 많은 라이브러리에서도 Apache Commons Lang 의 StringUtils.isEmpty() 또는 StringUtils.isBlank()(공백도 확인) 와 같은 유틸리티 메서드를 제공하지만, 기본적인 결합된 검사를 이해하는 것이 중요합니다.

안전한 처리를 위한 Optional 사용

== null || isEmpty()를 사용하여 null 및 빈 문자열을 확인하는 것이 효과적이지만, Java 8 에서는 잠재적으로 부재하는 값을 보다 명시적이고 안전하게 처리하는 방법으로 Optional 클래스를 도입했습니다. Optionalnull이 아닌 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너 객체입니다. Optional을 사용하면 NullPointerException을 방지하고 값이 누락될 수 있음을 명확하게 나타내어 코드를 더 읽기 쉽게 만들 수 있습니다.

Optionalnull 검사를 완전히 대체하지 않지만, 값이 부재할 수 있는 상황을 처리하는 보다 기능적이고 표현적인 방법을 제공합니다.

HelloJava.java 프로그램에서 Optional을 사용하는 방법을 살펴보겠습니다.

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

  2. 현재 코드를 다음으로 바꿉니다.

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text1 = null;
            String text2 = "";
            String text3 = "Hello";
    
            // Creating Optional objects
            Optional<String> optionalText1 = Optional.ofNullable(text1);
            Optional<String> optionalText2 = Optional.ofNullable(text2);
            Optional<String> optionalText3 = Optional.ofNullable(text3);
    
            System.out.println("Checking optionalText1 (from null):");
            // Check if a value is present
            if (optionalText1.isPresent()) {
                System.out.println("optionalText1 contains a value: " + optionalText1.get());
            } else {
                System.out.println("optionalText1 is empty (no value present).");
            }
    
            System.out.println("\nChecking optionalText2 (from empty string):");
            if (optionalText2.isPresent()) {
                System.out.println("optionalText2 contains a value: " + optionalText2.get());
            } else {
                System.out.println("optionalText2 is empty (no value present).");
            }
    
            System.out.println("\nChecking optionalText3 (from non-empty string):");
            if (optionalText3.isPresent()) {
                System.out.println("optionalText3 contains a value: " + optionalText3.get());
            } else {
                System.out.println("optionalText3 is empty (no value present).");
            }
    
            // Using orElse() to provide a default value if the Optional is empty
            String valueOrDefault1 = optionalText1.orElse("Default Value 1");
            String valueOrDefault2 = optionalText2.orElse("Default Value 2");
            String valueOrDefault3 = optionalText3.orElse("Default Value 3");
    
            System.out.println("\nUsing orElse():");
            System.out.println("Value from optionalText1: " + valueOrDefault1);
            System.out.println("Value from optionalText2: " + valueOrDefault2);
            System.out.println("Value from optionalText3: " + valueOrDefault3);
        }
    }
    

    새로운 부분을 자세히 살펴보겠습니다.

    • import java.util.Optional;: Optional 클래스를 가져와야 합니다.
    • Optional.ofNullable(text);: null일 수 있는 변수에서 Optional을 만드는 권장 방법입니다. textnull이면 빈 Optional을 만듭니다. textnull이 아니면 text의 값을 포함하는 Optional을 만듭니다.
    • optionalText.isPresent(): 이 메서드는 Optionalnull이 아닌 값이 포함되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 값을 액세스하기 전에 값이 있는지 안전하게 확인하는 방법입니다.
    • optionalText.get(): 이 메서드는 Optional에 포함된 값을 반환합니다. 이 메서드는 주의해서 사용하십시오! Optional이 비어 있는 경우 (즉, isPresent()false인 경우) get()을 호출하면 NoSuchElementException이 발생합니다. orElse(), orElseGet() 또는 ifPresent()와 같은 다른 Optional 메서드를 사용하는 것이 일반적으로 더 좋습니다.
    • optionalText.orElse("Default Value"): 이 메서드는 Optional에 값이 있으면 Optional에 포함된 값을 반환합니다. Optional이 비어 있으면 대신 지정된 기본값을 반환합니다. 이는 대체 값을 제공하는 안전하고 편리한 방법입니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

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

    java HelloJava
    

    다음과 유사한 출력을 볼 수 있습니다.

    Checking optionalText1 (from null):
    optionalText1 is empty (no value present).
    
    Checking optionalText2 (from empty string):
    optionalText2 contains a value:
    
    Checking optionalText3 (from non-empty string):
    optionalText3 contains a value: Hello
    
    Using orElse():
    Value from optionalText1: Default Value 1
    Value from optionalText2:
    Value from optionalText3: Hello
    

    optionalText1 ( null에서 생성됨) 이 올바르게 비어 있는 것으로 식별되었음을 확인하십시오. optionalText2 (빈 문자열 ""에서 생성됨) 는 유효한 String 객체를 포함하기 때문에 Optional 의미에서 비어 있지 않습니다(해당 문자열이 비어 있더라도). optionalText3에는 "Hello" 문자열이 포함되어 있습니다. orElse() 예제는 Optional이 비어 있을 때 기본값을 쉽게 제공할 수 있는 방법을 보여줍니다.

Optional을 사용하면 부재할 수 있는 값을 처리할 때 코드를 더 강력하고 표현력 있게 만들 수 있습니다. 누락된 가능성을 생각하고 명시적으로 처리하도록 권장하여 예기치 않은 NullPointerException의 가능성을 줄입니다.

요약

이 Lab 에서는 Java 에서 변수, 특히 ArrayListnull인지 확인하는 기본적인 방법으로 동등 연산자 (==) 를 사용하는 방법을 배웠습니다. null은 객체 참조의 부재를 나타내며, null 변수를 사용하려고 하면 NullPointerException이 발생할 수 있음을 이해했습니다. 간단한 Java 프로그램을 통해 이 기본적인 null 검사를 실습했습니다.

또한 잠재적인 null 값과 빈 컬렉션을 처리하기 위한 보다 강력한 기술을 탐구했습니다. 여기에는 두 조건을 모두 고려하기 위해 null 및 빈 검사를 결합하고, 잠재적으로 부재하는 값을 처리하기 위한 보다 현대적이고 안전한 접근 방식으로 Optional 클래스를 활용하여 가독성이 높고 오류가 적은 코드를 장려하는 것이 포함되었습니다.