본문 바로가기

JAVA

[Java] Optional

 

 

 


 

 

개요

개발자를 곤란하게 하는 null에 대해서 알아보고 그 null 값을 명시적으로 처리할 수 있는 Optional이 무엇인지 알아봅시다. 

 

 

 


 

 

목차

1. null

  • NullPointerException
  • null 처리 방법

2. Optional

  • Optional 구조
  • Optional 특징
  • Optional 클래스 주요 메서드 및 코드 예제
  • Optional 사용 예제

 

 


 

 

null

객체가 존재하지 않음을 나타내는 키워드입니다.

 

 

NullPointerException

`null`을 참조하려 하면 발생하는 런타임 오류입니다. 

  • 런타임 오류는 언체크 예외로 컴파일러가 잡아주지 않습니다. (따라서 처리를 안해주면 큰일난다.)

 

발생하는 상황은 다음과 같습니다.

String name = person.getName();  // person이 null이면 NullPointException 발생 가능
  • `null` 체크를 하지 않으면 예외가 발생한다.

 

 

null 처리 방법

`if (obj != null)` 과 같은 체크를 해야 합니다.

if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        String city = address.getCity();
        ...
    }
}
  • 중첩된 if문이 많아짐 → 가독성이 떨어집니다
  • 실수로 빠뜨리면 `NullPointerException` 발생합니다.

 

 


 

 

Optinal

Optional은 Java 8에서 도입된 클래스이며, null이 될 수 있는 객체를 감싸는 클래스입니다.

 

 

Optional 구조

Optional<String> name = Optional.of("Alice");
Optional<String> empty = Optional.empty();  // 값 없음

 

 

Optinal 특징

  • `null` 값을 직접 사용하는 것보다 안전합니다..
  • 값이 없을 수 있다는 의미를 명시적으로 표현할 수 있습니다.
  • 반환값이 Optional인 메서드 호출 시 명시적으로 값의 유무를 처리하게 강제합니다. (안하면, 컴파일 오류)
  • 조건문을 사용하는 것보다 가독성이 좋고 안정적입니다.

 

Optional 클래스 주요 메서드 및 코드 예제

// null이 될수 있는 값을 감쌈
Optional<String> name = Optional.ofNullable(user.getName());

// 값이 있으면 출력
name.ifPresent(System.out::println);

// 값이 없으면 기본값 사용
String finalName = name.orElse("Unknown");

// 값이 없으면 예외 던지기
String finalName2 = name.orElseThrow(() -> new IllegalArgumentException("No name"));

 

 

Optional 사용 예제

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

class User {
    private String name;
    private String email; // null일 수도 있음

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public Optional<String> getEmail() {
        return Optional.ofNullable(email);
    }
}
  • getEmail() : email 값을 Optional로 감싸서 반환합니다.

 

class UserRepository {
    private Map<String, User> users = new HashMap<>();

    public UserRepository() {
        users.put("alice", new User("Alice", "alice@example.com"));
        users.put("bob", new User("Bob", null));  // 이메일 없음
    }

    public Optional<User> findByName(String name) {
        return Optional.ofNullable(users.get(name));
    }
}
  • findByName() : 사용자 이름을 Optional로 감싸서 반환합니다.

 

public class Main {
    public static void main(String[] args) {
        UserRepository repository = new UserRepository();

        String email = repository.findByName("bob") // bob은 있지만 email은 없음
                .flatMap(User::getEmail)
                .orElse("no-email@example.com");

        System.out.println("이메일: " + email); // 출력: 이메일: no-email@example.com
    }
}
  • 찾는 유저("bob")의 이메일은 null이므로, "no-email@example.com"이 출력됩니다.

'JAVA' 카테고리의 다른 글

[Java] 자바 웹 기술의 역사  (0) 2025.05.18
[Java] Lombok 라이브러리  (0) 2025.05.10
[Java] 동등성과 동일성  (0) 2025.05.04
[Java] Enum  (0) 2025.05.04
[Java] Lv_4 도서관 프로젝트  (0) 2025.05.02