Optional

μžλ°”μ—μ„œλŠ” μ›μ‹œ νƒ€μž…μ„ μ œμ™Έν•œ λͺ¨λ“  것이 null이 될 수 μžˆλ‹€. λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•Œ NullPointerException을 ν”ν•˜κ²Œ 마주치게 λ˜λŠ”λ°, μ œλŒ€λ‘œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ΄ 떨어지고, λ³΅μž‘ν•œ μ½”λ“œκ°€ 생겨날 수 μžˆλ‹€.

class Example {

    public static void main(String[] args) {
        // case 1
        String str = "abc";
        System.out.println(str.toUpperCase()); // ABC
        str = null;
        System.out.println(str.toUpperCase()); // NullPointerException

        // case 2
        String str = "abc";
        if (str != null) {
            System.out.println(str.toUpperCase()); // ABC
        } else {
            System.out.println("null");
        }
    }
}

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μžλ°” 8μ—μ„œλŠ” Optional을 λ„μž…ν•˜μ—¬ null을 더 μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ§€μ›ν•œλ‹€.

Optional 객체 생성

Optional은 null이 될 수 μžˆλŠ” 객체λ₯Ό κ°μ‹ΈλŠ” 래퍼 클래슀둜, null이 될 수 μžˆλŠ” 객체λ₯Ό λ‹΄κ³  μžˆλŠ” Optional 객체λ₯Ό 생성할 수 μžˆλ‹€.

class Example {

    public static void main(String[] args) {
        Map<String, String> map = Map.of("existKey", "existValue");
        Optional<String> opt1 = Optional.of(map.get("existKey"));
        Optional<String> opt2 = Optional.ofNullable(map.get("notExistKey"));
        Optional<String> opt3 = Optional.empty();
    }
}

λ©”μ„œλ“œ

μž…λ ₯ 값이 null일 λ•Œ

μž…λ ₯ 값이 null이 아닐 λ•Œ

Optional.of(T value)

NullPointerException λ°œμƒ

Optional 객체 생성 (값을 λ‹΄κ³  있음)

Optional.ofNullable(T value)

Optional.empty() λ°˜ν™˜

Optional 객체 생성 (값을 λ‹΄κ³  있음)

Optional.empty()

-(null을 λ‹΄κ³  μžˆλŠ” Optional 객체 생성

-(null을 λ‹΄κ³  μžˆλŠ” Optional 객체 생성

Optional 객체 쑰회

Optional 객체에 λ‹΄κΈ΄ 값을 κ°€μ Έμ˜€κΈ° μœ„ν•΄μ„œλŠ” 기본적으둜 get() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ κ°€μ Έμ˜¬ 수 μžˆλ‹€.

class Example {

    public static void main(String[] args) {
        Optional<String> opt = Optional.of("abc");
        String str = opt.get();
        System.out.println(str); // abc
    }
}

null 체크λ₯Ό ν•˜μ§€ μ•Šκ³  λ°”λ‘œ 값을 κ°€μ Έμ˜€κ²Œ 되면 ν•΄λ‹Ή 객체가 null일 μˆ˜λ„ 있기 λ•Œλ¬Έμ— 체크λ₯Ό ν•΄μ£ΌλŠ” 것이 μ’‹λ‹€. Optional κ°μ²΄μ—μ„œ null 체크λ₯Ό ν•˜κΈ° μœ„ν•΄ μ•„λž˜μ™€ 같은 λ©”μ„œλ“œλ“€μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

λ©”μ„œλ“œ
값이 μžˆμ„ λ•Œ
값이 없을 λ•Œ

ifPresent()

true λ°˜ν™˜

false λ°˜ν™˜

ifPresent(Consumer<? super T> action)

Consumer μ‹€ν–‰

아무 λ™μž‘λ„ ν•˜μ§€ μ•ŠμŒ

ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

Consumer μ‹€ν–‰

Runnable μ‹€ν–‰

orElse(T other)

값을 λ°˜ν™˜

전달 받은 인자λ₯Ό λ°˜ν™˜

orElseGet(Supplier<? extends T> other)

값을 λ°˜ν™˜

Supplierλ₯Ό μ‹€ν–‰ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜

orElseThrow(Supplier<? extends X> exceptionSupplier)

값을 λ°˜ν™˜

Supplierκ°€ μ œκ³΅ν•˜λŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒ

class Example {

    public static void main(String[] args) {
        Optional<String> opt = Optional.of("abc");

        // ifPresent: 값이 μžˆλŠ”μ§€ 확인 -> μ•ˆν‹° νŒ¨ν„΄
        if (opt.isPresent()) {
            System.out.println(opt.get()); // abc
        }

        // ifPresent + λžŒλ‹€μ‹
        Optional<String> opt1 = Optional.of("abc");
        opt1.ifPresent(s -> System.out.println(s.toUpperCase())); // ABC
        opt1 = Optional.empty();
        opt1.ifPresent(s -> System.out.println(s.toUpperCase())); // null

        // ifPresentOrElse + λžŒλ‹€μ‹
        Optional<String> opt2 = Optional.of("abc");
        opt2.ifPresentOrElse(
                s -> System.out.println(s.toUpperCase()),
                () -> System.out.println("null")
        ); // ABC
        opt2 = Optional.empty();
        opt2.ifPresentOrElse(
                s -> System.out.println(s.toUpperCase()),
                () -> System.out.println("null")
        ); // null

        // orElse: 값이 μ—†μœΌλ©΄ κΈ°λ³Έκ°’ μ„€μ •
        Optional<String> opt3 = Optional.of("abc");
        System.out.println(opt3.map(String::toUpperCase).orElse("null")); // ABC
        opt3 = Optional.empty();
        System.out.println(opt3.map(String::toUpperCase).orElse("null")); // null

        // orElseGet: 값이 μ—†μ„λ•Œ Supplier μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ°›μ•„ μ‹€ν–‰ν•˜μ—¬ κΈ°λ³Έκ°’ μ„€μ •
        Optional<String> opt4 = Optional.of("abc");
        System.out.println(opt4.map(String::toUpperCase).orElseGet(() -> "null")); // ABC
        opt4 = Optional.empty();
        System.out.println(opt4.map(String::toUpperCase).orElseGet(() -> "null")); // null

        // orElseThrow: 값이 없을 λ•Œ μ˜ˆμ™Έ λ°œμƒ
        Optional<String> opt5 = Optional.of("abc");
        System.out.println(opt5.orElseThrow(IllegalArgumentException::new)); // abc
        opt5 = Optional.empty();
        System.out.println(
                opt5.orElseThrow(IllegalArgumentException::new)
        ); // IllegalArgumentException
    }
}

참고자료

Last updated

Was this helpful?