[Java] Optional

Ahnickยท2021๋…„ 2์›” 24์ผ
0
post-thumbnail

์ด ํฌ์ŠคํŠธ๋Š” ๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜, (ํ•œ๋น›๋ฏธ๋””์–ด) ์ฑ…์˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค

Optional ์ด๋ž€

์ž๋ฐ”์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋งŒ๋‚˜๋Š” ์˜ค๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋Š” NullPointerException ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
null์ด๋ผ๋Š” ์กด์žฌ๊ฐ€ ์ž๋ฐ”์—์„œ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๋Š” ๋ฌธ์ œ๋Š” ์ƒ๋‹นํžˆ ๋งŽ์€๋ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š”

  • ์ž๋ฐ” ์ฒ ํ•™์— ์œ„๋ฐฐ : ์ž๋ฐ”๋Š” ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ํฌ์ธํ„ฐ๋ฅผ ์ˆจ๊ฒผ์ง€๋งŒ null ํฌ์ธํ„ฐ๋Š” ์ˆจ๊ธฐ์ง€ ๋ชปํ•จ
  • ์ฝ”๋“œ๋ฅผ ์–ด์ง€๋Ÿฝํž˜ : ์ค‘์ฒฉ๋œ null์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง
  • ์‹œ์Šคํ…œ์— ๊ตฌ๋ฉ์„ ๋งŒ๋“ ๋‹ค : null์€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š์•„์„œ ์‹œ์Šคํ…œ์˜ ๊ณณ๊ณณ์—์„œ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Java8์—์„œ๋Š” ์ด๋Ÿฌํ•œ null์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด
ํ•˜์Šค์ผˆ, ์Šค์นผ๋ผ ๋“ฑ์— ์˜ํ–ฅ์„ ๋ฐ›์•„ java.util.Optional<T>๋ผ๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด
๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

Optional์€ <T>์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, ์–ด๋– ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์‹ธ์ฃผ๋Š” Wrapper Class์ž…๋‹ˆ๋‹ค.
์ฆ‰ null๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ Optional๋กœ ๊ฐ์‹ธ์ฃผ์–ด null์— ๋Œ€์ฒ˜ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

Optional์˜ ์ ์šฉ์˜ˆ์ œ

public class Person {
    private Optional<Car> car;
    
    public Optional<Car> getCar() {
    	return car;
    }
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด Person์ด๋ผ๋Š” ๊ฐ์ฒด๋Š”, car๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์„์ˆ˜๋„ ์•„๋‹์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
car์—๋Š” null๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์œ„ํ—˜์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์— Car๋ฅผ Optional๋กœ ๊ฐ์‹ธ
์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ Optional์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Optional์˜ ์ƒ์„ฑ

Optional์€ ์„ธ ๊ฐ€์ง€ ์ƒ์„ฑ์ž ๋ฐฉ์‹์œผ๋กœ Optional ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๋น„์–ด์žˆ๋Š” Optional
Optional<Car> optCar = Optional.empty();

// null์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ
Optional<Car> optCar = Optional.of(car);

// null ๊ฐ’์œผ๋กœ
Optional<Car> optCar = Optional.ofNullable(car);

๋‹ค์Œ๊ณผ ๊ฐ™์ด Optional์˜ ์ƒ์„ฑ์—์„œ ๋นˆ ๊ฐ์ฒด, ๊ฐ’ ํ• ๋‹น, null ๊ฐ’ ์„ธ ๊ฐ€์ง€์˜ ๋ฐฉ๋ฒ•์œผ๋กœ
Optional์„ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Optional ์‚ฌ์šฉํ•˜๊ธฐ

๊ทธ๋Ÿผ ์ด์ œ Optional๋กœ ๋žฉํ•‘๋œ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ณ˜์Šต๋‹ˆ๋‹ค.

Optional Method

Optional์—๋Š” ifPresent( ) ๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ
ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋„˜๊ฒจ์ฃผ๋ฉด, null์ด ์•„๋‹Œ ๊ฐ’์ด ๋“ค์–ด์žˆ์„ ๋•Œ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€
ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค
.
ํ•˜์ง€๋งŒ null์ด ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„
์‚ฌ์šฉํ•˜๋ฉด null Check๋ฅผ ๋”ฐ๋กœ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์–ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

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

orElse( ) ํ•จ์ˆ˜๋Š” Optional์— ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ, default ๊ฐ’์„ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋„๋ก
๊ฐ์ฒด๊ฐ€ null์ธ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ๋˜๋Š” ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

orElseGet( ) ํ•จ์ˆ˜๋Š” orElse์™€ ๋น„์Šทํ•˜์ง€๋งŒ Optional์ด null์ธ ๊ฒฝ์šฐ์—๋งŒ
ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

orElseThrow( ) ํ•จ์ˆ˜๋Š” null์ธ ๊ฒฝ์šฐ์— ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, **๋ฐœ์ƒ์‹œํ‚ฌ ์˜ˆ์™ธ์˜ ์ข…๋ฅ˜๋ฅผ
์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€