본문 바로가기

개발 생산성 & 코드 최적화/코드 리팩토링 & 최적화

[개발 생산성 & 코드 최적화] Java Optional 클래스 사용법과 NullPointerException 예방

[Java] Java Optional 클래스 사용법과 NullPointerException 예방

1. NullPointerException이란?

Java에서 가장 흔한 예외 중 하나가 NullPointerException (NPE)입니다.

null 값을 참조하려고 하면 발생하며, 프로그램이 비정상적으로 종료될 수 있습니다.

2. Optional이란?

Optional은 Java 8에서 도입된 기능으로,

null 값을 안전하게 다루고 NullPointerException을 방지하는 클래스입니다.

값을 감싸는 컨테이너 역할을 하며,

isPresent(), orElse(), ifPresent() 등의 메서드를 제공합니다.

 

3. Optional 사용 예제

🔹 1. 기존 방식 (Null 체크 필요)


public class TraditionalNullCheck {
    public static void main(String[] args) {
        String name = getName();
        if (name != null) {
            System.out.println(name.toUpperCase());
        } else {
            System.out.println("이름이 없습니다.");
        }
    }

    public static String getName() {
        return null; // NPE 발생 가능
    }
}

✅ 문제점:

- null 체크를 매번 해야 함

- 실수로 null을 참조하면 NPE 발생 가능 

🔹 2. Optional 적용 방식


import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional name = getName();
        System.out.println(name.orElse("이름이 없습니다.").toUpperCase());
    }

    public static Optional getName() {
        return Optional.ofNullable(null);
    }
}

✅ 개선점:

- Optional을 사용하여 null을 직접 다루지 않음

- orElse()를 사용해 기본값을 설정 가능 

4. Optional 주요 메서드 정리

메서드 설명 예제
of(T value) null이 아닌 값을 저장 Optional.of("Hello")
ofNullable(T value) null 여부에 따라 Optional 생성 Optional.ofNullable(name)
empty() 빈 Optional 객체 생성 Optional.empty()
isPresent() 값이 존재하면 true 반환 name.isPresent()
ifPresent(Consumer<T> action) 값이 있을 때 특정 동작 수행 name.ifPresent(System.out::println)
orElse(T other) 값이 없으면 기본값 반환 name.orElse("Unknown")

---

5. Optional을 활용한 코드 리팩토링

🔹 기존 방식 (null 체크 필요)


public class NullCheckExample {
    public static void main(String[] args) {
        String result = getUserName(null);
        System.out.println(result);
    }

    public static String getUserName(String name) {
        return (name != null) ? name.toUpperCase() : "이름 없음";
    }
}

✅ 문제점:

- Null 체크 로직이 반복됨

- 코드 가독성이 떨어짐 

🔹 Optional을 활용한 리팩토링


import java.util.Optional;

public class OptionalRefactor {
    public static void main(String[] args) {
        String result = getUserName(null);
        System.out.println(result);
    }

    public static String getUserName(String name) {
        return Optional.ofNullable(name)
                .map(String::toUpperCase)
                .orElse("이름 없음");
    }
}

✅ 개선점:

- Null 체크 필요 없음

- 가독성이 향상됨

- 람다식(map)을 활용하여 유연한 변환 가능

6. Optional 사용 시 주의할 점

  • get() 메서드는 가급적 사용하지 말 것 (값이 없을 경우 NoSuchElementException 발생 가능)
  • isPresent() + get() 조합 대신 ifPresent() 또는 orElse() 사용
  • ✔ 반환 타입을 Optional로 지정하는 것은 좋지만, 필드에는 사용하지 않는 것이 좋음

---

📌 정리

  • Optionalnull을 안전하게 처리하고 NullPointerException을 예방하는 기능
  • orElse(), map(), ifPresent() 등 다양한 메서드를 활용 가능
  • ✔ 기존 null 체크 코드를 제거하여 코드 가독성과 유지보수성을 향상

🔗 다른 Java 코드 최적화 관련 글도 함께 확인해보세요!

Java Stream API 활용법과 성능 최적화