[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
로 지정하는 것은 좋지만, 필드에는 사용하지 않는 것이 좋음
---
📌 정리
- ✔
Optional
은null
을 안전하게 처리하고 NullPointerException을 예방하는 기능 - ✔
orElse()
,map()
,ifPresent()
등 다양한 메서드를 활용 가능 - ✔ 기존
null
체크 코드를 제거하여 코드 가독성과 유지보수성을 향상
🔗 다른 Java 코드 최적화 관련 글도 함께 확인해보세요!
'개발 생산성 & 코드 최적화 > 코드 리팩토링 & 최적화' 카테고리의 다른 글
Java 스트림(Stream) API 완벽 가이드: 기본 개념부터 활용까지 (1) | 2025.03.15 |
---|---|
[Java] Stream API 활용법 및 성능 최적화 (1) | 2025.03.12 |
단일 책임 원칙(SRP) 적용하여 코드 개선하기 (0) | 2025.03.11 |
[개발 팁] 코드 리팩토링 필수 원칙: 클린 코드 작성법 (0) | 2025.03.11 |