Optional
Optional은 값이 있을 수도 있고 없을 수도 있는 상황을 다루기 위해 Java에서 제공하는 클래스입니다.
null 대신 사용하는 안전한 상자라고 생각하면 됩니다.
- NullPointerException(널 포인터 예외) 방지
- null을 반환하거나 체크하는 코드를 줄이고, 더 읽기 쉽고 안전한 코드를 작성
동작
- 값을 상자에 담습니다.
- 상자에 값이 있으면 그 값을 사용할 수 있고,
- 값이 없으면 빈 상자라는 걸 명확히 알 수 있습니다.
- 상자가 비었을 때 어떻게 처리할지 미리 정해둘 수 있습니다.
- 기본값을 사용하거나,
- 에러를 내거나,
- 다른 대체 행동을 지정할 수 있습니다.
예시
1. 값이 있을 때
Optional<String> name = Optional.of("John"); // 값이 있는 상자
if (name.isPresent()) { // 값이 있으면 true
System.out.println(name.get()); // 값 꺼내기: "John"
}
2. 값이 없을 때
Optional<String> name = Optional.empty(); // 빈 상자
String defaultName = name.orElse("No Name"); // 값이 없으면 기본값 사용
System.out.println(defaultName); // 출력: "No Name"
3. 값 변환 (map)
Optional<String> name = Optional.of("John");
Optional<Integer> length = name.map(String::length); // 값의 길이를 구함
System.out.println(length.orElse(0)); // 출력: 4
4. 값이 있을 때만 행동 (ifPresent)
Optional<String> name = Optional.of("John");
name.ifPresent(n -> System.out.println("이름은: " + n)); // 출력: 이름은: John
Optional을 쓰지 않으면?
1. 기존 방식 (null 사용) : 값이 없을 때
public String findUserById(String id) {
if (id.equals("123")) {
return "John";
}
return null; // 값이 없으면 null 반환
}
String user = findUserById("456");
if (user != null) { // null 체크
System.out.println(user);
} else {
System.out.println("값 없음");
}
2. Optional 방식 : 값이 없을 때
public Optional<String> findUserById(String id) {
if (id.equals("123")) {
return Optional.of("John");
}
return Optional.empty(); // 값이 없음을 명시적으로 반환
}
Optional<String> user = findUserById("456");
System.out.println(user.orElse("값 없음")); // 값이 없으면 기본값 출력
언제 쓰나요?
- 명시적인 null 처리
- 메서드 반환 값이 null인지 아닌지 파악하기 쉬움
- null을 직접 다루지 않아 NullPointerException 방지
- 안전한 코드 작성
- 값이 없는 경우의 처리(예: 기본값, 예외 처리 등)를 명시적으로 작성 가능
- 가독성 향상
- if-else로 null 체크하는 코드보다 더 간결하고 명확한 코드 작성
주의 사항
- 필드에 Optional 사용 지양
- Optional은 필드 대신 메서드 반환값에 사용해야 합니다.
- 필드에 Optional을 사용하면 불필요한 오버헤드가 발생할 수 있습니다.
- get() 사용 지양
- get()은 값이 없을 경우 예외를 던지므로 사용을 최소화하고 orElse, orElseThrow 등을 대신 사용하세요.
- 대체 불가능한 경우
- Optional은 null 자체를 대체하기 위한 도구일 뿐, null을 완전히 없애는 것은 아닙니다.
요약
- Optional은 null을 넣지 않고 비어 있는 상자를 전달하는 방법입니다.
- 값을 사용할 때 상자 안에 값이 있는지 확인하고 처리합니다.
- 코드가 간단하고 안전해집니다. NullPointerException을 걱정하지 않아도 됩니다.
출처
OpenAI의 ChatGPT (https://openai.com)
'Java > Grammar' 카테고리의 다른 글
[Java 문법] Class<?> (0) | 2025.01.17 |
---|---|
[Java 문법] Optinal 주요 Method (0) | 2025.01.16 |
[Java 문법] Map의 get() method 형변환(typecasting) (0) | 2025.01.14 |
[Java 문법] 롬복(Lombok) @EqualsAndHashCode (0) | 2025.01.13 |
[Java 문법] substring() method (0) | 2025.01.12 |