Post

[Java] Optional

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

Java๋ฅผ ์“ฐ๋‹ค ๋ณด๋ฉด ๊ฐ€์žฅ ์ž์ฃผ ๋งŒ๋‚˜๋Š” ์˜ˆ์™ธ๊ฐ€ NullPointerException์ด๋‹ค. ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ์ƒํ™ฉ์„ null๋กœ ์ง์ ‘ ๋‹ค๋ฃจ๋ฉด ๊ณณ๊ณณ์— if (x != null) ์ฒดํฌ๊ฐ€ ํฉ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด Optional์ด๋‹ค.

Optional์ด๋ž€? ๊ฐ’์ด ์กด์žฌํ•  ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ. โ€œ๊ฐ’์ด ์žˆ์„์ง€๋„ ์—†์„์ง€๋„ ๋ชจ๋ฅธ๋‹คโ€๋Š” ์ƒํ™ฉ์„ null๋ณด๋‹ค ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.


1. ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

Optional์€ ๊ฐ’์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. orElse๋กœ ๊ฐ’์ด ์—†์„ ๋•Œ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒํ™ฉ์ƒ์„ฑ๊ฒฐ๊ณผ
๊ฐ’์ด ์žˆ์ŒOptional.of("Hello")์›๋ž˜ ๊ฐ’ ๋ฐ˜ํ™˜
๊ฐ’์ด ์—†์ŒOptional.empty()๊ธฐ๋ณธ๊ฐ’ ๋ฐ˜ํ™˜
1
2
3
4
5
6
7
8
9
// ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ
Optional<String> optionalValue = Optional.of("Hello, Optional!");
String result = optionalValue.orElse("Default Value");
System.out.println(result);   // ์ถœ๋ ฅ: Hello, Optional!

// ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
Optional<String> emptyOptional = Optional.empty();
String result2 = emptyOptional.orElse("Default Value");
System.out.println(result2);  // ์ถœ๋ ฅ: Default Value

2. ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹

Optional์€ ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์—ฐ์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. map์œผ๋กœ ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜๊ณ , orElse๋กœ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.

1
2
3
4
String result = optionalValue
    .map(value -> value + " - Modified")
    .orElse("Default Value");
System.out.println(result);   // ์ถœ๋ ฅ: Hello, Optional! - Modified

3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐ„์†Œํ™”

๊ธฐ์กด์—๋Š” null ์ฒดํฌ๋กœ ๋ฐฉ์–ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค. Optional์„ ์“ฐ๋ฉด ์ด ๊ณผ์ •์ด ํ•œ ์ค„๋กœ ๊น”๋”ํ•ด์ง„๋‹ค.

1
2
3
4
5
public String getUserName(User user) {
    return Optional.ofNullable(user)   // user๊ฐ€ null์ด์–ด๋„ ์•ˆ์ „
        .map(User::getName)            // null์ด๋ฉด map์€ ๊ฑด๋„ˆ๋œ€
        .orElse("Unknown");            // ์ตœ์ข…์ ์œผ๋กœ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’
}
๋ฉ”์†Œ๋“œ์—ญํ• 
Optional.of(x)x๋ฅผ ๊ฐ์‹ผ Optional (x๊ฐ€ null์ด๋ฉด ์˜ˆ์™ธ)
Optional.ofNullable(x)x๊ฐ€ null์ด๋ฉด empty, ์•„๋‹ˆ๋ฉด ๊ฐ์Œˆ
Optional.empty()๋นˆ Optional
map(f)๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ณ€ํ™˜, ์—†์œผ๋ฉด ๊ทธ๋Œ€๋กœ empty
orElse(๊ธฐ๋ณธ๊ฐ’)๊ฐ’์ด ์—†์„ ๋•Œ ๋ฐ˜ํ™˜ํ•  ๊ธฐ๋ณธ๊ฐ’

โš ๏ธ ์ฃผ์˜ํ•  ์ 

Optional์€ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์“ฐ๊ธฐ๋ณด๋‹ค ์ƒํ™ฉ์— ๋งž๊ฒŒ ์จ์•ผ ํ•œ๋‹ค. ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•˜์ž. (์˜ˆ: ํ•„๋“œ ํƒ€์ž…์ด๋‚˜ ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋‚จ๋ฐœํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.)


๐Ÿ“ ์ •๋ฆฌ

๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
Optional๊ฐ’์˜ ์œ ๋ฌด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ
orElse๊ฐ’์ด ์—†์„ ๋•Œ์˜ ๊ธฐ๋ณธ๊ฐ’
map ์ฒด์ด๋‹null ์ฒดํฌ ์—†์ด ๊ฐ’ ๋ณ€ํ™˜์„ ์—ฐ์† ์ˆ˜ํ–‰
ofNullablenull ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์‹ธ๊ธฐ

Optional์€ null์„ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๋Œ€์‹  โ€œ๊ฐ’์ด ์—†์„ ์ˆ˜ ์žˆ์Œโ€์„ ํƒ€์ž…์œผ๋กœ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋„๊ตฌ๋‹ค. ๋•๋ถ„์— NullPointerException์„ ์ค„์ด๊ณ  ์ฝ”๋“œ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.