Optional ๊ฐ์ฒด๋ Wrapper ๊ฐ์ฒด์ ํ ์ข ๋ฅ์ด๋ค. (Generic type)
์ญํ ๋ฐ ๋ชฉ์ : ๋งค๋ฒ null ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ธฐ ๊ท์ฐฎ๊ณ ๊น๋จน์ผ๋๊น ์๋ฐ 8 ๋ฒ์ ๋ถํฐ null ์ฒ๋ฆฌ ์ ์ฉ ๊ฐ์ฒด์ธ Optional ๊ฐ์ฒด๊ฐ ์๊ฒผ๋ค. Optional์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ null๊ฐ ๋ฐ์์ ๋๋นํ ์ ์๊ฒ ๋์๋ค.
null : ๋ค์ด์์ผ ํ ๋ฐ์ดํฐ๊ฐ ์๋ค์ด์ค๋ฉด ์๋ฐ๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ ๋ณ์๋ ๊ฐ์ฒด ๋ฑ์ ๋ฃ์ด์ฃผ๋ "์ผ์ข ์" ๋ฐ์ดํฐ ํ์ . ์คํ ์ null์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ, ๋๋ถ๋ถ์ ๋ฉ์๋์์ NullPointException ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์๋๋ฉด์ ํ๋ก๊ทธ๋จ ์๋์ด ์ค๋จ๋๋ค.
String s = str == null?"null์ด ๋ฐ์":str; ์ผํญ์ฐ์ฐ์ ์ฌ์ฉํด์ null ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ธฐ๋ ํ๊ณ
if(str == null) s = "null์ด ๋ฐ์"
else s = str; ์ด๋ ๊ฒ if ์ฐ์ฐ์๋ก ๋ํ๋ด์ฃผ๊ธฐ๋ ํ๋ค.
1. ifPresent() : ์คํ๊ตฌ๋ฌธ์์ null์ด ๋ฐ์ํ๋ฉด ์คํ๋์ง ์๋๋ก ํจ
-์๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ (๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ)
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("Hello");
list1.add("Java");
list1.add("World");
//1. ifPresent() --> ์คํ๊ตฌ๋ฌธ์์ null์ด ๋ฐ์ํ๋ฉด ์คํ๋์ง ์๋๋ก ํจ
Optional<List<String>> optional1 = Optional.of(list1);
optional1.ifPresent(s -> System.out.println(s));
}
}
console
[Hello, Java, World]
null์ด ์๋ ๋ฐ์ดํฐ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ, ๊ทธ๋๋ก ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
-์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ (null์ธ ๊ฒฝ์ฐ)
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("Hello");
list1.add("Java");
list1.add("World");
List<String> list2 = null;
//System.out.println(list2.get(0)); --> case1: ๊ทธ๋ฅ ์ถ๋ ฅ
Optional<List<String>> optional2 = Optional.ofNullable(list2);
optional2.ifPresent(s -> System.out.println(s.get(0))); //case2: Optional.ofNullable()์ ์ฌ์ฉ
}
}
console
//case1: ์๋ฌ๋ฌธ์ด ๋์ด
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.get(int)" because "list2" is null
//case2: null๊ฐ์ด ์์ด์ ์คํ๋์ง ์์
์์ ๊ฐ์ด ๊ทธ๋ฅ get()์ด๋ of()๋ฅผ ์ฌ์ฉํ๋ฉด NullPointerException ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ofNullable()์ ์จ์ผ ifPresent()๋ฅผ ์ผ์ ๋ ์๋ฌ๊ฐ ๋์ง ์๊ณ ์คํ์ด ๋์ง ์๋๋ค.
2. isPresent() : Optional ๊ฐ์ฒด์ ๊ฐ์ด null์ด๊ฑฐ๋ false๊ฐ์ด ๋ฐ์๋๋ฉด false ๋ฐํ, ์๋๋ฉด True ๋ฐํ
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
System.out.println(Optional.of("Test").isPresent());
//Optional ๊ฐ์ฒด ์์ ๊ฐ์ด ์์ผ๋ฏ๋ก True ๋ฆฌํด
System.out.println(Optional.ofNullable(null).isPresent());
//Optional ๊ฐ์ฒด์ null์ด ๋ค์ด์ค๋๊น False ๋ฆฌํด
System.out.println(Optional.of("Test").filter(v -> "est".equals(v)).isPresent());
//Optional ๊ฐ์ฒด์ false๊ฐ์ด ์์ฑ๋๊ธฐ ๋๋ฌธ์ False ๋ฆฌํด
}
}
3. orElse() : ๊ฐ์ด ์กด์ฌํ๋ฉด ๊ฐ์ ๋ฆฌํดํ๊ณ , ์์ผ๋ฉด orElse()๋ด์ ์ธ์๊ฐ์ ๋ฆฌํด
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
String a = "ABCD";
String result;
Optional<String> optional3 = Optional.ofNullable(a);
result = optional3.filter(s -> s.startsWith("AB"))
.orElse("AB๋ก ์์ํ๋ ๋จ์ด๊ฐ ์์");
System.out.println(result);
result = optional3.filter(s -> s.startsWith("X"))
.orElse("X๋ก ์์ํ๋ ๋จ์ด๊ฐ ์์");
System.out.println(result);
}
}
console
ABCD
X๋ก ์์ํ๋ ๋จ์ด๊ฐ ์์
orElse()๋ ๋ฐ์ ์์์ ๊ฐ์ด ์์ธ์ฒ๋ฆฌ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
4.map()
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
System.out.println(Optional.of("XYZ")
.map(String::toLowerCase)
.orElse("์ค๋ฅ๋ฐ์")); //์์ธ์ฒ๋ฆฌ๋ก๋ ์ฌ์ฉ ๊ฐ๋ฅ
}
}
console
xyz
'๐ฅ๏ธ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] try ~ catch ~finally ์์ธ์ฒ๋ฆฌ (0) | 2023.03.22 |
---|---|
[Java] ๊ฐ์ฒด ์งํฅ ์ธ์ด(OOP)์ ํน์ฑ: ์ฝ๋๋ก ๋ณด๋ ์บก์ํ, ์์์ฑ, ๋คํ์ฑ, ์ถ์ํ (0) | 2023.03.22 |
[Java] ๋ถ๋ณ ๊ฐ์ฒด์ Wrapper Class (0) | 2023.03.22 |
[Java] Stream API: stream์ ๋ค์ํ ์ฐ์ฐ๊ณผ ์์ ์ฝ๋ (0) | 2023.03.21 |
[Java] ๋๋ค(Lambda) ํ๊ธฐ๋ฒ (0) | 2023.03.21 |