본문 바로가기

Java 오류 & 개발/Java 기본 문법 & 오류

[Java] Optional 클래스 활용법 및 NullPointerException 방지하기

1. Optional 클래스란?

Optional은 Java 8에서 도입된 클래스이며, NullPointerException(NPE) 발생을 방지하기 위해 사용된다.

기본적으로 Optional은 값이 있을 수도 있고 없을 수도 있는 컨테이너 역할을 한다.

✅ NullPointerException이란?

NullPointerException(NPE)은 Java에서 가장 흔한 런타임 오류 중 하나이다.

null 값을 참조하는 객체의 메서드를 호출할 경우 발생한다.

String name = null;
int length = name.length();  // NullPointerException 발생

위와 같은 코드에서 name이 null이므로 length()를 호출할 수 없어 NPE가 발생한다.


2. Optional 클래스 생성 및 활용

✅ Optional 객체 생성 방법

  • Optional.of(value) → null이 아닌 값으로 Optional 생성
  • Optional.ofNullable(value) → null을 허용하는 Optional 생성
  • Optional.empty() → 비어 있는 Optional 생성
Optional opt1 = Optional.of("Hello");    // 값이 있는 Optional
Optional opt2 = Optional.ofNullable(null); // 값이 없을 수도 있는 Optional
Optional opt3 = Optional.empty();       // 비어 있는 Optional

3. Optional 값 확인 및 처리

✅ 값이 있는 경우 처리

Optional opt = Optional.of("Hello");

if (opt.isPresent()) {  // 값이 존재하는지 확인
    System.out.println(opt.get()); // "Hello"
}

✅ 값이 없는 경우 기본값 제공

String result = opt.orElse("Default Value");
System.out.println(result); // "Hello" (값이 있을 경우) or "Default Value" (값이 없을 경우)

✅ 값이 없을 경우 동작 수행

String result = opt.orElseGet(() -> "Generated Default");
System.out.println(result);

✅ 값이 없을 경우 예외 발생

String result = opt.orElseThrow(() -> new IllegalArgumentException("No value present"));

4. Optional을 활용한 안전한 코드 작성

✅ 예제: 사용자 객체에서 이메일 가져오기

기본적으로 getEmail()null을 반환할 수 있다고 가정하자.

class User {
    private String email;
    public String getEmail() {
        return email;
    }
}

기존 방식:

User user = new User();
String email = user.getEmail();
if (email != null) {
    System.out.println(email.toLowerCase());
} else {
    System.out.println("Email not provided");
}

Optional을 활용한 방식:

Optional user = Optional.ofNullable(null);
String email = user.map(User::getEmail)
                   .map(String::toLowerCase)
                   .orElse("Email not provided");
System.out.println(email);

5. Optional과 Stream 활용

Optional은 Stream API와 함께 사용될 때 강력한 기능을 제공한다.

✅ 리스트에서 특정 조건을 만족하는 값 찾기

List names = Arrays.asList("Alice", "Bob", "Charlie");

Optional result = names.stream()
                               .filter(name -> name.startsWith("B"))
                               .findFirst();

System.out.println(result.orElse("No match found"));

6. 마무리

Optional을 활용하면 NullPointerException을 방지하고 가독성 높은 코드를 작성할 수 있다.

특히 orElse(), map(), ifPresent() 등을 적절히 활용하면 불필요한 null 체크를 줄이고 보다

안전한 코드 작성을 할 수 있다.

 

더 많은 Java 예외 처리 기법이 궁금하다면?

다른 Java 오류 해결 글도 함께 확인해보세요!