์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- http method
- datepicker
- swagger
- ๊ธฐ์ด100์
- 2024-08-21
- Android Studio
- OOP
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- 2024-08-20
- reflection
- fontstyle
- uri
- Python
- ์ด๋ ธํ ์ด์
- ์ฑ์ฉํ์ ํ
- menutab
- Kotlin
- udp
- ํ๋ IT&E
- URN
- OpenAPI
- Dialog
- AndroidStudio
- IOC
- ์ฝ๋์
- url
- Factory Method Pattern
- FACTORY
- di
- tcp
dingdong coding
[ JAVA ] Optional ๋ณธ๋ฌธ
Optional ์ด๋?
๊ฐ๋ฐ์ ํ ๋ ๊ฐ์ฅ ๋ง์ด ๋ฐ์ํ๋ ์์ธ ์ค ํ๋๋ ๋ฐ๋ก NullPointerException ์ ๋๋ค. NullPointerException ์ ํผํ๊ณ null ์ฒดํฌํ๋ ๋ก์ง์ ์ค์ด๊ธฐ ์ํด ๋น ๊ฐ์ผ ๋ null ๋์ ์ด๊ธฐ๊ฐ์ ์ฌ์ฉํ๊ธธ ๊ถ์ฅํ๊ณค ํฉ๋๋ค.
List<String> names = getNames();
names.sort(); // names ๊ฐ null ์ด๋ผ๋ฉด NullPointerException ์ด ์ผ์ด๋๋ค.
์๋ฐ 8์์๋ Optional<T> ํด๋์ค๋ฅผ ์ด์ฉํด์ NullPointerException ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ฆ, ๋ณต์กํ ์กฐ๊ฑด๋ฌธ ์์ด๋ ๋(null) ๊ฐ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
public final class Optional<T> {
// If non-null, the value; if null, indicates no value is present
private final T value;
...
}
value ์ ๊ฐ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด null ์ด๋๋ผ๋ ๋ฐ๋ก ์ฐธ์กฐ ์ NullPointerException ๊ฐ ๋์ง ์๊ณ , ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ข ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ค๋๋ค.
Optional<T> ํด๋์ค
Integer๋ Double ํด๋์ค์ฒ๋ผ 'T'ํ์ ์ ๊ฐ์ฒด๋ฅผ ํฌ์ฅํด ์ฃผ๋ ๋ํผ ํด๋์ค(Wrapper class)์ ๋๋ค. ๋ฐ๋ผ์ Optional ์ธ์คํด์ค๋ ๋ชจ๋ ํ์ ์ ์ฐธ์กฐ ๋ณ์๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
Optional ๊ฐ์ฒด์ ์์ฑ
1. Optional.empty() ๋น ๊ฐ์ฒด ์์ฑ
Optional<String> optional = Optional.empty();
System.out.println(optional); // Optional.empty
System.out.println(optional.isPresent()); // false
2. of() , ofNullable()
• of() ๋ฉ์๋ : null์ด ์๋ ๋ช ์๋ ๊ฐ์ ๊ฐ์ง๋ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
• of() ๋ฉ์๋๋ฅผ ํตํด ์์ฑ๋ Optional ๊ฐ์ฒด์ null์ด ์ ์ฅ๋๋ฉด NullPointerException ์์ธ๊ฐ ๋ฐ์
// Optional์ value๋ ์ ๋ null์ด ์๋๋ค.
Optional<String> optional = Optional.of("MyName");
• ofNullable() ๋ฉ์๋ : ์ฐธ์กฐ ๋ณ์์ ๊ฐ์ด ๋ง์ ํ๋ null์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์์ ๋ ์ฌ์ฉ
• ๋ช ์๋ ๊ฐ์ด null์ด ์๋๋ฉด ๋ช ์๋ ๊ฐ์ ๊ฐ์ง๋ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํ
• ๋ช ์๋ ๊ฐ์ด null์ด๋ฉด ๋น์ด์๋ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
// Optional ์์๋ ๊ฐ์ด ์์ ์๋ ์๊ณ ๋น ๊ฐ์ฒด์ผ ์๋ ์๋ค.
Optional<String> optional = Optional.ofNullable(getString());
String result = optional.orElse("other"); // ๊ฐ์ด ์๋ค๋ฉด "other" ๋ฅผ ๋ฆฌํด
Optional ๊ฐ์ฒด์ ์ ๊ทผ
1. get() : Optional ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ ์ ๊ทผ
• ๋ง์ฝ Optional ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ด null์ด๋ฉด, NoSuchElementException ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ get() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ์ isPresent() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Optional ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ด null์ธ์ง ์๋์ง๋ฅผ ๋จผ์ ํ์ธํ ํ ํธ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Optional<String> opt = Optional.ofNullable("์๋ฐ Optional ๊ฐ์ฒด");
if(opt.isPresent()) {
System.out.println(opt.get()); //์๋ฐ Optional ๊ฐ์ฒด
}
2. orElse(), orElseGet(), orElseThrow() : null ๋์ ์ ๋์ฒดํ ๊ฐ์ ์ง์
• orElse() ์ ์ฅ๋ ๊ฐ์ด ์กด์ฌํ๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํ๊ณ , ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ ๋ฐํ
• orElseGet() ์ ์ฅ๋ ๊ฐ์ด ์กด์ฌํ๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํ๊ณ , ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ธ์๋ก ์ ๋ฌ๋ ๋๋ค ํํ์์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํ
• orElseThrow() ์ ์ฅ๋ ๊ฐ์ด ์กด์ฌํ๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํ๊ณ , ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ธ์๋ก ์ ๋ฌ๋ ์์ธ๋ฅผ ๋ฐ์์ํด.
Optional<String> opt = Optional.empty(); // Optional๋ฅผ null๋ก ์ด๊ธฐํํจ.
System.out.println(opt.orElse("๋น Optional ๊ฐ์ฒด")); //๋น Optional ๊ฐ์ฒด
System.out.println(opt.orElseGet(String::new));
Optional ์ฌ์ฉํ๊ธฐ
๋จผ์ ์๋ฐ 8 ์ด์ ์๋ ๋ค์๊ณผ ๊ฐ์ด null ์ฒดํฌ๊ฐ ํ์ํ์ต๋๋ค.
// ์๋ฐ 8 ์ด์
List<String> list = getList();
List<String> listOpt = list != null ? list : new ArrayList<>();
Optional<T> ๊ณผ Lambda ๋ฅผ ์ด์ฉํ๋ฉด ์ข ๋ ๊ฐ๋จํ๊ฒ ํํํ ์ ์์ต๋๋ค.
List<String> listOpt = Optional.ofNullable(getList()).orElseGet(() -> new ArrayList<>());
null ์ฒดํฌ๋ก ์ธํด ์ง์ ๋ถํด์ง ์ฝ๋์ ๋๋ค.
User user = getUser();
if (user != null) {
Address address = user.getAddress();
if (address != null) {
String street = address.getStreet();
if (street != null) {
return street;
}
}
}
return "์ฃผ์ ์์";
map ๋ฉ์๋
• ๊ฐ์ด null ์๋ ๊ฒฝ์ฐ : mapper ๋ฅผ ์ด์ฉํด ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํ๋ Optional ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํฉ๋๋ค.
• ๊ฐ์ด null ์ธ ๊ฒฝ์ฐ : ๋น Optional ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํฉ๋๋ค.
public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
map ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ๊ฒ ํํํด๋ณด๊ฒ ์ต๋๋ค.
Optional<User> user = Optional.ofNullable(getUser());
Optional<Address> address = user.map(User::getAddress);
Optional<String> street = address.map(Address::getStreet);
String result = street.orElse("์ฃผ์ ์์");
// ๋ค์๊ณผ ๊ฐ์ด ์ถ์ฝํด์ ์ธ ์ ์๋ค.
user.map(User::getAddress)
.map(Address::getStreet)
.orElse("์ฃผ์ ์์");
+ Optional์ ํน์ฑ์ ์๋ชป์ฌ์ฉํ๋ฉด ์์คํ ์ฑ๋ฅ์ด ์ ํ๋๊ธฐ๋ ํ๊ธฐ ๋๋ฌธ์ null์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ฃผ ๋์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํฉ๋๋ค.
ํ์ต์ ๋ง์ด ๋์์ด ๋ ๋ธ๋ก๊ทธ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ต๋๋ค. ๐
์ฐธ์กฐ ๋ฐ ์ถ์ฒ
'๐ฐJAVA > Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA ] List Interface (0) | 2022.06.20 |
---|---|
[JAVA ] Collection (0) | 2022.06.20 |
[ JAVA ] Lambda (0) | 2022.06.14 |
[ JAVA ] HashMap (0) | 2022.06.14 |
[ JAVA, DB ์์ฃผ ] ๊ฐ๋ฐ ๊ด๋ จ ์ฉ์ด ์ ๋ฆฌ ( ๊ฐ์ธ ํ์ต์ฉ ) (0) | 2022.06.14 |