2023. 3. 15. 11:17γJAVA/Effective JAVA
[μ΄νν°λΈ μλ°] Item26. λ‘(Law) νμ μ μ¬μ©νμ§ λ§λΌ.
4λ²μ§Έ μ±ν°λ‘ λ€μ΄μ€λ©΄μ μ λ€λ¦ νμ κ³Ό κ΄λ ¨λ itemλ€μ 곡λΆν μμ μ΄λ€.
μ λ€λ¦ νμ μ μ€λμ λΆν° λ€μ΄μ¨ κΈ°λ₯μΈλ° λκ° μ¬μ©νκΈ° μ΄λ €μ΄? λλμ΄ κ°ν΄μ λ΄κ° μ§μ μ¬μ©νλ κ²½μ°λ μ μλλ° μ¬μ€ μ λ€λ¦ νμ μ λ°λλ‘ μ¬μ©νκΈ° νΈνλΌκ³ λ§λ€μ΄μ§ κΈ°λ₯μ΄λ€.
λ°λΌμ μ΄νν°λΈ μλ° 4μ₯μ 곡λΆνλ©΄μ μ΄λ² κΈ°νμ μ λ€λ¦ νμ κ³Ό μΉν΄μ§(?) μμ μ΄λ·!!!
μ λ€λ¦ νμ κ³Ό μΉν΄μ§κΈ° μν΄μλ λ¨Όμ μ©μ΄λ₯Ό μμμΌ νλλ° λ§μΉ¨ κ°μμμλ μ©μ΄ μ 리λ₯Ό μμμ νκΈ° λλ¬Έμ μ΄λ² κΈμμλ μ λ€λ¦ κ΄λ ¨ μ©μ΄ μ 리λ₯Ό νλ€. π₯
μ λ€λ¦ Generic
μ λ€λ¦μ μλ°5λΆν° μ¬μ©ν μ μμλλ° μ λ€λ¦μ μ§μνκΈ° μ κΉμ§λ 컬λ μ μμ κ°μ²΄λ₯Ό κΊΌλΌλλ§λ€ νλ³νμ νμ΄μΌ νλ€. λ°λΌμ λκ΅°κ° μ€μλ‘ λ€λ₯Έ κ°μ λ£μ΄λλ©΄ λ°νμμ νλ³ν μ€λ₯κ° λλ λ¬Έμ κ° μμλ€.
λ°λ©΄, μ λ€λ¦μ μ¬μ©νλ©΄ 컬λ μ μ΄ λ΄μ μ μλ νμ μ μ»΄νμΌλ¬μ μλ €μ£Όκ² λλ€. κ·Έλμ μ»΄νμΌλ¬λ μμμ νλ³ν μ½λλ₯Ό μΆκ°ν μ μκ² λκ³ , μλ±ν νμ μ κ°μ²΄λ₯Ό λ£μΌλ €λ μλλ₯Ό μ»΄νμΌ κ³Όμ μμ μ°¨λ¨νμ¬ λ μμ νκ³ λͺ νν νλ‘κ·Έλ¨μ λ§λ€μ΄μ€λ€.
λ‘ νμ
List numbers = new ArrayList();
numbers.add(10);
numbers.add("whiteShip");
for (Object number : numbers) {
System.out.println("number = " + (Integer)number); // error!
}
λ‘ νμ μ μ λ€λ¦ νμ μμ νμ 맀κ°λ³μλ₯Ό μ ν μ¬μ©νμ§ μμ λλ₯Ό λ§νλ€. μ΄λ κ² List μ체λ₯Ό λ‘ νμ μ΄λΌκ³ νλ€.
μ΄λ κ² μ λ€λ¦ νμ μ μ¬μ©νμ§ μμΌλ©΄ numbers List μμ μμ μμμ²λΌ 10, whiteShip μ²λΌ μ무 νμ μ΄λ add ν μ μλ€.
μ무κ°μ΄λ λ£μΌλ©΄ μνν μ΄μ λ λ°μ forλ¬Έμ ν΅ν΄μ numbersμ κ°μ μΆλ ₯νκ³ μλλ° numbersμ μ«μλ§ λ€μ΄κ° κ²μ΄λΌκ³ μκ°ν΄μ (Integer)λ‘ νλ³νμ νλλ° μ΄λ whiteShipμ integerλ‘ νλ³νμ ν μ μκΈ° λλ¬Έμ μλ¬κ° λλ μν©μ΄ λ°μνλ€.
λ¬Όλ‘ μ§κΈμ μ½λκ° λ§€μ°λ§€μ° κ°λ¨νλκΉ μ΄λκ° λ¬Έμ μΈμ§ κΈλ°© νμ ν μ μμ§λ§.. μ°λ¦¬.. μ€λ¬΄μμ μ½λκ° μ΄λ κ² κ°λ¨νμ§ μμΌλ γ γ
κ·Έλ΄ λ λ¬Όλ‘ νμ μ΄ μ΄λ ΅κ² μ§..
μ λ€λ¦ νμ , 맀κ°λ³μν νμ
List<Integer> numbers2 = new ArrayList<>();
numbers2.add(10);
// numbers2.add("whiteShip"); // compile error λ°μ
for (Integer integer : numbers2) {
System.out.println("integer = " + integer);
}
ν΄λμ€μ μΈν°νμ΄μ€μ νμ 맀κ°λ³μκ° μ°μ΄λ©΄ μ΄λ₯Ό μ λ€λ¦ ν΄λμ€, μ λ€λ¦ μΈν°νμ΄μ€λΌκ³ νλ€.
κ·Έλ¦¬κ³ μ΄ μ λ€λ¦ ν΄λμ€μ μ λ€λ¦ μΈν°νμ΄μ€λ₯Ό ν΅νμ΄μ μ λ€λ¦ νμ μ΄λΌκ³ νλ€.
μ λ€λ¦ νμ μ μΌλ ¨μ 맀κ°λ³μν νμ μ μ μν΄μΌ νλ€.
μ λ€λ¦ νμ μ λ¨Όμ ν΄λμ€(νΉμ μΈν°νμ΄μ€) μ΄λ¦μ΄ λμ€κ³ , μ΄μ΄μ κΊΎμ κ΄νΈ μμ μ€μ νμ 맀κ°λ³μλ€μ λμ΄νλ€.
List<E> μ²λΌ νννλ κ²μ λ§νκ³ List<Integer>λ 맀κ°λ³μν νμ μ΄λΌκ³ νλ€.
νμ 맀κ°λ³μ
List<E> μμ E λ₯Ό νμ 맀κ°λ³μλΌκ³ νλλ° λ³΄ν΅ EλΌκ³ λ§μ΄ νμ§λ§ μ¬μ©μκ° μ μν΄μ μ¬μ©ν μλ μκΈ°λ νλ€.
μ€μ 맀κ°λ³μ
List<Integer> μμ Integerκ° μ€μ 맀κ°λ³μμ΄λ€.
public class Box<E /*extends Number*/> {
private E item;
private void add(E e) {
this.item = e;
}
private E get() {
return this.item;
}
public static void main(String[] args) {
Box<Integer> box = new Box<>();
box.add(10);
System.out.println(box.get() * 100);
printBox(box);
}
private static void printBox(Box<?> box) {
System.out.println("box = " + box.get());
}
}
μ¬κΈ°μ Box<E>κ° μ λ€λ¦ ν΄λμ€μ΄λ€.
νμ μ νμ 맀κ°λ³μ
νμ μ νμ 맀κ°λ³μλ Box<E extends Number> μ²λΌ Numberλ₯Ό μμλ°μ νμ λ§ λ€μ΄μ¬ μ μλλ‘ νμ νλ κ²μ λ§νλ€.
Box<String>μ μλ¬ λλ€.
λΉνμ μ μμΌλμΉ΄λ νμ
Box<?> μ²λΌ ? λ₯Ό μ¬μ©ν κ²μ λ§νλλ° λΉνμ μ μμΌλ μΉ΄λλ μ무 κ°μ΄λ λμμ΄ λλ€.
νμ μ μμΌλμΉ΄λ νμ
Box<? extends Number> μ²λΌ Numberλ₯Ό μμλ°μ νμ μΌλ‘ μ ννλ€.