
Optional은 Java 8에서 도입된 클래스(java.util.Optional)로, null을 직접 다루는 대신 안전하게 값을 처리할 수 있도록 도와주는 컨테이너 클래스입니다. Optional을 사용하면 NullPointerException(NPE) 발생 가능성을 줄이고, 코드의 가독성을 높일 수 있습니다.
2. Optional의 주요 메서드 및 사용 예제
2.1 Optional 객체 생성하기
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
// 값이 존재하는 Optional 생성
Optional<String> optionalValue = Optional.of("Hello, Optional!");
System.out.println(optionalValue.get()); // Hello, Optional!
// null이 아닌 값이 있을 경우만 Optional 생성
Optional<String> optionalNullable = Optional.ofNullable(null); // 비어있는 Optional
System.out.println(optionalNullable.isPresent()); // false
// 비어있는 Optional 생성
Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.isPresent()); // false
}
}
2.2 값이 존재하는지 확인
Optional<String> optional = Optional.ofNullable("Hello");
if (optional.isPresent()) {
System.out.println(optional.get());
}
// orElse로 기본값 제공
String value = optional.orElse("Default Value");
System.out.println(value); // Hello
2.3 orElse, orElseGet, orElseThrow 비교
Optional<String> optionalEmpty = Optional.empty();
// 값이 없으면 기본값 반환
String result1 = optionalEmpty.orElse("기본값");
System.out.println(result1); // 기본값
// 값이 없을 때만 Supplier 실행 (성능 최적화)
String result2 = optionalEmpty.orElseGet(() -> "동적으로 생성된 값");
System.out.println(result2); // 동적으로 생성된 값
// 값이 없으면 예외 발생
try {
String result3 = optionalEmpty.orElseThrow(() -> new RuntimeException("값이 없습니다!"));
} catch (Exception e) {
System.out.println(e.getMessage()); // 값이 없습니다!
}
2.4 ifPresent와 ifPresentOrElse 사용
Optional<String> optional = Optional.of("Hello");
// 값이 있으면 실행
optional.ifPresent(value -> System.out.println("값: " + value)); // 값: Hello
// 값이 있으면 실행, 없으면 기본 동작 수행
optional.ifPresentOrElse(
value -> System.out.println("값: " + value),
() -> System.out.println("값이 없습니다")
);
2.5 Optional을 활용한 값 변환 (map, flatMap)
Optional<String> optional = Optional.of("Java Optional");
// map을 사용하여 값 변환
Optional<Integer> lengthOptional = optional.map(String::length);
System.out.println(lengthOptional.get()); // 13
// flatMap을 사용하여 중첩 Optional을 평탄화
Optional<Optional<String>> nestedOptional = Optional.of(Optional.of("Nested Value"));
Optional<String> flatMapped = nestedOptional.flatMap(opt -> opt);
System.out.println(flatMapped.get()); // Nested Value
2.6 filter를 사용하여 값 검증
Optional<String> optional = Optional.of("Hello");
Optional<String> filtered = optional.filter(value -> value.startsWith("H"));
System.out.println(filtered.isPresent()); // true
Optional<String> emptyFiltered = optional.filter(value -> value.startsWith("X"));
System.out.println(emptyFiltered.isPresent()); // false
3. Optional을 사용할 때 주의할 점
3.1 Optional을 반환할 때
- Getter 메서드에서 Optional을 반환하는 것은 지양 (예외적으로 NULL을 다룰 때만 사용)
- Optional을 매개변수로 받지 않도록 한다 (대부분 불필요함)
3.2 성능 고려
- orElse()는 항상 실행되므로, 무거운 연산이 필요할 경우 orElseGet()을 사용해야 성능을 최적화할 수 있음

'Back_End > JAVA' 카테고리의 다른 글
자바(JAVA) DAO, DTO, VO 란? (0) | 2025.02.26 |
---|---|
자바(JAVA) Synchronized (0) | 2025.02.24 |
얼리 리턴 패턴(Early Return Pattern) 이란? (0) | 2025.02.14 |
Java의 Comparator vs Comparable (1) | 2025.02.14 |
자바(Java) 스트림(Stream) 이란? (1) | 2025.02.13 |