Language/Java

Optional : null๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ

LightSource 2022. 6. 30. 12:11
  • ๋ฐ์ดํ„ฐ์˜ null๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•  ๋•Œ NullPointerException(NPE)๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

Optional ์ƒ์„ฑ

Optional ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

  1. of() : ๋ณ€์ˆ˜value์˜ ๊ฐ’์ด null์ธ ๊ฒฝ์šฐ NPE ๋ฐœ์ƒํ•จ → ๋ฐ˜๋“œ์‹œ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— of()๋ฅผ ์‚ฌ์šฉ
Optional<String> optional = Optional.of(value);

 

  1. ofNullable() : ๋ณ€์ˆ˜value์˜ ๊ฐ’์ด null ์ผ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ • → ๋ณ€์ˆ˜๊ฐ€ null์ธ ๊ฒฝ์šฐ Optional.empty()๊ฐ€ ๋ฆฌํ„ด๋จ
Optional<String> optional = Optional.ofNullable(value);

 

  1. empty() : ๋นˆ Optional ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ → Optional ๊ฐ์ฒด ์ž์ฒด๋Š” ์žˆ์ง€๋งŒ ๋‚ด๋ถ€์—์„œ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๊ฐ€ ์—†์Œ(Optional.empty() ๊ฐ์ฒด๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ Singleton ๊ฐ์ฒด)
Optional<String> optional = Optional.empty();

 


Optioanl ์ค‘๊ฐ„์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ

  • Optional ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ›„ ๋‹ค์‹œ Optional๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋‹ค์‹œ Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  • filter() : ํ•„ํ„ฐ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๋žŒ๋‹ค์‹์ด ์ฐธ์ด๋ฉด, Optional๊ฐ์ฒด๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ณ , ๊ฑฐ์ง“์ด๋ฉด Optional.empty()๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋˜๋„๋ก ํ•˜๋Š” ๋ฉ”์„œ๋“œ
Optional.of("ABCD").filter(v -> v.startsWith("AB")).orElse("Not AB");
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElse("Not AB");

 

“ABCD” ์˜ ๊ฒฝ์šฐ, ํ•„ํ„ฐ ์กฐ๊ฑด์ธ “AB”๋กœ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ “ABCD”๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.

“XYZ”์˜ ๊ฒฝ์šฐ ํ•„ํ„ฐ ์กฐ๊ฑด์ธ “AB”๋ฅผ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ “Not AB”๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.

 

  • map() : Optional๊ฐ์ฒด์˜ ๊ฐ’์— ์ˆ˜์ •์„ ํ•ด์„œ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด์คŒ
Optional.of("XYZ").map(String::toLowerCase).orElse("Not AB");

 


Optional ์ตœ์ข…์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ

  • ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋“ค์€ Optional๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜์ง€๋งŒ, ์ตœ์ข… ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋“ค์€ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์„œ Optional ๋ฉ”์†Œ๋“œ ์ฒด์ธ์„ ๋๋‚ด๋Š” ๋ฉ”์†Œ๋“œ ์ด๋‹ค.
  • ifPresent() : ๋žŒ๋‹ค์‹์„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ, ๊ฐ’์ด ์กด์žฌํ• ๋•Œ ๊ทธ ๊ฐ’์— ๋žŒ๋‹ค์‹์„ ์ ์šฉํ•ด ์คŒ, Optional๊ฐ์ฒด์— ๊ฐ’์ด ์—†์œผ๋ฉด ๋žŒ๋‹ค์‹ ์‹คํ–‰X
Optional.of("TEST").ifPresent(System.out::println); // TEST์ถœ๋ ฅ
Optional.ofNullable(null).ifPresent(System.out::println); // ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Œ

 

  • isPresent() : Optional ๊ฐ์ฒด์˜ ๊ฐ’์ด null์ธ์ง€์˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์คŒ
Optional.of("TEST").isPresent(); // True์ถœ๋ ฅ
Optional.of("TEST").filter(v -> "Not Equals".equals(v)).isPresent(); // false

filter๋ฉ”์„œ๋“œ์—์„œ Optional.empty() ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ isPresent()์—์„œ false๋ฅผ ๋ฐ˜ํ™˜.

 

  • get() : Optional ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” value๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค. Optional ๊ฐ์ฒด์— ๊ฐ’์ด ์—†๋Š” ์šฐ,NoSuchElementException์ด ๋ฐœ์ƒ
Optional.of("TEST").get(); // TEST ๋ฆฌํ„ด
Optional.ofNullable(null).get(); // NoSuchElementException

 

  • orElse() : ์ค‘๊ฐ„์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ฑฐ์น˜๋ฉด์„œ Optional ๊ฐ์ฒด๊ฐ€ ๋น„์–ด ์žˆ์—ˆ๋‹ค๋ฉด, orElse() ๋ฉ”์†Œ๋“œ์— ์ง€์ •๋œ ๊ฐ’์ด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ฆฌํ„ด๋œ๋‹ค.
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElse("Not AB") //"Not AB" ๋ฆฌํ„ด

 

  • orElseGet() : orElse๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋ฅผ ํ•ญ์ƒ ์ธ์‹ํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ์ด ํฌ๋‹ค๋ฉด orElse()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋Œ€์‹  orElseGet() ๋ฉ”์†Œ๋“œ๋Š” Optional๊ฐ์ฒด๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ Supplierํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ์ด ํฌ๋‹ค๋ฉด orElseGet() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
Optional.of("TEST").filter(v -> v.startWith("AB")).orElseGet(() -> "Not AB");

 

  • orElseThrow() : ์ฒ˜์Œ๋ถ€ํ„ฐ Optional๊ฐ์ฒด๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜, ์ค‘๊ฐ„์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ ๊ฐ์ฒด๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด Supplierํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
Optional.of("XYZ").filter(v -> v.startWith("AB")).orElseThrow(NoSuchElementException::new);

 

์ฐธ์กฐ : https://hbase.tistory.com/212

๋ฐ˜์‘ํ˜•