Java/Grammar

[Java 문법] Optional

annovation 2025. 1. 15. 08:52

Optional 

Optional 값이 있을 수도 있고 없을 수도 있는 상황을 다루기 위해 Java에서 제공하는 클래스입니다.
null 대신 사용하는 안전한 상자라고 생각하면 됩니다.

 

  • NullPointerException(널 포인터 예외) 방지
  • null을 반환하거나 체크하는 코드를 줄이고, 더 읽기 쉽고 안전한 코드를 작성

동작

 

  1. 값을 상자에 담습니다.
    • 상자에 값이 있으면 그 값을 사용할 수 있고,
    • 값이 없으면 빈 상자라는 걸 명확히 알 수 있습니다.
  2. 상자가 비었을 때 어떻게 처리할지 미리 정해둘 수 있습니다.
    • 기본값을 사용하거나,
    • 에러를 내거나,
    • 다른 대체 행동을 지정할 수 있습니다.

 


예시

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("값 없음"));  // 값이 없으면 기본값 출력

언제 쓰나요?

 

  1. 명시적인 null 처리
    • 메서드 반환 값이 null인지 아닌지 파악하기 쉬움
    • null을 직접 다루지 않아 NullPointerException 방지
  2. 안전한 코드 작성
    • 값이 없는 경우의 처리(예: 기본값, 예외 처리 등)를 명시적으로 작성 가능
  3. 가독성 향상
    • if-else로 null 체크하는 코드보다 더 간결하고 명확한 코드 작성

 

주의 사항

 

  1. 필드에 Optional 사용 지양
    • Optional은 필드 대신 메서드 반환값에 사용해야 합니다.
    • 필드에 Optional을 사용하면 불필요한 오버헤드가 발생할 수 있습니다.
  2. get() 사용 지양
    • get()은 값이 없을 경우 예외를 던지므로 사용을 최소화하고 orElse, orElseThrow 등을 대신 사용하세요.
  3. 대체 불가능한 경우
    • Optional은 null 자체를 대체하기 위한 도구일 뿐, null을 완전히 없애는 것은 아닙니다.

요약

 

  1. Optional은 null을 넣지 않고 비어 있는 상자를 전달하는 방법입니다.
  2. 값을 사용할 때 상자 안에 값이 있는지 확인하고 처리합니다.
  3. 코드가 간단하고 안전해집니다. NullPointerException을 걱정하지 않아도 됩니다.

출처

OpenAI ChatGPT (https://openai.com)