๐๏ธ ์๋ฐ์์ Optional์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๋ ๋ฒ
๋น์ ์ด ์ผ๋ง๋ ์ค๋ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ์ง, NullPointerException(์ดํ NPE)์ ๊ฐ์ฅ ๋ต๋ตํ ๋ฌธ์ ์ค ํ๋์ ๋๋ค. Optional ํด๋์ค๋ NPE ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ 8๋ถํฐ ๋์ ๋์์ต๋๋ค. java.util.Optional ํด๋์ค์ ๋ชฉ์ ์ null์ผ ์ ์๋ T ํ์ ์ ๊ฐ์ฒด์ ๋ํ ์์ ํ ๋์์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. optional ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ์ดํด๋ด ์๋ค. ๐ Empty Optional Optional.empty()๋ฅผ ์ฌ์ฉํ๋ฉด ๋น์ด ์๋ optional ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๐ Nullable Optional Optional.ofNullable() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ nullable optional ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ null์ด๊ฑฐ๋ null ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๐ Non-Nullable Optional Optional.of() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ null์ด ์๋ optional ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Optional ํด๋์ค์ ์กด์ฌํ๋ get() ๋ฉ์๋๋ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด ๊ทธ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ NoSuchElementException ์์ธ๋ฅผ ๋์ง๋๋ค. ๋์ ์ isPresent() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ด ์กด์ฌํ๋์ง ์ฌ๋ถ์ ๋ํ boolean ๊ฐ์ ๋ฐํํ๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฐฉ๋ฒ์, !=null์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋ณ๋ฐ ๋ค๋ฅด์ง ์์ ๋ณด์ ๋๋ค. ``` if(optionalWallet.isPresent()){ savings.add(optionalWallet.get().getMoney()); } ``` ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ธฐ ์ํด, ifPresent() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ``` optionalWallet.ifPresent(wallet -> savings.add(wallet.getMoney())); ``` ๊ฐ์ด ๋น์ด์์ ๋ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ ธ์ค๋ ์๋๋ฆฌ์ค๊ฐ ์์ ์ ์์ต๋๋ค. orElse() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ์ด null์ผ ๋ ๋์ฒด ๊ฐ์ ์์ฑํ ์ ์์ต๋๋ค. ๋๋ orElseGet() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ์ ๊ณ์ฐํ ์๋ ์์ต๋๋ค. ``` Wallet wallet = optionalWallet.orElse(new Wallet(0)); ``` ์ง๊ธ๊น์ง ์๋ฐ์์ Optional์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์ข์ ๋ฐฉ๋ฒ์ด์์ต๋๋ค.