Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 그라파나
- java
- 스프링
- Intellij
- 소셜로그인
- 자바
- MySQL
- 연동
- 스프링시큐리티
- 테스트코드
- 인텔리제이
- EC2
- 스파르타코딩클럽
- 오버라이딩
- tomcat
- 스프링예외처리
- css
- 프로메테우스
- 스파르타
- 내일배움캠프
- 깃허브
- mysqlworkbench
- AWS
- 알고리즘
- JWT
- 백준
- 도커
- o'auth2
- 키오스크
- Infra
Archives
- Today
- Total
개발스토리지😃
[Java] Optional<T> 메서드 본문
Java 8부터 도입된 기능으로 NullPointerException(NPE) 방지 및
명시적인 값 존재 여부 표현을 위해 만들어졌습니다.
1. 등장 배경
- 기존에는 null 값이 존재할 가능성이 있는 경우 아래와 같은 방식으로 코드를 작성
- 이 문제를 해결하기 위해 Java 8에서는 null을 직접 다루지 않고 안전한 API로 값을 처리할 수 있는 Optional<T> 클래스를 도입
String value = getValue();
if (value != null) {
System.out.println(value.length());
} else {
System.out.println("값이 없습니다.");
}
2. Optional<T> 메서드
- 생성 관련 메서드
메서드 | 설명 |
of(T value) | null이 아닌 값을 포함하는 Optional 생성 |
ofNullable(T value) | null일 수도 있는 값을 포함하는 Optional 생성 |
empty() | 빈 Optional 객체 생성 |
- 값 확인 및 존재 여부 관련 메서드
메서드 | 설명 |
isPresent() | 값이 존재하는지 여부를 true/false로 반환 |
isEmpty() | 값이 없는 경우 true 반환 (Java 11부터 추가됨) |
ifPresent(Consumer<T> action) | 값이 존재하면 해당 Consumer 실행 |
ifPresentOrElse(Consumer<T> action, Runnable emptyAction) | 값이 있으면 Consumer 실행, 없으면 Runnable 실행 (Java 9부터 추가됨) |
- 값 반환 관련 메서드
메서드 | 설명 |
get() | Optional 내부 값을 반환 (null이면 NoSuchElementException 발생) |
orElse(T other) | 값이 존재하면 해당 값을 반환, 없으면 other 반환 |
orElseGet(Supplier<? extends T> supplier) | 값이 존재하면 반환, 없으면 Supplier 실행 후 반환 |
orElseThrow() | 값이 존재하면 반환, 없으면 NoSuchElementException 발생 |
orElseThrow(Supplier<? extends Throwable> exceptionSupplier) | 값이 없으면 지정한 예외 발생 |
- 값 변환 및 필터링 관련 메서드
메서드 | 설명 |
map(Function<? super T, ? extends U> mapper) | 값을 변환하여 새로운 Optional<U> 반환 |
flatMap(Function<? super T, Optional<U>> mapper) | 중첩된 Optional을 평탄화 (Optional<Optional<T>> → Optional<T>) |
filter(Predicate<? super T> predicate) | 조건을 만족하는 값만 포함된 Optional 반환 |
- 스트림 변환 관련 메서드 (Java 9부터)
메서드 | 설명 |
stream() | 값이 존재하면 1개의 요소를 가진 스트림을 반환, 없으면 빈 스트림 반환 |
- 비교 및 기타 메서드
메서드 | 설명 |
equals(Object obj) | Optional 객체를 비교 |
hashCode() | Optional 객체의 해시코드를 반환 |
toString() | Optional의 값을 문자열로 변환 |
3. 주요 메서드 예시
- Optional.ofNullable() + orElse()
// null이라면 "기본값" 출력
public class OptionalExample {
public static void main(String[] args) {
String name = null;
String result = Optional.ofNullable(name).orElse("기본값");
System.out.println(result); // 출력: 기본값
}
}
- ifPresent()
// 값이 존재할 때만 실행
Optional<String> optional = Optional.of("Hello, Optional!");
optional.ifPresent(value -> System.out.println(value.toUpperCase()));
// 출력: HELLO, OPTIONAL!
- map()
// map을 통한 값 변환
Optional<String> optional = Optional.of("Java");
Optional<Integer> length = optional.map(String::length);
System.out.println(length.orElse(0)); // 출력: 4
- orElseThrow()
// 값이 없을 경우 IllegalStateException 발생
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optional = Optional.empty();
String result = optional.orElseThrow(() -> new IllegalStateException("값이 없습니다!"));
System.out.println(result);
}
}
- filter()
// 특정 조건에 해당하는 값만 출력
Optional<Integer> optionalAge = Optional.of(25);
optionalAge.filter(age -> age >= 18)
.ifPresent(age -> System.out.println("성인입니다."));
// 출력: 성인입니다.
4. 주의점
1. Optional.get()을 사용할 경우 값이 없으면 NoSuchElementException이 발생하므로 orElse() 또는 orElseThrow()를 권장
2. Optional은 필드가 아닌 메서드의 반환값으로만 사용 (직렬화 및 성능 문제 발생)
3. orElse()는 항상 기본값을 생성, orElseGet()은 값이 없을 때만 실행되기에 orElseGet()이 더 효율적일 수 있음
String result = optional.orElse(getDefaultValue()); // 항상 getDefaultValue() 실행 String result = optional.orElseGet(() -> getDefaultValue()); // 값이 없을 때만 실행
'언어 > 자바' 카테고리의 다른 글
[Java] == VS .equlas() (String & Wrapper 클래스 비교) (0) | 2025.07.16 |
---|---|
[Java] 테스트코드 오류 수정 트러블슈팅 (0) | 2025.04.21 |
[Java] Builder 패턴 (0) | 2025.03.31 |
[Java] Stream 메서드 (0) | 2025.03.27 |
[Java] Stack 메서드 (0) | 2025.03.24 |