Skip to content

Latest commit

ย 

History

History
73 lines (69 loc) ยท 4.03 KB

File metadata and controls

73 lines (69 loc) ยท 4.03 KB

Optional

  • Optional์€ ์ž๋ฐ” 8์—์„œ ์ถ”๊ฐ€๋œ ํด๋ž˜์Šค๋กœ, Null-safeํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

Optional์˜ ๊ธฐ๋Šฅ

  • ๊ธฐ์กด Java ์—์„œ๋Š” null ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด null ์ฒดํฌ๋ฅผ ์ž์ฃผ ํ•ด์ค˜์•ผ ํ–ˆ์ง€๋งŒ, Optional์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Optional ํด๋ž˜์Šค๋Š” null์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” Wrapper ํด๋ž˜์Šค์ด๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ null์ด๋ฉด empty, null์ด ์•„๋‹ˆ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋‹ด์€ Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Optional์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ

  • Optional.of(value)
    • value๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด value๋ฅผ ๊ฐ์‹ผ Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • value๊ฐ€ null ์ด๋ฉด NullPointerException ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • Optional.ofNullable(value)
    • value๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด value๋ฅผ ๊ฐ์‹ผ Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • value๊ฐ€ null ์ด๋ฉด empty Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Optional.empty()
    • ๋น„์–ด ์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • get()
    • Optional ๊ฐ์ฒด ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ NoSuchElementException ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • isPresent()
    • Optional ๊ฐ์ฒด๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ifPresent(Consumer<T> consumer)
    • Optional ๊ฐ์ฒด ์•ˆ์— ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” Consumer๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • orElse(T other)
    • Optional ๊ฐ์ฒด ์•ˆ์— ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๊ธฐ๋ณธ๊ฐ’(other)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • orElseGet(Supplier<? extends T> supplier)
    • Optional ๊ฐ์ฒด ์•ˆ์— ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€์ฒด ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด supplier์˜ get() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋Œ€์ฒด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • map(Function<T, R> mapper)
    • Optional ๊ฐ์ฒด ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜(mapper)๋ฅผ ์ ์šฉํ•˜๊ณ , ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ Optional ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • flatMap(Function<T, R> mapper)
    • Optional ๊ฐ์ฒด ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜(mapper)๋ฅผ ์ ์šฉํ•˜๊ณ , ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ Optional ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์ด ๋•Œ mapper์˜ ๊ฒฐ๊ณผ๋„ Optional ๊ฐ์ฒด์ด๋‹ค.

Optional ์‚ฌ์šฉ ์˜ˆ์ œ

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        String inputString = "Hello World";
        
        Optional<String> optionalString = Optional.ofNullable(inputString);
        
        optionalString.map(String::length)
                .filter(len -> len <= 5)
                .ifPresentOrElse(
                        System.out.println,
                        () -> System.out.println("Too long")
                );
    }
}
  • ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ 5 ์ดํ•˜์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” "Too long" ์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์ œ ์†Œ์Šค

orElse()์™€ orElseGet() ์ฐจ์ด์ 

  • ๋ณดํ†ต orElse()๋Š” null ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋™์ž‘ํ•˜๊ณ , orElseGet()์€ null ์ผ ๋•Œ์—๋งŒ ๋™์ž‘ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค.
  • Optional ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
return value != null ? value : other;   // orElse(T other)
return value != null ? value : other.get()  // orElseGet(Supplier<? extends T> supplier)
  • orElseGet(Supplier<? extends T> supplier) ๋ฉ”์„œ๋“œ๋Š” value๊ฐ€ null ์ด๋ฉด other์„ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  other.get()์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ๋”ฐ๋ผ์„œ null์ด ์•„๋‹ ๋•Œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ
public T orElse(getAnyName()) {
    return value != null ? value : getAnyName();
}

public String getAnyName() {
    return "anyName";
}
  • ๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด orElse(T other) ์—์„œ other์ด ๋ฉ”์„œ๋“œ์ผ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด
    • getAnyName() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ž์—ด์ธ "anyName" ๊ฐ’์ด T ์ œ๋„ค๋ฆญ ๋ณ€์ˆ˜์—๊ฒŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  getAnyName() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๊ทธ๋ž˜์„œ null ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋™์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ