Generic?
μλ°μμ μ λ€λ¦(generic)μ΄λ λ°μ΄ν°μ νμ
(data type)μ μΌλ°ννλ€(generalize)λ κ²μ μλ―Ένλ€.μ λ€λ¦μΒ ν΄λμ€λ λ©μλμμ μ¬μ©ν λ΄λΆ λ°μ΄ν° νμ
μ μ»΄νμΌ μμ 미리 μ§μ νλ λ°©λ²μ΄λ€. μ΄λ κ² μ»΄νμΌ μμ 미리 νμ
κ²μ¬(type check)λ₯Ό μννλ©΄ λ€μκ³Ό κ°μ μ₯μ μ κ°μ§λ€.
1.Β μ λ€λ¦μ μ¬μ©νλ©΄ μλͺ»λ νμ
μ΄ λ€μ΄μ¬ μ μλ κ²μ μ»΄νμΌ λ¨κ³μμ λ°©μ§ν μ μλ€.
2.Β ν΄λμ€ μΈλΆμμ νμ
μ μ§μ ν΄μ£ΌκΈ° λλ¬Έμ λ°λ‘ νμ
μ 체ν¬νκ³ λ³νν΄μ€ νμκ° μλ€. μ¦, κ΄λ¦¬νκΈ°κ° νΈνλ€.
3.Β λΉμ·ν κΈ°λ₯μ μ§μνλ κ²½μ° μ½λμ μ¬μ¬μ©μ±μ΄ λμμ§λ€.
JDK 1.5 μ΄μ μμλ μ¬λ¬ νμ
μ μ¬μ©νλΒ λλΆλΆμ ν΄λμ€λ λ©μλμμΒ μΈμλ λ°νκ°μΌλ‘ Object νμ
μ μ¬μ©νλ€. νμ§λ§ μ΄Β κ²½μ°μλ λ°νλ Object κ°μ²΄λ₯Ό λ€μ μνλ νμ
μΌλ‘ νμ
λ³νν΄μΌ νλ©°, μ΄λ μ€λ₯κ° λ°μν κ°λ₯μ±λ μ‘΄μ¬νλ€. νμ§λ§ JDK 1.5λΆν° λμ
λ μ λ€λ¦μ μ¬μ©νλ©΄ μ»΄νμΌ μμ 미리 νμ
μ΄ μ ν΄μ§λ―λ‘, νμ
κ²μ¬λ νμ
λ³νκ³Ό κ°μ λ²κ±°λ‘μ΄ μμ
μ μλ΅ν μ μκ² λλ€.
Genericμ μ¬μ© λ°©λ²
Generic ν΄λμ€
μ λ€λ¦μ ν΄λμ€μ λ©μλμμ μ¬μ©ν μ μλλ° μ λ€λ¦ νμ
μ μ μΈν ν΄λμ€λ₯Ό μ λ€λ¦ ν΄λμ€λΌ νλ€. ν΄λμ€μμ μ¬μ©νλ €λ©΄ ν΄λμ€ λͺ
μ°μΈ‘μ <>λ₯Ό μ¬μ©ν΄μ μ μΈνλ€.
public class Box<T> {
private T item;
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
// ,(μ½€λ§)λ‘ κ΅¬λΆν΄μ μ¬λ¬ κ°λ₯Ό μ μΈν μ μλ€.
public class Box<M, I> {
private M material;
private I item;
public M getMaterial() {
return material;
}
public void setMaterial(M material) {
this.material = material;
}
public I getItem() {
return item;
}
public void setItem(I item) {
this.item = item;
}
}
Java
볡μ¬
Box<Paper, String> box = new Box<Paper, String>();
Box<Paper, String> box = new Box<>(); // JDK1.7λΆν° μλ΅ κ°λ₯
Box box = new Box(); // Objectλ‘ κ°μ£Ό
Java
볡μ¬
μ λ€λ¦ λ©μλ
μ λ€λ¦μ ν΄λμ€ λ 벨μμλ§ μ¬μ©ν μ μλκ² μλλΌ λ©μλ λ 벨μμλ μ¬μ©ν μ μλ€.
μ λ€λ¦ νμ
μ μ μΈν λ©μλλ₯Ό μ λ€λ¦ λ©μλλΌ νλ€. ν΄λμ€μ μ λ€λ¦ νμ
μ΄ μ μ λ³μμ²λΌ μ¬μ©λλ€λ©΄ λ©μλμ μ λ€λ¦ νμ
μ ν΄λΉ λ©μλ μμμλ§ μ¬μ©ν μ μλ μ§μμ±μ κ°λλ€.
public class CoffeeMachine {
public <T> Coffee makeCoffee(T capsule) {
return new Coffee(capsule);
}
}
Java
볡μ¬
μ λ€λ¦ νμ
μ λ©μλμμ μ μΈν λλ μ κ·Όμ νμμ λ°ννμ
μ¬μ΄μ μ μΈνλ€.
CoffeeMachine coffeeMachine = new CoffeeMachine();
Colombian capsule = new Colombian();
coffeeMachine.<Colombian>makeCoffee(capsule);
coffeeMachine.makeCoffee(capsule); // νμ
μΆμ κ°λ₯νλ―λ‘ μλ΅ κ°λ₯
Java
볡μ¬
μ λ€λ¦ λ©μλλ₯Ό νΈμΆν λλ λ©μλ λͺ
μμ <>λ‘ νμ
μ μ§μ ν΄μ€μΌ νμ§λ§ μ»΄νμΌλ¬κ° νμ
μ μΆμ ν μ μλ κ²½μ°μ μλ΅ν μ μλ€.
Generic Type Parameterμ μ ν
μ λ€λ¦μ μ¬μ©νλ©΄ μ¬μ©ν λ νμ
μ μ§μ νκ² λλλ°, 'μ΄λ€ νμ
μ΄ μ¬ μ μλμ§'λ₯Ό μ ννμ§ μμΌλ©΄ λ§ κ·Έλλ‘ μ€λ§κ°μ§ νμ
μ΄ μ¬ μ μλ€. λ°λΌμ μλ°λ extends, super ν€μλλ₯Ό ν΅ν΄ μ΄λ₯Ό λ¬Έλ²μ μΌλ‘ μ νν μ μλ κΈ°λ₯μ μ 곡νλ€.
1.
extend ν€μλλ₯Ό ν΅ν΄ λͺ¨λ νμ
μ΄ μλ νΉμ ν΄λμ€μ κ·Έ νμ ν΄λμ€λ‘ μ νν μ μλ€.
2.
& ν€μλλ₯Ό ν΅ν΄ ν΄λμ€μ ν¨κ» μΈν°νμ΄μ€ μ μ½ μ‘°κ±΄μ μ΄μ©ν μ μλ€.
1. extends ν€μλλ₯Ό ν΅ν Type Parameter μ ν
class BoxMaterial { }
class Paper extends BoxMaterial { }
class Plastic extends BoxMaterial { }
public class Box<M extends BoxMaterial> {
private M material;
public static void main(String[] args) {
Box<Water> waterBox = new Box<>(); // λΆκ°. BoxMaterialκ³Ό μμ νμ
λ§ κ°λ₯
Box<Paper> paperBox = new Box<>();
Box<Plastic> plasticBox = new Box<>();
}
}
Java
볡μ¬
M extends BoxMaterialκ³Ό κ°μ΄ μ μΈν¨μΌλ‘μ¨ Mμλ λͺ¨λ νμ
μ΄ μλ BoxMaterialκ³Ό κ·Έ μμ ν΄λμ€λ§ μ¬ μ μλ€.
extends λ€μ μ€λ νμ
μ΄ μΈν°νμ΄μ€μ¬λ λμΌνκ² extends ν€μλλ₯Ό μ¬μ©νλ€.
2. & ν€μλλ₯Ό ν΅ν μΈν°νμ΄μ€ μ μ½
class BoxMaterial implements Hard { }
class Paper extends BoxMaterial { }
class Plastic extends BoxMaterial { }
public interface Hard { }
public class Box<M extends BoxMaterial & Hard> {
private M material;
public static void main(String[] args) {
Box<Paper> paperBox = new Box<>();
Box<Plastic> plasticBox = new Box<>();
}
}
Java
볡μ¬
extends λ€μ μΈν°νμ΄μ€ μ μ½ μ‘°κ±΄μ μ¬μ©νλ €λ©΄ & ν€μλλ₯Ό μ¬μ©νλ€.
M extends BoxMaterial & Hardλ Boxμ material νλκ° BoxMaterialμ΄λ©΄μ Hardλ₯Ό ꡬνν νμ
λ§ μ§μ ν μ μλλ‘ μ νν κ²μ΄λ€.
Generic μμΌλμΉ΄λ
GenericμΌλ‘ ꡬνλ λ©μλμ κ²½μ°μλ μ μΈλ νμ
μΌλ‘λ§ λ§€κ°λ³μλ₯Ό μ
λ ₯ν΄μΌνλ€. μ΄λ₯Ό μμλ°μ ν΄λμ€, νΉμ λΆλͺ¨ ν΄λμ€λ₯Ό 맀κ°λ³μλ‘ μ¬μ©νκ³ μΆμ΄λ λΆκ°λ₯νλ©°, νΉμ κ·Έ μ΄λ€ νμ
μ΄ μλ μκ΄ μλ κ²½μ°μ λμνκΈ° μ’μ§ μλ€. μ΄λ₯Ό μν ν΄λ²μΌλ‘ Wildcardλ₯Ό μ¬μ©νλ€.
1.
μ λ€λ¦κ³Ό μκ΄μμ΄ λͺ¨λ νμ
μ λ΄μ μ μλ€.
2.
Generic Type κ°μ²΄λ₯Ό ν λΉ λ°μ λ μμΌλ μΉ΄λ ? μ΄μ©
μμ
ArrayList <Animal> β ArrayList<Dog>
β ArrayList<Cat>
ArrayListμ κ²½μ° λ€νμ±μ΄ μλλΌ ArrayList μμ²΄κ° λ€λ₯Έ κ²μ΄λΌ λΆκ°λ₯νλ€!
β κ·Έλ λ€λ©΄ μλ‘ λ€λ₯Έ typeμ ArrayListλ₯Ό λ£κ³ μΆμ κ²½μ° μ΄λ»κ²??
β WildCard μ¬μ©! (Generic typeμ μκ΄μμ΄ λͺ¨λ κ²μ λ°μμ€ μ μλ€)
ArrayList<?> , ArrayList< ? extends A>, ArrayList<? super B>
WildCardμ 3κ°μ§ μ’ λ₯
1.
Unbound WildCard
List<?>μ κ°μ ννλ‘ λ¬Όμνλ§ κ°μ§κ³ μ μ λμ΄μ§λ€. λ΄λΆμ μΌλ‘λ Objectλ‘ μ μ λμ΄μ μ¬μ©λκ³ λͺ¨λ νμ
μ μΈμλ‘ λ°μ μ μλ€. νμ
νλΌλ―Έν°μ μμ‘΄νμ§ μλ λ©μλλ§μ μ¬μ©νκ±°λ Object λ©μλμμ μ 곡νλ κΈ°λ₯μΌλ‘ μΆ©λΆν κ²½μ°μ μ¬μ©νλ€.
2.
Upper Bounded Wildcard
List<? extends Foo>μ κ°μ ννλ‘ μ¬μ©λκ³ , νΉμ ν΄λμ€μ μμ ν΄λμ€λ§μ μΈμλ‘ λ°κ² λ€λ μ μΈμ΄λ€. μμμμλ Foo ν΄λμ€λ₯Ό μμλ°μ μ΄λ€ ν΄λμ€κ° μλ λμ§λ§ μ¬μ©ν μ μλ κΈ°λ₯μ Fooν΄λμ€μ μ μλ κΈ°λ₯λ§ μ¬μ©κ°λ₯ νλ€. μ£Όλ‘ λ³μμ μ νμ μννκ² νκΈ° μν΄μ μ¬μ©λλ€
3.
Lower Bounded Wildcard
List<? super Foo>μ κ°μ ννλ‘ μ¬μ©λκ³ , Upper boundedμλ λ°λλ‘ νΉμ ν΄λμ€μ λΆλͺ¨ν΄λμ€λ§μ μΈμλ‘ λ°κ² λ€λ μ μΈμ΄λ€. μμμμλ Fooν΄λμ€μ λΆλͺ¨μΈ μ΄λ€ κ°μ²΄λ μΈμλ‘ μ¬ μ μμ§λ§, μ¬μ©ν λλ Objectλ‘ μ·¨κΈ λλ€.