Part 3-1 ํจ๊ณผ์ ์ธ ์๋ฐ8 ํ๋ก๊ทธ๋๋ฐ
Part 3-1 ํจ๊ณผ์ ์ธ ์๋ฐ8 ํ๋ก๊ทธ๋๋ฐ ๊ด๋ จ
9์ฅ ๋ํดํธ ๋ฉ์๋
์คํฐ๋์์ ๋์จ ๋ด์ฉ
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์์ ๋ฐ๋ก ์ฌ์ฉํ๊ธฐ ์ํด default ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ง์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๊ฒ ์ฐ๊ธฐ ์ํด ์ฌ์ฉ๋ผ์ผ ํ๋ค.
e.g.
list.sort(Compator<? super E> c)
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๊ฐ 10๊ฐ ์๋๋ฐ ๊ทธ ์ค 2๊ฐ๋ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์์ฐ๊ณ ๋น ๊ตฌํ๋ง ํด๋จ๋ค๋ฉด 2๊ฐ์ ๊ตฌํ์ฒด๊ฐ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋๊ฒ ์ฌ๋ฐ๋ฅธ์ง ์์ฌํด๋ณผ ํ์๊ฐ ์๋ค.(๋ํดํธ ๋ฉ์๋๋ก ๋ง๋ค์ด์ ๋น ๊ตฌํ์ฒด๋ฅผ ์์ ๋ ๊ฒ ์๋๋ผ)
์๋ฐ 8 ์ด์ ์๋ ๋ง์ฝ ์ธํฐํ์ด์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ ์ํ๋ฉด
๊ตฌํ ํด๋์ค๋ฅผ ์์ ํด์ค์ผ ํ๋ค.
๊ทธ๋ถ๋ถ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๊ณ์ ์ ์ฅ์์๋ ํฐ ์ ์ฝ์ด์๋ค.
ํนํ ๋ชจ๋์๊ฒ ๊ณต๊ฐ๋ API ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํ ํด๋์ค๊น์ง ์ค๊ณ์๊ฐ ์ปค๋ฒํ ์ ์๋ค.
๊ทธ๋์ ์๋กญ๊ฒ ๋์จ๊ฒ ์๋ฐ8 ๋ํดํธ ๋ฉ์๋์ด๋ค.
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
Effective Java ๊ท์น 24
์ ๊ฑฐํ ์ ์๋ ๊ฒฝ๊ณ ๋ฉ์ธ์ง๋ ํ ์์ ์ฑ์ด ํ์คํ ๋๋ง @SuppressWarings(โuncheckedโ)
๋ฅผ ์ฌ์ฉํด ์ต์ ํด๋ผ. Rawtypes
๋ ์ ๋๋ฆญ์ ์ฌ์ฉํ๋ ํด๋์ค ๋งค๊ฐ ๋ณ์๊ฐ ๋ถํน์ ์ผ ๋์ ๊ฒฝ๊ณ ๋ค. 3์ฅ์์ ์๊ฐํ Predicate
, Function
๋ฑ ๋ง์ ํจ์ํ ์ธํฐํ์ด์ค๋ ๋ค์ํ ๋ํดํธ ๋ฉ์๋๋ฅผ ํฌํจํ๋ค.
ํจ์ํ ์ธํฐํ์ด์ค๋ ์ค์ง ํ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ๋ค. ๋ํดํธ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋์ ํด๋นํ์ง ์๋๋ค๋ ์ ์ ๊ธฐ์ตํ์.
๋ํดํธ ๋ฉ์๋๊ฐ ์๊ธฐ๋ฉด์ ๋ค์๋ ์๋ฌธ
- ์ด๋ ๊ฒ ๋๋ฉด ์ถ์ ํด๋์ค์ ๋ค๋ฅธ๊ฒ ๋ญ์ง?
- ์๋ฐ๋ ๋ค์ค ์์์ ํ์ฉ์ํ๋๋ฐ ์ฌ๋ฌ ๋ํดํธ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์๊ฒ ๋๋ฉด์ ๋ค์ค ์์์ด ๊ฐ๋ฅํด์ง๊ฑด๊ฐ?
์ฑ ์์ ๋งํ๋ ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ์ฐจ์ด์
๋ฌธ๋ฒ์ ์ฐจ์ด๋ง ์ค๋ช ํจ
- ํด๋์ค๋ ํ๋์ ์ถ์ ํด๋์ค๋ง ์์๋ฐ์ ์ ์์ง๋ง ์ธํฐํ์ด์ค๋ ์ฌ๋ฌ ๊ฐ ๊ตฌํํ ์ ์๋ค.
- ์ถ์ ํด๋์ค๋ ์ธ์คํด์ค ๋ณ์๋ก ๊ณตํต ์ํ๋ฅผ ๊ฐ์ง ์ ์์ง๋ง ์ธํฐํ์ด์ค๋ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ค.
1. ์ถ์ํด๋์ค vs ์ธํฐํ์ด์ค
ํด๋ฆฐ์ฝ๋์ค : ์ถ์ ํด๋์ค ๋์ ์ธํฐํ์ด์ค๋ฅผ ์จ๋ผ. Extends๋ ๋น์ธ๋๊น(ํ๋ฒ๋ฐ์ ์ฌ์ฉ๋ถ๊ฐ๋ฅ)
Effective Java ๊ท์น 18
์ถ์ ํด๋์ค ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ผ.
2. ๋ค์ค ์์
์ฑ ์์๋ ๋ค์ค ์์์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค๊ณ ๋งํ๋ค.
๋ํดํธ ๋ฉ์๋์ ๋ํด์ ์ข ๋ ์์ธํ ์์๋ณด์.
API๋ฒ์ 1(p291 ~ 292)์์ Resizable
์ธํฐํ์ด์ค์ ์๋ก์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์๋ค๊ณ ํด๋ณด์.
public interface Resizable extends Drawable{
int getWidth();
int getHeight();
void setWidth(int width);
void setHeight(int height);
void setAbsoluteSize(int width, int height);
//์๋กญ๊ฒ ์ถ๊ฐ
void setRelativeSize(int wFactor, int hFactor);
}
์ฌ์ปดํ์ผ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ณต๊ฐ๋ API๋ฅผ ๊ณ ์น๋ฉด ๊ธฐ์กด ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
Info
๊ณต๊ฐ๋ API๋ ๊ฑฐ์ฐฝํ๊ฒ์ด ์๋๋ผ public
์ผ๋ก ๋ง๋ ๊ฒ๋ค์ ์๋ฏธํ๋ค.
์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ ๋๋ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ ์ ์งํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์ฌ์ปดํ์ผ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ฆ, ๋ค์ํ ํธํ์ฑ์ด ์๋ค๋ ์ฌ์ค์ ์ดํด ํด์ผ ํ๋ค.
๋ฐ์ด๋๋ฆฌ ํธํ์ฑ
๋ญ๊ฐ๋ฅผ ๋ฐ๊พผ ์ดํ์๋ ์๋ฌ ์์ด ๊ธฐ์กด ๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ๋ ์ ์๋ ์ํฉ.
ex) ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ ๋ ์ถ๊ฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๋ ํ ๋ฌธ์ ๊ฐ ์ผ์ด๋์ง ์๋๋ฐ ์ด๋ฅผ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ด๋ผ๊ณ ํ๋ค.
์์ค ํธํ์ฑ
์ฝ๋๋ฅผ ๊ณ ์ณ๋ ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ปดํ์ผ ํ ์ ์์.
ex) ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ์์ค ํธํ์ฑ์ด ์๋๋ค. ์ถ๊ฐํ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ํด๋์ค๋ฅผ ๊ณ ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํดํธ ๋ฉ์๋๋ก ๋ง๋ค๋ฉด ์์ค ํธํ์ฑ์ด ์ ์ง๋๋ค.
๋์ ํธํ์ฑ
์ฝ๋๋ฅผ ๋ฐ๊พผ ๋ค์์๋ ๊ฐ์ ์ ๋ ฅ๊ฐ์ด ์ฃผ์ด์ง๋ฉด ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ๋์์ ์คํํ๋ค๋ ์๋ฏธ.
ex) ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋๋ผ๋ ํ๋ก๊ทธ๋จ์์ ์ถ๊ฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ผ์ ์์ผ๋ฏ๋ก ๋์ ํธํ์ฑ์ ์ ์ง๋๋ค.
๋ํดํธ ๋ฉ์๋ ํ์ฉ ํจํด
์ ํํ ๋ฉ์๋(optional method): Iterator
๋ hasNext
์ next
๋ฟ ์๋๋ผ remove
๋ฉ์๋๋ ์ ์ํ์ง๋ง ์ฌ์ฉ์๋ค์ด remove
๋ ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์๋ฐ8 ์ด์ ์๋ Iterator
๋ฅผ ๊ตฌํํ๋ ๋ง์ ํด๋์ค์์ remove
์ ๋น ๊ตฌํ์ ์ ๊ณตํ๋ค. ํ์ง๋ง ์ด์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๊ตฌํ ํด๋์ค์์ ๋น ๊ตฌํ์ ์ ๊ณตํ ํ์๊ฐ ์์ด์ง๋ค.
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
๋์ ๋ค์ค ์์(multiple inheritance of behavior)
์๋ฐ8์์๋ ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ์ ํฌํจํ ์ ์์ผ๋ฏ๋ก ํด๋์ค๋ ์ฌ๋ฌ ์ธํฐํ์ด์ค์์ ๋์์ ์์๋ฐ์ ์ ์๋ค.
์ณ์ง ๋ชปํ ์์ ์์์ผ๋ก ์ฝ๋ ์ฌ์ฌ์ฉ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํด๊ฒฐํ ์ ์๋ ๊ฒ์ ์๋๋ค.
์๋ฅผ ๋ค์ด ํ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๊ณ 100๊ฐ์ ๋ฉ์๋์ ํ๋๊ฐ ์ ์๋์ด ์๋ ํด๋์ค๋ฅผ ์์๋ฐ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋ค. ์ด๋ด ๋๋ delegation(์์), ์ฆ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ด์ฉํด์ ํด๋์ค์์ ํ์ํ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค.
์ข
์ข
final
๋ก ์ ์ธ๋ ํด๋์ค๋ฅผ ๋ณผ ์ ์๋๋ฐ (ex String
) ๋ค๋ฅธ ํด๋์ค๊ฐ ์์๋ค์ง ๋ชปํ๊ฒ ํจ์ผ๋ก์จ ์๋ ๋์์ด ๋ฐ๋์ง์๊ธธ ์ํ ๋ ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ํด๋์ค์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ฐ๊พธ์ง ๋ชปํ๋๋ก ์ ํํ ์ ์๋ค.
ํด์ ๊ท์น(๊ฐ์ ๋ํดํธ ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ์์ ๋) p302
[ํด์๊ท์น]
- ํด๋์ค๊ฐ ํญ์ ์ด๊ธด๋ค. ํด๋์ค๋ ์ํผํด๋์ค์์ ์ ์ํ ๋ฉ์๋๊ฐ ๋ํดํธ ๋ฉ์๋๋ณด๋ค ์ฐ์ ๊ถ์ ๊ฐ๋๋ค.
- 1๋ฒ ๊ท์น ์ด์ธ์ ์ํฉ์์๋ ์๋ธ ์ธํฐํ์ด์ค๊ฐ ์ด๊ธด๋ค. ์์๊ด๊ณ๋ฅผ ๊ฐ๋ ์ธํฐํ์ด์ค์์ ๊ฐ์ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ๋๋ ์๋ธ์ธํฐํ์ด์ค๊ฐ ์ด๊ธด๋ค.
- ์ฌ์ ํ ๋ํดํธ ๋ฉ์๋์ ์ฐ์ ์์๊ฐ ๊ฒฐ์ ๋์ง ์์๋ค๋ฉด ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๊ฐ ๋ช ์์ ์ผ๋ก ๋ํดํธ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๊ณ ํธ์ถํด์ผ ํ๋ค.
Q) ์ปดํ์ผ๋ฌ๋ ๋๊ตฌ์ hello
๋ฉ์๋ ์ ์๋ฅผ ์ฌ์ฉํ ๊น?
A) ์ ๋ต์ B(2๋ฒ ๊ท์น์ ์ํด์)
Q) ์ปดํ์ผ๋ฌ๋ ๋๊ตฌ์ hello
๋ฉ์๋ ์ ์๋ฅผ ์ฌ์ฉํ ๊น?
A) ์ด๊ฒ๋ ์ ๋ต์ B(2๋ฒ ๊ท์น์ ์ํด์)
Q) ์ปดํ์ผ๋ฌ๋ ๋๊ตฌ์ hello
๋ฉ์๋ ์ ์๋ฅผ ์ฌ์ฉํ ๊น?
A) ์ ๋ต์ D (1๋ฒ ๊ท์น, ํด๋์ค๊ฐ ํญ์ ์ด๊ธด๋ค)
Q) ์ปดํ์ผ๋ฌ๋ ๋๊ตฌ์ hello
๋ฉ์๋ ์ ์๋ฅผ ์ฌ์ฉํ ๊น?
A) ์ด๋ฒ์๋ ์ธํฐํ์ด์ค ๊ฐ์ ์์๊ด๊ณ๊ฐ ์์ผ๋ฏ๋ก 2๋ฒ ๊ท์น์ ์ ์ฉํ ์ ์๋ค. ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํด๋์ค C์์
s
๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ๋ค์์ ํธ์ถํ๋ ค๋ ๋ฉ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํด์ผ ํ๋ค.
public class C implements A, B {
public void hello(){
B.super.hello();
}
}
๋ค์ด์๋ชฌ๋ ๋ฌธ์
public class D implements B,C {
public static void main(String... args) {
new D().hello();
}
}
A
๋ง ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ตญ ํ๋ก๊ทธ๋จ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ โHello from Aโ๊ฐ ๋๋ค.
public class D implements B,C {
public static void main(String... args) {
new D().hello();
}
}
B์๋ ๊ฐ์ ์๊ทธ๋์ฒ์ ๋ํดํธ ๋ฉ์๋๊ฐ ์๋ค๋ฉด?
B
๋ A
๋ฅผ ์์๋ฐ์ผ๋ฏ๋ก 2๋ฒ ๊ท์น์ ๋ฐ๋ผ B
๊ฐ ์ ํ๋๋ค.
B
์ C
๊ฐ ๋ชจ๋ ๋ํดํธ ๋ฉ์๋ hello
๋ฉ์๋๋ฅผ ์ ์ํ๋ค๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๋ฏ๋ก ์ด์ ์ ์ค๋ช
ํ ๊ฒ ์ฒ๋ผ ๋ ์ค ํ๋์ ๋ฉ์๋๋ฅผ ๋ช
์์ ์ผ๋ก ํธ์ถํด์ผ ํ๋ค.
10์ฅ null ๋์ Optional
๊ฐ์ด ์๋ ์ํฉ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น?
// Person/Car/Insurance ๋ฐ์ดํฐ ๋ชจ๋ธ
public class Person {
private Car car;
public Car getCar() { return car; }
}
public class Car {
private Insurance insurance;
public Insurance getInsurance() { return insurance; }
}
public class Insurance {
private String name;
public String getName() { return name; }
}
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋ deep doubt(๊น์ ์์ฌ)์ด ์๋ค.
public String getCarInsuranceName(Person person) {
if (persion != null) {
Car car = persion.getCar();
if (car != null) {
Insurance insurance = car.getInsurance();
if (insurance != null) {
return insurance.getName();
}
}
}
return "Unknown";
}
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ค์ํ ์ถ๊ตฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
public String getCarInsuranceName(Person person) {
if (person == null) {
return "Unknown";
}
Car car = person.getCar();
if (car == null) {
return "Unknown";
}
Insurance insurance = car.getInsurance();
if (insurance == null) {
return "Unknown";
}
return insurance.getName();
}
์ ์ฝ๋๋ ์ค์ฒฉ if
๋ธ๋ก์ ์์ด์ง๋ง ๋ค ๊ฐ์ ์ถ๊ตฌ๊ฐ ์๊ฒผ๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์ํ๊ธฐ ํ๋ค์ด์ง๋ค.
๊ทธ๋์ ์๋ฐ8์ java.util.Optional<T>
๋ฅผ ์ ๊ณตํ๋ค. Optional
์ ์ ํํ๊ฐ์ ์บก์ํํ๋ ํด๋์ค๋ค. ๊ฐ์ด ์์ผ๋ฉด Optional
ํด๋์ค๋ ๊ฐ์ ๊ฐ์ผ๋ค. ๋ฐ๋ฉด ๊ฐ์ด ์์ผ๋ฉด Optional.empty
๋ฉ์๋๋ก Optional
์ ๋ฐํํ๋ค. ์ฆ, Optional
ํ์
์ ๊ฐ์ด ์์ ์ ์์์ ๋ช
์์ ์ผ๋ก ๋ณด์ฌ์ค๋ค.
๋น Optional
Optional<Car> optCar = Optional.empty();
null
์ด ์๋ ๊ฐ์ผ๋ก Optional
๋ง๋ค๊ธฐ
car
๊ฐ null
์ด๋ผ๋ฉด ์ฆ์ NPE๊ฐ ๋ฐ์ํ๋ค(Optional
์ ์ฌ์ฉํ์ง ์์๋ค๋ฉด car์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ค ํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒ์ด๋ค).
Optional<Car> optCar = Optional.of(car);
null
๊ฐ์ผ๋ก Optional
๋ง๋ค๊ธฐ
null
๊ฐ์ ์ ์ฅํ ์ ์๋ Optional
์ ๋ง๋ค ์ ์๋ค. ๋ง์ฝ car
๊ฐ null
์ด๋ฉด ๋น Optional
๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
Optional<Car> optCar = Optional.ofNullable(car);
flatMap
์ผ๋ก Optional
๊ฐ์ฒด ์ฐ๊ฒฐ
Optional<Person> optPerson = Optional.of(person);
Optional<String> name
= optPerson.map(Person::getCar)
.map(Car::getInsurance)
.map(Insurance::getName);
์ ์ฝ๋๋ ์ปดํ์ผ ๋์ง ์๋๋ค. ๊ทธ ์ด์ ๋ optPerson.map(Person::getCar)
์ฝ๋๊ฐ Optional<Optional<Car>>
๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ flatMap
์ ์จ์ผํ๋ค. ์คํธ๋ฆผ์ flatMap
์ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์์ ๋ค๋ฅธ ์คํธ๋ฆผ์ ๋ฐํํ๋ ๋ฉ์๋๋ค. ๋ณดํต ์ธ์๋ก ๋ฐ์ ํจ์๋ฅผ ์คํธ๋ฆผ์ ๊ฐ ์์์ ์ ์ฉํ๋ฉด ์คํธ๋ฆผ์ ์คํธ๋ฆผ์ด ๋ง๋ค์ด์ง๋ค. ํ์ง๋ง flatMap
์ ์ธ์๋ก ๋ฐ์ ํจ์๋ฅผ ์ ์ฉํด์ ์์ฑ๋ ๊ฐ๊ฐ์ ์คํธ๋ฆผ์์ ์ฝํ
์ธ ๋ง ๋จ๊ธด๋ค.
Optional<Person> optPerson = Optional.of(person);
String s = optPerson
.flatMap(Person::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getName)
.orElse("Unknown");
๋ง์ฝ flatMap
์ ๋น Optional์ ํธ์ถํ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์๊ณ ๊ทธ๋๋ก ๋ฐํ๋๋ค. ๋ฐ๋ฉด Optional
์ด Person
์ ๊ฐ์ธ๊ณ ์๋ค๋ฉด flatMap
์ ์ ๋ฌ๋ Function
์ด Person
์ ์ ์ฉ๋๋ค. Function
์ ์ ์ฉํ ๊ฒฐ๊ณผ๊ฐ ์ด๋ฏธ Optional
์ด๋ฏ๋ก flatMap
๋ฉ์๋๋ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๋ฐํํ ์ ์๋ค.
๋๋ฉ์ธ ๋ชจ๋ธ์ Optional
์ ์ฌ์ฉํ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ ํ ์ ์๋ ์ด์
Optional
ํด๋์ค๋ ํ๋ ํ์์ผ๋ก ์ฌ์ฉํ ๊ฒ์ ๊ฐ์ ํ์ง ์์์ผ๋ฏ๋ก Serializable
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ง๋ ฌํ ๋ชจ๋ธ์ด ํ์ํ๋ค๋ฉด Optional๋ก ๊ฐ์ ๋ฐํ๋ฐ์ ์ ์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ ๊ถ์ฅํ๋ค.
public class Person {
private Car car;
public Optional<Car> getCarAsOptional() {
return Optioanl.ofNullable(car);
}
}
Optional
์ธ์คํด์ค์์ ๊ฐ์ ์ฝ์ ์ ์๋ ๋ค์ํ ์ธ์คํด์ค ๋ฉ์๋
get()
์ ๊ฐ์ ์ฝ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฉ์๋๋ฉด์ ๋์์ ๊ฐ์ฅ ์์ ํ์ง ์์ ๋ฉ์๋๋ค. ๊ฐ์ด ์์ผ๋ฉด ํด๋น ๊ฐ์ ๋ฐํํ๊ณ ์์ผ๋ฉด NoSuchElementException
์ ๋ฐ์์ํจ๋ค.
orElse(T other)
๋ Optional
์ด ๊ฐ์ ํฌํจํ์ง ์์ ๋ ๋ํดํธ๊ฐ์ ์ ๊ณตํ ์ ์๋ค.
orElseGet(Supplier<? extends T> other)
์ Optional
์ ๊ฐ์ด ์์ ๋๋ง Supplier
๊ฐ ์คํ๋๋ค. ๋ํดํธ ๋ฉ์๋๋ฅผ ๋ง๋๋๋ฐ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ฑฐ๋ Optional
์ด ๋น์ด์์ ๋๋ง ๋ํดํธ๊ฐ์ ์์ฑํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
orElseThrow(Supplier<? extends X> exceptionSupplier)
๋ Optional
์ด ๋น์ด์์ ๋ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์ ์์ get
๋ฉ์๋์ ๋น์ทํ์ง๋ง ์ด ๋ฉ์๋๋ ๋ฐ์์ํฌ ์์ธ์ ์ข
๋ฅ๋ฅผ ์ ํํ ์ ์๋ค.
ifPresent(Consumer<? super T> consumer)
๋ ๊ฐ์ด ์กด์ฌํ ๋ ์ธ์๋ก ๋๊ฒจ์ค ๋์์ ์คํํ ์ ์๋ค. ๊ฐ์ด ์์ผ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ๊ฐ์ด ์กด์ฌํ๋ฉด true
๋ฅผ ๋ฐํํ๊ณ ๊ฐ์ด ์์ผ๋ฉด false
๋ฅผ ๋ฐํํ๋ isPresent()
๋ฉ์๋๋ ์๋ค.
public boolean isPresent() {
return value != null;
}
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
filter
๋ก ํน์ ๊ฐ ๊ฑฐ๋ฅด๊ธฐ
Optional
๊ฐ์ฒด๊ฐ ๊ฐ์ ๊ฐ์ง๋ฉฐ ํ๋ ๋์ผ์ดํธ์ ์ผ์นํ๋ฉด filter
๋ฉ์๋๋ ๊ทธ ๊ฐ์ ๋ฐํํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋น Optional
๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. Optional
์ด ๋น์ด์๋ค๋ฉด filter
์ฐ์ฐ์ ์๋ฌด ๋์๋ ํ์ง ์๋๋ค.