item 31 sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μμ΄ν 28μμ λμ¨ κ² μ²λΌ λ§€κ°λ³μν νμ μ λΆκ³΅λ³μ΄λ€(List<String>μ List<Object>μ νμνμ μ΄ μλ κ²μ²λΌ)
νμ§λ§ μμΌλμΉ΄λμ²λΌ λΆκ³΅λ³ λ°©μλ³΄λ€ μ μ°ν 무μΈκ°κ° νμνλ€.
μλ μ½λλ μμ΄ν 29μ Stack ν΄λμ€μ public APIλ§ μΆλ¦° κ²μ pushAll λ©μλλ₯Ό μΆκ°ν κ²μ΄λ€.
public class Stack<E> {
public Stack();
public void push(E e);
public E pop();
public boolean isEmpty();
// μμΌλ μΉ΄λλ₯Ό μ¬μ©νμ§ μμ pushAll μμ
// μ
λ ₯ λ§€κ°λ³μ μμλ₯Ό μ€νμ λ£λ λ©μλ
public void pushAll(Iterable<E> src) {
for (E e : src)
push(e);
}
}public class Test{
public static void main(String[] args) {
Stack<Number> numberStack = new Stack<>();
Iterable<Integer> integers = Arrays.asList(
Integer.valueOf(1), Integer.valueOf(2));
numberStack.pushAll(integers);
}
}μ μ½λμ²λΌ Stackλ₯Ό μ μΈν ν pushAllμ Iterable νμ μ λ£μΌλ©΄ μ μλν κ²μ΄λΌ κΈ°λν μ μμΌλ, λΆκ³΅λ³ νμ μ΄κΈ° λλ¬Έμ μ€λ₯κ° λ°μνλ€.
μ μ½λλ₯Ό μ¬λ°λ₯΄κ² μλνλ λ°©λ²μ μμ°μ μμΌλμΉ΄λλ₯Ό μ¬μ©νλ κ²μ΄λ€. μμ°μ μμΌλμΉ΄λλ νμ νμ μ κ°μ νκ³ μ ν λ μ°μΈλ€.
public void pushAll(Iterable<? extends E> src) {
for (E e : src) {
push(e);
}
}-
Iterable<? extends E> src: pushAllμ μ λ ₯ λ§€κ°λ³μ νμ μ 'Eμ Iterable'μ΄ μλλΌ 'Eμ νμ νμ μ Iterable'μ΄μ΄μΌ νλ€λ κ²μ λνλ΄λ μμΌλμΉ΄λ.
μμλ° μμΌλμΉ΄λλ μμ°μ μμΌλμΉ΄λμ λ°λμ κ°λ μΌλ‘ μμ νμ μ κ°μ νκ³ μ ν λ μ°μΈλ€.
μλ₯Όλ€μ΄, μλ popAll λ©μλλ λ§€κ°λ³μμ Collectionμ Stackμ΄ κ°μ§ μμλ₯Ό λκΈΈ λ μ°μ΄λ λ©μλμ΄λ€. λ©μλμ μλλΌλ©΄ μμκ° μμ μμμΈ Collectionμκ² popAllμ΄ μ μ μλν΄μΌνκ³ μ΄λ΄ λ μλΉμ μμΌλμΉ΄λλ₯Ό μ¬μ©ν μ μλ€.
public void popAll(Collection<? super E> dst) {
while(!isEmpty()) {
dst.add(pop());
}
}μμΌλμΉ΄λλ₯Ό μ μ©νλλ° μΈ μ μλ 곡μμ΄ μλ€. λ§€κ°λ³μν νμ Tκ° μμ°μλΌλ©΄ <? extends T>λ₯Ό μ¬μ©νκ³ , μλΉμλΌλ©΄ <? super T>λ₯Ό μ¬μ©νλ κ²μ΄λ€.
Tκ° μμ°μλΌλ©΄, λ€λ₯Έ κ°μ²΄λ‘λΆν° μ λ¬ λ°μμΌνκΈ°μ, λ΄ μμ λ³΄λ€ ν΄λΉ κ°μ²΄λ νμ μμμ΄μ¬μΌ νλ€.
Tκ° μλΉμλΌλ©΄, λ€λ₯Έ κ°μ²΄λ‘ μ λ¬ ν΄μΌνκΈ°μ, λ΄ μμ λ³΄λ€ ν΄λΉ κ°μ²΄λ μμ μμμ΄μ¬μΌ νλ€.
λ°λΌμ μλμ κ°μ 곡μμ΄ μ±λ¦½ν μ μλ€.
νμ€(PECS): producer-extends, consumer-super
λ°ν νμ μλ νμ μ μμΌλμΉ΄λ νμ μ μ¬μ©νλ©΄ μλλ€. μλ₯Ό λ€μ΄ set 2κ°λ₯Ό ν©μΉλ union λ©μλλ₯Ό ꡬνν κ²½μ°, PECS μμΉμ λ°λΌ μμ°μ λ©μλμ ν΄λΉλλ©° extendλ₯Ό μ μ©νλ€. νμ§λ§ λ°ννμ μλ μμΌλμΉ΄λλ₯Ό μ μ©ν κ²½μ° ν΄λΌμ΄μΈνΈμμλ μμΌλμΉ΄λ νμ μ μ¨μΌνλ€.
μλ μ½λκ° λ°ννμ μ μμΌλμΉ΄λ λ―Έ μ μ©μ μ΄μ μ 보μ¬μ€λ€. ν΄λμ€ μ¬μ©μλ μμΌλμΉ΄λ νμ μ΄ μ°μλ€λ μ¬μ€μ‘°μ°¨ μμνμ§ λͺ»νκ³ μ¬μ©ν μ μλ μ½λκ° λλ€.
public class Union {
public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
public static void main(String[] args) {
// java 8 μ΄μ
Set<Double> doubleSet = Set.of(1.0, 2.1);
Set<Integer> integerSet = Set.of(1, 2);
Set<Number> unionSet = union(doubleSet, integerSet);
/*
java 7 μ΄ν
μ»΄νμΌλ¬κ° μ¬λ°λ₯Έ νλΉμ μΆλ‘ νμ§ λͺ»ν΄
λͺ
μμ νμ
μΈμλ₯Ό μ¬μ©ν΄ νμ
μ μλ €μ£Όλ©΄ λλ€.
Set<Double> doubleSet = new HashSet<>(Set.of(1.0, 2.1));
Set<Integer> integerSet = new HashSet<>(Set.of(1, 2));
Set<Number> unionSet = Union.<Number>union(doubleSet, integerSet);
*/
}
}Comparable<E> 보λ€λ Comparable<? super E>λ₯Ό μ¬μ©νκ³ , Compator<E> 보λ€λ Comparator<? super E>λ₯Ό μ¬μ©ν΄μΌ νλ€.
public interface Comparable<E>
public interface Delayed extends Comparable<Delayed>
public interface ScheduledFuture<V> extends Delayed, Future<V>μ μ½λλ Comparable, Delayed, ScheduledFuture μΈν°νμ΄μ€μ μ μΈλΆμ΄λ€. νΉμ§μ, ScheduledFuture μΈν°νμ΄μ€λ Comparableμ extendsνμ§ μκ³ Delayedλ§ extends νμλ€.
λ°λΌμ, Comparableλ₯Ό μ¬μ©ν κ²½μ°, Delayed μΈμ€ν΄μ€μ ScheduledFuture λΉκ΅ κ°λ₯μ± λλ¬Έμ μ μ μλνμ§ μκ² λλ€.
μλ 첫λ²μ§Έ μ μΈμ λΉνμ μ νμ λ§€κ°λ³μλ₯Ό μ¬μ©νκ³ λ λ²μ§Έλ λΉνμ μ μμΌλμΉ΄λλ₯Ό μ¬μ©νλ€.
public static <E> void swap(List<E> list, int i, int j);
public static void swap(List<?> list, int i, int j);λλ²μ§Έ λ°©λ²μ μ¬μ©ν΄μΌ νλ€(λ©μλ μ μΈμ νμ λ§€κ°λ³μκ° ν λ²λ§ λμ€λ©΄ μμΌλ μΉ΄λλ‘ λ체νλΌ). μ΄λ€ 리μ€νΈμ΄λ μ΄ λ©μλμ λκΈ°λ©΄ λͺ μν μΈλ±μ€μ μμλ€μ κ΅νν΄ μ€ κ²μ΄λ©° μ κ²½ μ¨μΌ ν νμ λ§€κ°λ³μλ μκΈ° λλ¬Έμ΄λ€.
νμ§λ§, λλ²μ§Έ λ°©λ²λ λ¨μ μ΄ μλ€. μλμ κ°μ μ§κ΄μ μΈ μ½λλ μλ¬λ₯Ό λ°μμν¨λ€. List<?>μλ null μΈμλ μ΄λ€ κ°λ λ£μ μ μκΈ° λλ¬Έμ΄λ€.
public static void swap(List<?> list, int i, int j) {
list.set(i, list.set(j, list.get(i));
}μ΄λ, λΉνμ μ νμ λ§€κ°λ³μ λ°©λ²μ μΆκ°λ‘ μ¬μ©νμ¬ μμΌλμΉ΄λ νμ μ μ€μ νμ μ μλ €μ£Όλ λ©μλλ₯Ό private λμ°λ―Έ λ©μλλ‘ μ¬μ©νλ λ°©λ²μ΄λ€.
public static void swap(List<?> list, int i, int j) {
swapHelper(i, list.set(j, list.get(i));
}
public static <E> void swapHelper(List<E> list, int i, int j) {
list.set(i, list.set(j, list.get(i));
}