๐ฏ ์์ดํ 31. ํ์ ์ ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํด API ์ ์ฐ์ฑ์ ๋์ด๋ผ.
๋งค๊ฐ๋ณ์ํ ํ์
์ ๋ถ๊ณต๋ณ์ด๋ค. ์ฆ ์๋ก ๋ค๋ฅธ ํ์
Type1๊ณผ Type2๊ฐ ์์ ๋ List์ List์ ํ์ ํ์
๋ ์์ ํ์
๋ ์๋๋ค.
์ฆ, List์ List๊ฐ ํ๋ ์ผ์ ์ ๋๋ก ์ํํ์ง ๋ชปํ๋ ํ์ ํ์
์ด ๋ ์ ์๋ค. ( ๋ฆฌ์ค์ฝํ ์นํ ์์น ์ ์ด๊ธ๋๋ค. )
- ์์ผ๋์นด๋ ํ์ ์ ์ฌ์ฉํ์ง ์์ pushAll ๋ฉ์๋ - ๊ฒฐํจ์ด ์๋ค!
// Stack์ public API
public void pushAll(Iterable<E> src){
for (E e : src) {
push(e);
}
}
์ธ๋ป๋ณด๋ฉด ์ปดํ์ผ๋ ๋๊ณ ์๋ฒฝํด ๋ณด์ด์ง๋ง ๊ฒฐํจ์ด ์๋ค. public final class Integer extends Number implements Comparable<Integer>{}
public static void main(String[] args) {
Stack<Number> stack = new Stack<>();
List<Integer> integers = List.of(1,2,3);
stack.pushAll(integers);
}
Integer๋ Number์ ํ์ํ์
์์๋ ๋ถ๊ตฌํ๊ณ ์ ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์๋ฐ๋ ์ด๋ฐ ์ํฉ์ ๋์ฒํ ์ ์๋ ํ์ ์ ์์ผ๋์นด๋ ํ์
์ด๋ผ๋ ํน๋ณํ ๋งค๊ฐ๋ณ์ํ ํ์
์ ์ง์ํ๋ค.
- E ์์ฐ์ ๋งค๊ฐ๋ณ์์ ์์ผ๋์นด๋ ํ์
์ ์ฉ
E ํ์ ์ ํ์ฅํ ๋ชจ๋ ํ์ ์ ๋ฐ์ ์ ์๊ฒ๋๋ค.public void pushAll(Iterable<? extends E> src){ for (E e : src) { push(e); } }
- ์์ผ๋์นด๋ ํ์
์ ์ฌ์ฉํ์ง ์์ popAll ๋ฉ์๋ - ๊ฒฐํจ์ด ์๋ค!
์ด ๋ํ ๋ฌธ์ ์์ด ์๋ฒฝํ ๊ฑฐ๋ผ ์๊ฐํ์ง๋ง ๊ฒฐํจ์ด ์กด์ฌํ๋ค.public void popAll(Collection<E> dst){ while (!isEmpty()) dst.add(pop()); }
public static void main(String[] args) {
Stack<Number> stack = new Stack<>();
List<Integer> integers = List.of(1,2,3);
stack.pushAll(integers); // ์์ผ๋ ์นด๋ ์ ์ฉ
Collection<Object> objects = new ArrayList<>();
stack.popAll(objects);
}
์ ์ฒ๋ผ Object๋ Number์ ํ์ํ์ ์ด ์๋๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
- E ์๋น์ ๋งค๊ฐ๋ณ์์ ์์ผ๋์นด๋ ํ์ ์ ์ฉ์ ์ฐ์ฑ์ ๊ทน๋ํํ๋ ค๋ฉด ์์์ ์์ฐ์๋ ์๋น์์ฉ ์ ๋ ฅ ๋งค๊ฐ๋ณ์์ ์์ผ๋์นด๋ ํ์ ์ ์ฌ์ฉํ๋ผ.
public void popAll(Collection<? super E> dst){ while (!isEmpty()) dst.add(pop()); }
- but. ์ ๋ ฅ ๋งค๊ฐ๋ณ์๊ฐ ์์ฐ์์ ์๋น์ ์ญํ ์ ๋์์ ํ๋ค๋ฉด ์์ผ๋์นด๋ ํ์ ์ ์จ๋ ์ข์ ๊ฒ ์๋ค.
- ํ์ค(PECS) : producer-extends, consumer-super
- ์ฆ, ๋งค๊ฐ๋ณ์ํ ํ์
T๊ฐ ์์ฐ์๋ผ๋ฉด <? extends T>๋ฅผ ์ฌ์ฉํ๊ณ , ์๋น์๋ผ๋ฉด <? super T>๋ฅผ ์ฌ์ฉํ๋ผ.
union ๋ฉ์๋
public static <E> Set<E> union(Set<E> s1, Set<E> s2)
s1, s2๊ฐ ๋ชจ๋ ์์ฐ์์ด๋ ํ์ค๊ณต์์ ๋ฐ๋ผ
public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2)
โ ๋ฐํ ํ์ ์๋ ํ์ ์ ์์ผ๋์นด๋ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ ๋๋ค. ์ ์ฐ์ฑ์ ๋์ฌ์ฃผ๊ธฐ๋์ปค๋ ํด๋ผ์ด์ธํธ ์ฝ๋์์๋ ์์ผ๋์นด๋ ํ์ ์ ์จ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
โญ ํด๋์ค ์ฌ์ฉ์๊ฐ ์์ผ๋์นด๋ ํ์ ์ ์ ๊ฒฝ ์จ์ผ ํ๋ค๋ฉด ๊ทธ API์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
์ฐธ๊ณ ์๋ฃ
Joshua Bloch, ใEffective Java 3/Eใ, ๊ฐ์๋งต์ ์ฎ๊น, ํ๋ก๊ทธ๋๋ฐ์ธ์ฌ์ดํธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=