Optional<T>์ด๋?
Optional<T>์ ์ง๋ค๋ฆญ ํด๋์ค๋ก 'Tํ์ ๊ฐ์ฒด'๋ฅผ ๊ฐ์ธ๋ wrapper ํด๋์ค์ด๋ค.
๋ฐ๋ผ์ Optionalํ์ ์ ๊ฐ์ฒด์๋ ๋ชจ๋ ํ์ ์ ์ฐธ์กฐ๋ณ์๋ฅผ ๋ด์ ์ ์๋ค.
์ต์ข ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฅ ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ Optional๊ฐ์ฒด์ ๋ด์์ ๋ฐํํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ๋ฐํ๋ ๊ฒฐ๊ณผ๊ฐ null์ธ์ง if๋ฌธ์ผ๋ก ์ฒดํฌํ์ง ์์๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ฒ ํ ์ ์๋ค.
๐ช Optional ๊ฐ์ฒด ์์ฑ
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ of() ๋๋ ofNullable()์ ์ฌ์ฉํ๋ค.
์ฐธ์กฐ๋ณ์๊ฐ null์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด of()๋ง๊ณ ofNullable()์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. of()๋ฅผ ์ฌ์ฉํด์ ๋งค๊ฐ๋ณ์ ๊ฐ์ด null์ด๋ฉด NullPointerException์ด ๋ฐ์ํ๋ค.
String str = "hi"
Optional<String> opt = Optional.of(str);
Optional<String> opt = Optional.of("hi");
Optional<String> opt = Optional.of(new String("hi"));
Optional<String> opt = Optional.ofNullable(null);
๐ค ์ฐธ์กฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ
Optional<T>ํ์ ์ ์ฐธ์กฐ๋ณ์๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํํ ๋๋ empty()๋ฅผ ์ฌ์ฉํ๋ค.
null๋ก ์ด๊ธฐํ๋ฅผ ํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ์ถ์ฒํ์ง ์๋๋ค.
Optional<String> opt = null; //null๋ก ์ด๊ธฐํ
Optional<String> opt = Optional.<String>empty(); //๋น ๊ฐ์ฒด๋ก ์ด๊ธฐํ
empty()์์ <T>๋ ์ถ์ ๊ฐ๋ฅํ๋ฏ๋ก ์๋ต ๊ฐ๋ฅํ๋ค.
๐ช Optional ๊ฐ์ฒด ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋๋ get()์ ์ฌ์ฉํ๋ค.
๊ฐ์ด null์ผ ๋๋ NoSuchElementException์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋๋นํด์ orElse()๋ก ๋์ฒดํ ๊ฐ์ ์ง์ ํ ์ ์๋ค.
Optional<String> opt = Optional.of("abc");
String str1 = opt.get();
String str2 = opt.orElse(""); // opt์ ์ ์ฅ๋ ๊ฐ์ด null์ผ ๋๋ง ""๊ฐ ๋ฐํ
๐ค orElse()์ ๋น์ทํ ์ญํ ์ ํ๋ ๊ฒ๋ค
โพ orElseGet()
null์ ๋์ฒดํ ๊ฐ์ ๋ฐํํ๋ ๋๋ค์์ ์ง์
String str3 = opt.orElseGet(String::New);
() -> new String ๊ณผ ๋์ผ
โพ orElseThrow()
null์ผ ๋ ์ง์ ๋ ์์ธ๋ฅผ ๋ฐ์ ์ํด
String str4 = opt.orElseThrow(NullPointerException::new);
null์ผ ๋ NullPointerException ๋ฐ์ ์ํด
๐ค filter(), map(), flatMap()์ฌ์ฉ ๊ฐ๋ฅ
Stream์ฒ๋ผ Optional๋ ์ ์ธ๊ฐ๋ฅผ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
int result = Optional.of("123").filter(x -> x.length() > 0)
.map(Integer::parseInt).orElse(-1);
๊ฐ์ ๊ธธ์ด๊ฐ 0๋ณด๋ค ํด ๋๋ ๊ฐ์ ๋ฐํํ๊ณ , 0๋ณด๋ค ์์ ๋๋ -1์ ๊ฐ์ ๋ฐํํ๋ค.
๐ค isPresent()
isPresent()๋ Optional๊ฐ์ฒด์ ๊ฐ์ด null์ด๋ฉด false๋ฅผ, ์๋๋ฉด true๋ฅผ ๋ฐํํ๋ค.
๊ฐ์ด ์์ผ๋ฉด ์ฃผ์ด์ง ๋๋ค์์ ์คํํ๊ณ , ์์ผ๋ฉด ์๋ฌด ์ผ๋ ํ์ง ์๋๋ค.
if(str != null){
System.out.println(str);
}
์ด๋ฐ ์กฐ๊ฑด๋ฌธ์ isPresent()๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค.
if(Optional.ofNullable(str).isPresent()){
System.out.println(str);
}
โ ifPresent()๋ฅผ ์ด์ฉํด๋ ๋๋ค.
ifPresent()๋ ์ฐธ์กฐ๋ณ์๊ฐ null์ด ์๋ ๋๋ง ์ถ๋ ฅํ๊ณ , null์ด๋ฉด ์๋ฌด ์ผ์ด ์ผ์ด๋์ง ์๋๋ค.
Optional.ofNullable(str).ifPresent(System.out::println);
๐ช Optional ํด๋์ค
Optional<T> | T get() |
OptionalInt | int getAsInt() |
OptionalLong | long get AsLong() |
OptionalDouble | double getAsDouble() |
โ ๋ง์ฝ OptionalInt๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์น๋ฉด, 0์ ์ ์ฅํ Optional ๊ฐ์ฒด์ empty๋ก ์ด๊ธฐํํ Optional๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ, ๋ ๊ฐ์ฒด๋ ๋ค๋ฅด๋ค๊ณ ์ธ์ํ๋ค. !!! ํ์ง๋ง ๊ทธ๋ฅ Optional๋ก ์ ์ฅํ ๊ฐ์ฒด๋ ๋์ด ๊ฐ๋ค๊ณ ์ธ์ํ๋ค.
'JAVA & OOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] Optional ํด๋์ค์ orElse์ orElseGet ์ฐจ์ด (0) | 2024.03.15 |
---|---|
Java 17์ ์ฌ์ฉํ๋ ์ด์ (2) | 2024.01.06 |
JAVA :: HashMap, hashing ๊ฐ๋ ์ ๋ฆฌ (0) | 2022.08.14 |
JAVA :: ์ ๋ค๋ฆญ์ค(Generics) ๊ฐ๋ ์ ๋ฆฌ (0) | 2021.10.01 |
SOLID ์์น [๊ฐ์ฒด ์งํฅ ์ค๊ณ/ 5๊ฐ์ง ์์น /๊ฐ๋ ] (0) | 2021.07.08 |