Generics
μ λ€λ¦μ λ°μ΄ν°μ νμ μ ν΄λμ€ λ΄λΆμμ μ§μ νλ κ²μ΄ μλλΌ μΈλΆμμ μ§μ νλ κΈ°λ²μΌλ‘, μ»΄νμΌ μμ μ κ°λ ₯ν νμ 체ν¬λ₯Ό μ§μνλ κΈ°λ₯μ΄λ€.
// μ λ€λ¦ ν΄λμ€(= μ λ€λ¦ νμ
)
class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
class Main {
public static void main(String[] args) {
Box<String> box = new Box<String>();
box.set("Hello");
String str = box.get();
}
}μ λ€λ¦μ μ¬μ©λλ μ©μ΄
μ λ€λ¦μμ μ¬μ©λλ μ©μ΄μ μλ―Έλ λ€μκ³Ό κ°λ€.
μ λ€λ¦ νμ (Generic Type)
List<E>
νμ μ νλΌλ―Έν°λ‘ κ°μ§λ ν΄λμ€λ μΈν°νμ΄μ€
νμ λ§€κ°λ³μ(Type Parameter)
<T>, <E>
μ λ€λ¦ μ μΈμ μ¬μ©λ λ§€κ°λ³μ
λ§€κ°λ³μν νμ (Parameterized Type)
List<String>
μ λ€λ¦ νμ μ μ€μ νμ μ λμ ν κ²
λ‘ νμ (Raw Type)
List
νμ λ§€κ°λ³μλ₯Ό μ¬μ©νμ§ μμ μΌλ° νμ (νμ νΈνμ±μ μν΄ μ‘΄μ¬νλ μ¬μ© μ§μ)
λΉνμ μ μμΌλμΉ΄λ
List<?>
λͺ¨λ νμ μ΄ μ¬ μ μμμ μλ―Έ
νμ μ μμΌλμΉ΄λ
List<? extends Number>
νΉμ νμ κ³Ό κ·Έ νμ/μμ νμ λ§ νμ©
μ¬κ·μ νμ νμ
<T extends Comparable<T>>
Tκ° μμ κ³Ό λΉκ΅ κ°λ₯ν νμ μ΄μ΄μΌ ν¨μ μλ―Έ
μΌλ°μ μΌλ‘ μ¬μ©λλ νμ νλΌλ―Έν° λͺ λͺ κ·μΉμ λ€μκ³Ό κ°λ€.
<T>
Type (μΌλ°μ μΈ λ°μ΄ν° νμ )
<E>
Element (컬λ μ μμ)
<K>
Key
<V>
Value
<N>
Number
μ λ€λ¦μ μ ν
μ λ€λ¦μ μ»΄νμΌ μμ μ νμ μ 체ν¬νκ³ λ°νμμλ νμ μ μ§μ°λ(Erasure) λ°©μμΌλ‘ λμνκΈ° λλ¬Έμ λͺ κ°μ§ μ μ½μ΄ λ°μνλ€.
static λ©€λ² μ¬μ© λΆκ°
static νλλ λ©μλλ ν΄λμ€κ° λ‘λ©λ λ λ©λͺ¨λ¦¬μ μ¬λΌκ°λ―λ‘, μΈμ€ν΄μ€ μμ± μμ μ κ²°μ λλ μ λ€λ¦ νμ
Tλ₯Ό μ¬μ©ν μ μλ€.
μ λ€λ¦ λ°°μ΄ μμ± λΆκ°
μ λ€λ¦ λ°°μ΄ νμ
μ μ°Έμ‘° λ³μ μ μΈμ κ°λ₯νμ§λ§, new T[10]κ³Ό κ°μ΄ λ°°μ΄μ μμ±νλ κ²μ λΆκ°λ₯νλ€.
μμΈ
newμ°μ°μλ ν μμμ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκΈ° μν΄ μ»΄νμΌ μμ μ νμ μ μ νν ν¬κΈ°λ₯Ό μμμΌ ν¨μ λ€λ¦μ λ°νμμ νμ μ΄ μκ±°λλ―λ‘ ν¬κΈ°λ₯Ό νμ ν μ μμ
ν΄κ²°
Object[]λ°°μ΄μ μμ±ν λ€ μ λ€λ¦ νμ μΌλ‘ νλ³ννκ±°λArrayListμ κ°μ 컬λ μ μ μ¬μ©ReflectionAPIμArray.newInstanceνμ©
μ λ€λ¦ ν΄λμ€μ νμ
νμ
μ λ€λ¦ ν΄λμ€λ μΈμ€ν΄μ€ μμ± μ νμ
μ λͺ
μν΄μΌ νλ©°, extends ν€μλλ₯Ό ν΅ν΄ λμ
κ°λ₯ν νμ
μ μ νν μ μλ€.
κΈ°λ³Έ μ¬μ©
Box<Apple> box = new Box<>();(JDK 7λΆν° μμ±μ μΈ‘ νμ μλ΅ κ°λ₯)Box<Fruit> box = new Box<Apple>();(λΆκ°λ₯: μ λ€λ¦μ λΆκ³΅λ³)
μ νλ μ λ€λ¦(
extends)<T extends Fruit>: Fruitκ³Ό κ·Έ μμλ§ λμ κ°λ₯<T extends Fruit & Eatable>: ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό λμμ μμ/ꡬνν΄μΌ νλ κ²½μ°&λ‘ μ°κ²° (ν΄λμ€κ° λ¨Όμ μμΌ ν¨)
μμΌλ μΉ΄λ
μ λ€λ¦μ μ μ°νκ² μ²λ¦¬νκΈ° μν΄ μμΌλμΉ΄λ(?)λ₯Ό μ¬μ©νλ©°, νΉμ νμ
μΌλ‘ μ ννκΈ° μν΄μ νμ μ μμΌλμΉ΄λλ₯Ό μ¬μ©ν μ μλ€.
<? extends T>: Tμ κ·Έ μμλ€λ§ κ°λ₯λ°μ΄ν°λ₯Ό κΊΌλ΄μ€λ(Produce) μν λ§ ν λ μ¬μ©
Tμ κ·Έ μμλ€λ§ κ°λ₯νλ―λ‘, κΊΌλΈ λ°μ΄ν°λ μ΅μνTμμ΄ λ³΄μ₯(readμμ )λ°μ΄ν°λ₯Ό λ£λ κ²μ λΆκ°λ₯(ꡬ체μ μΈ νμ νμ μ μ μ μκΈ° λλ¬Έ)
<? super T>: Tμ κ·Έ μ‘°μλ€λ§ κ°λ₯λ°μ΄ν°λ₯Ό μ μ₯νλ(Consume) μν λ§ ν λ μ¬μ©
Tνμ μ κ°μ²΄λ₯Ό μμ νκ² μ μ₯ κ°λ₯(writeμμ )
μ λ€λ¦ λ©μλ
ν΄λμ€μ μ λ€λ¦ νμ κ³Ό λ³κ°λ‘ λ©μλ λ 벨μμ λ 립μ μΈ μ λ€λ¦ νμ μ μ μνμ¬ μ¬μ©ν μ μλ€.
Generic Type Erasure
μ λ€λ¦ νμ μ μ»΄νμΌ μμλ§ μ ν¨νκ³ , μ»΄νμΌ νμλ λ°νμ μ€μλ νμ μ λ³΄κ° μ¬λΌμ§κ² λλ€.
νμ κ²½κ³ μ κ±°
<T extends Fruit>λFruitλ‘ μΉν<T>μ κ°μ΄ μ νμ΄ μμΌλ©΄Objectλ‘ μΉν
νμ μΊμ€ν μΆκ°
νμ μμ μ±μ μν΄ μμλ₯Ό μ°Έμ‘°νλ μ§μ μ μ μ ν μΊμ€ν μ½λλ₯Ό μ»΄νμΌλ¬κ° μλ μ½μ
λΈλ¦¬μ§ λ©μλ(Bridge Method) μμ±
λ€νμ±μ μ μ§νκΈ° μν΄ μ»΄νμΌλ¬κ° λ΄λΆμ μΌλ‘ λΈλ¦¬μ§ λ©μλλ₯Ό μμ±ν μ μμ
μ΄λ¬ν μκ±° νΉμ§ λλ¬Έμ λ°νμμ μ λ€λ¦ νμ
μ instanceofλ‘ κ²μ¬νκ±°λ, .classλ‘ νμ
μ μμλ΄λ κ²μ λΆκ°λ₯νλ€.
μ°Έκ³ μλ£
Last updated
Was this helpful?