일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 중첩라우팅
- mysql-select
- URLSearchParams
- SEO
- 플러그인
- 데이터베이스
- 구글알고리즘
- PostView
- firebase
- useNavigate
- 조건판단문
- 구글
- path variable
- 구글애널리틱스
- useLocation
- Thymeleaf
- 워드프레스
- 구글바드
- sql연결
- wp_post
- web-vitals
- ChatGPT
- GA4
- White HAT
- router
- 리액트오류
- git사용자등록
- 리액트오류해결
- Polylang
- useEffect
- Today
- Total
개발천재
[JAVA] Optional 개념과 주요 메서드 본문
Optional은 Java에서 값이 있을 수도, 없을 수도 있는 경우를 처리하는 컨테이너이다. 예를 들어, 데이터를 찾을 때 값이 없을 수도 있는데(null), 그럴 때 Optional을 사용하면 null을 직접 다루는 대신, 값이 있는지 없는지를 명시적으로 확인할 수 있다. 이렇게 Optional을 사용하면 null로 인한 오류를 줄이고, 값이 없을 때도 안전하게 처리할 수 있어서 코드가 더 깔끔하고 오류를 예방할 수 있다.
Optional 기본 개념
Optional 객체는 값이 존재할 수도 있고, 존재하지 않을 수도 있다.
Optional을 사용하면 null 값을 직접 체크하는 대신, Optional이 비어 있는지 (값이 없는 상태인지) 여부를 명확하게 다룰 수 있다.
Optional을 사용 이유
NullPointerException 방지
null 값을 직접 사용하면서 발생할 수 있는 예외를 방지할 수 있다.
명시적 처리
값이 없을 때 null을 사용하는 것보다 Optional.empty()나 Optional.ofNullable()을 사용해 보다 명시적으로 값을 다룰 수 있다.
Optional의 주요 메서드
- Optional.of(value)
- Optional.ofNullable(value)
- Optional.empty()
- isPresent()
- ifPresent(Consumer<T> action)
- get()
- orElse(T other)
- orElseGet(Supplier<? extends T> other)
- orElseThrow(Supplier<? extends X> exceptionSupplier)
Optional.of(value)
값이 존재하는 경우, Optional 객체를 생성하고, 값이 null이면 NullPointerException을 던진다.
Optional<String> name = Optional.of("장원영");
Optional.ofNullable(value)
값이 null일 수도 있는 경우에 사용할수도 있다. 값이 null이라면 Optional.empty()를 반환한다.
Optional<String> name = Optional.ofNullable(null); // Optional.empty() 반환
Optional.empty()
값이 없을 때 사용하는 빈 Optional 객체를 반환한다.
Optional<String> empty = Optional.empty();
isPresent()
Optional 객체가 값을 가지고 있으면 true, 값이 없으면 false를 반환한다.
Optional<String> name = Optional.ofNullable("장원영");
boolean hasValue = name.isPresent(); // true
ifPresent(Consumer<T> action)
Optional이 값을 가지고 있다면, 그 값을 사용해서 특정 작업을 실행한다. 값이 없으면 아무 작업도 하지 않는다.
Optional<String> name = Optional.ofNullable("장원영");
name.ifPresent(n -> System.out.println(n)); // "장원영" 출력
get()
Optional이 값을 가지고 있으면 그 값을 반환, 값이 없으면 NoSuchElementException을 던진다.
get()을 사용할 때는 isPresent()로 먼저 체크하는 것이 좋다.
Optional<String> name = Optional.ofNullable("장원영");
String result = name.get(); // "장원영"
orElse(T other)
Optional이 값을 가지고 있으면 그 값을 반환하고, 값이 없으면 other 값을 반환한다.
Optional<String> name = Optional.ofNullable(null);
String result = name.orElse("기본값");
System.out.println(result); // "기본값"
orElseGet(Supplier<? extends T> other)
Optional이 값을 가지고 있으면 그 값을 반환하고, 값이 없으면 Supplier에서 제공하는 값을 반환한다. orElse()와 유사하지만, Supplier를 사용하여 값을 동적으로 생성할 수 있다.
Optional<String> name = Optional.ofNullable(null);
String result = name.orElseGet(() -> "동적기본값");
System.out.println(result); // "동적기본값"
orElseThrow(Supplier<? extends X> exceptionSupplier)
Optional이 값이 없을 때, Supplier가 제공하는 예외를 던진다.
Optional<String> name = Optional.ofNullable(null);
String result = name.orElseThrow(() -> new IllegalArgumentException("값이 없습니다"));
// IllegalArgumentException: 값이 없습니다
Optional 사용 예시
public class OptionalExample {
public static void main(String[] args) {
// Optional 생성
Optional<String> name = Optional.ofNullable("장원영");
// 값이 있으면 출력
name.ifPresent(n -> System.out.println("이름: " + n));
// 값이 없으면 기본값 반환
String result = name.orElse("기본값");
System.out.println(result); // "장원영" 출력
// 값이 없으면 예외 던짐
Optional<String> emptyName = Optional.ofNullable(null);
try {
String value = emptyName.orElseThrow(() -> new IllegalStateException("값이 없습니다"));
} catch (IllegalStateException e) {
System.out.println(e.getMessage()); // "값이 없습니다" 출력
}
}
}
Optional은 언제 사용해야 할까?
Optional은 값이 없을 수도 있는 경우에 유용하게 사용된다. Optional을 사용하면 값이 있을 때와 없을 때의 처리를 명확하게 구분할 수 있어, 코드의 가독성이나 유지보수성이 향상된다.
데이터베이스에서 값을 조회할 때 값이 없을 수도 있으면 Optional을 사용하여 안전하게 처리할 수 있다. null 값을 다루는 것보다 Optional을 사용하여 코드의 명확성을 높일 수 있다. Optional은 null 값을 더 안전하고 명시적으로 다룰 수 있는 방법이다. 하지만, 값이 항상 존재하는 경우에는 Optional을 굳이 사용할 필요가 없다. 그 대신 직접 값을 다루면 된다.
'개발 준비 > JAVA' 카테고리의 다른 글
[JAVA] 열거형 클래스 Enum(enumeration type) (0) | 2025.02.11 |
---|---|
[JAVA] 자바와 SQL 연결하기, JDBC (0) | 2024.12.30 |
[JAVA] getter와 setter (0) | 2024.12.12 |
[JAVA] for 반복문, 확장된 for문 (0) | 2024.12.06 |
[JAVA] 조건문 if / else / else if (0) | 2024.12.02 |