소개
이 랩에서는 NullPointerException 오류를 방지하기 위한 기본 기술인 Java 에서 객체가 null 인지 확인하는 필수적인 기술을 배우게 됩니다. 가장 기본적인 방법인 등가 연산자 (==) 를 사용하여 참조 변수를 null과 직접 비교하는 것부터 시작합니다.
이를 바탕으로, 객체의 존재 여부와 올바른 유형을 모두 확인하기 위해 null 검사를 유형 검사와 결합하는 방법을 살펴봅니다. 마지막으로, 잠재적으로 null 값을 처리하는 더 관용적이고 안전한 방법을 제공하여 더 강력하고 가독성이 좋은 코드를 장려하는 현대적인 Java 기능인 Optional 클래스를 사용하는 방법을 자세히 살펴보겠습니다.
등가 연산자를 사용하여 Null 확인
이 단계에서는 Java 에서 null을 확인하는 가장 기본적인 방법 중 하나인 등가 연산자 (==) 를 사용하는 방법을 살펴보겠습니다. Java 프로그래밍에서 오류를 방지하려면 null을 처리하는 방법을 이해하는 것이 중요합니다.
Java 에서 null은 참조 변수가 어떤 객체도 가리키지 않음을 나타내는 특수한 값입니다. 변수를 상자, 객체를 상자 안에 넣는 물건이라고 생각해보세요. 상자가 비어 있으면 변수는 null입니다. null 참조를 사용하려고 하면 (빈 상자에서 무언가를 사용하려고 하는 것과 같이) 종종 NullPointerException이 발생하며, 이는 초보자에게 흔하고 답답한 오류입니다.
등가 연산자를 사용하여 null을 확인하는 방법을 보여주는 간단한 Java 프로그램을 만들어 보겠습니다.
WebIDE 편집기에서
HelloJava.java파일을 엽니다 (아직 열려 있지 않은 경우).파일의 전체 내용을 다음 코드로 바꿉니다.
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문을 사용하여message가null인지 확인합니다. message == null이 true 이면 "The message is null."을 출력합니다.- false 이면 메시지 자체를 출력합니다.
- 그런 다음 문자열 "Hello, World!"를
message변수에 할당합니다. - 다른 출력을 보기 위해
null검사를 다시 수행합니다.
파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
터미널에서
javac명령을 사용하여 프로그램을 컴파일합니다.javac HelloJava.java오류가 없으면 컴파일이 성공한 것입니다.
java명령을 사용하여 컴파일된 프로그램을 실행합니다.java HelloJava다음 출력을 볼 수 있습니다.
The message is null. The message is: Hello, World!이 출력은
==를 사용한null검사가 올바르게 작동했음을 확인합니다.message가null일 때 첫 번째if조건이 true 였습니다. 값을 할당한 후 두 번째if조건은 false 였고else블록이 실행되었습니다.
등가 연산자 (==) 를 사용하는 것은 Java 에서 참조 변수가 null인지 확인하는 표준적이고 권장되는 방법입니다. 간단하고 명확하며 효율적입니다.
Null 및 유형 검사 결합
이 단계에서는 null 검사와 객체의 유형 검사를 결합하는 방법을 배우겠습니다. 이는 객체를 수신하고 사용하기 전에 null이 아니고 특정 유형인지 확인해야 하는 일반적인 시나리오입니다.
Java 는 객체가 특정 클래스의 인스턴스인지 또는 특정 인터페이스를 구현하는지 확인하기 위해 instanceof 연산자를 제공합니다. 논리 AND 연산자 (&&) 를 사용하여 이를 null 검사와 결합할 수 있습니다.
HelloJava.java 프로그램을 수정하여 이를 시연해 보겠습니다.
WebIDE 편집기에서
HelloJava.java파일을 엽니다.기존 코드를 다음으로 바꿉니다.
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 의 모든 클래스의 기본 클래스이므로 모든 객체에 대한 참조를 가질 수 있습니다.- 먼저
String을myObject에 할당합니다. if조건myObject != null && myObject instanceof String은 두 가지를 확인합니다.myObject != null: 객체 참조가null이 아닌가요?myObject instanceof String: 객체가String클래스의 인스턴스인가요?
&&연산자는if블록 내부의 코드가 실행되려면 두 조건이 모두 true 여야 함을 의미합니다.- 둘 다 true 이면
(String) myObject를 사용하여myObject를String으로 캐스팅하고 메시지를 출력합니다. 캐스팅은myObject가Object로 선언되었고 실제로String임을 컴파일러에 알려야 하므로, 이를 하나로 처리할 수 있도록 필요합니다. - 두 조건 중 하나라도 false 이면 (객체가
null이거나String이 아닌 경우)else블록이 실행됩니다. - 그런 다음
myObject를null로 설정한 다음Integer로 설정하여 (이는String이 아님)if조건을 테스트합니다.
파일을 저장합니다.
프로그램을 컴파일합니다.
javac HelloJava.java프로그램을 실행합니다.
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-nullString인 경우와null이거나String이 아닌 경우를 올바르게 식별했음을 보여줍니다.
!= null과 instanceof를 결합하는 것은 null일 수도 있는 특정 유형의 객체를 안전하게 사용해야 할 때 Java 에서 표준 패턴입니다.
Optional 을 사용하여 Null 처리
이 단계에서는 Java 8 에 도입된 Java 에서 잠재적인 null 값을 처리하는 보다 현대적인 접근 방식인 Optional 클래스를 살펴보겠습니다. Optional은 non-null 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너 객체입니다. 이는 값의 존재 또는 부재를 보다 명시적으로 나타내는 방법을 제공하여 NullPointerException의 위험을 줄이는 데 도움이 됩니다.
Optional을 사용하면 코드 전체에 흩어져 있는 null 검사에 의존하기보다는 값의 부재 가능성을 생각하고 해당 경우를 적절하게 처리하도록 권장합니다.
Optional을 사용하도록 HelloJava.java 프로그램을 수정해 보겠습니다.
WebIDE 편집기에서
HelloJava.java파일을 엽니다.기존 코드를 다음으로 바꿉니다.
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()를 보여줍니다. 이는 대체 값을 제공하는 데 유용합니다.
파일을 저장합니다.
프로그램을 컴파일합니다.
javac HelloJava.java프로그램을 실행합니다.
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 클래스를 활용하여 더 깨끗하고 안전한 코드를 장려하는 내용을 다룰 것입니다.



