ν°μ€ν 리 λ·°
π μ§λ€λ¦μ€(Generics)
: λ€μν νμ (Objectμ μμ)μ κ°μ²΄λ€μ λ€λ£¨λ λ©μλλ 컬λ μ ν΄λμ€μ μ»΄νμΌ μμ νμ 체ν¬λ₯Ό ν΄μ£Όλ κΈ°λ₯
ππ»βοΈ μ§λ€λ¦μ€ μ μ°λμ?
1οΈβ£ κ°μ²΄μ νμ μμ μ±↑
- μλνμ§ μμ νμ μ κ°μ²΄κ° μ μ₯λλ κ²μ λ§μ
- μλͺ» νλ³ν λμ΄ λ°μν μ μλ μ€λ₯λ₯Ό μ€μ¬μ€
2οΈβ£ νμ 체ν¬μ νλ³νμ λ²κ±°λ‘μ↓
βοΈ μ§λ€λ¦ ν΄λμ€
class Box<T> {
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
Box<String> box = new Box<>(); // new Box<String>()κ³Ό κ°μ!
- T : νμ λ³μ (μν©μ λ§κ² E(element), K(key), V(value) λ± μλ―Έμλ λ¬Έμλ₯Ό νμ λ¬Έμλ‘ μ¬μ©), μμμ μ°Έμ‘°ν νμ
- Box<T> : μ§λ€λ¦ ν΄λμ€, 'T Box'λΌκ³ μ½μ
- Box : μμ νμ
- Box<String> : μ§λ€λ¦ νμ νΈμΆ (μ¬κΈ°μ Stringμ λμ λ νμ = λ§€κ°λ³μνλ νμ )
β μ»΄νμΌ νμλ Box<String>μ μμ νμ μΈ Boxλ‘ λ°λ! (μ»΄νμΌλ¬κ° μ»΄νμΌν λλ§ μ¬μ©νκ³ μ λ€λ¦ νμ μ κ±°)
class Box {
String item;
void setItem(String item) { this.item = item; }
String getItem() { return item; }
}
β static λ©€λ² λ³μμ νμ λ³μ Tλ₯Ό μ¬μ©ν μ μμ!
: μ§λ€λ¦μ€λ μΈμ€ν΄μ€λ³λ‘ λ€λ₯΄κ² λμνλλ‘ λ§λ κΈ°λ₯(Tλ μΈμ€ν΄μ€ λ³μλ‘ κ°μ£Ό)μ΄λκΉ! λͺ¨λ κ°μ²΄μ λν΄ λμΌνκ² λμνλ static λ©€λ²λ νμ λ³μ T μ¬μ©X
β μ§λ€λ¦ νμ λ°°μ΄(ex. new T[])μ μμ±ν μ μμ!
: new μ°μ°μλ μ»΄νμΌ μμ μ νμ Tκ° λμ§ μ ννκ² μμμΌ ν¨! (κ°μ μ΄μ λ‘ instanceof μ°μ°μλ μ¬μ©ν μ μμ) but ArrayList<T>λ κ°λ₯!
β μ§λ€λ¦ ν΄λμ€λ₯Ό μμ±ν λ, μ°Έμ‘°λ³μμ μμ±μμ λμ λ νμ μ΄ μμ ν μΌμΉν΄μΌν¨! (μμ κ΄κ³μ¬λX)
Box<Object> box = new Box<String>(); // μλ¬!
ππ»βοΈ νμ λ§€κ°λ³μ Tμ μ§μ ν μ μλ νμ μ μ’ λ₯λ₯Ό μ νν μ μλμ?
π©π»π« extendsμ μ¬μ©ν΄μ μ ν κ°λ₯!
class FruitBox<T extends Fruit> { ... }
class FruitBox<T extends Eatable> { ... } // μ£Όμ! Eatable(μΈν°νμ΄μ€)λ extends μ¬μ©!
class FruitBox<T extends Fruit & Eatable> { ... }
ππ»βοΈ λ©μλμ λ§€κ°λ³μλ‘ μ§λ€λ¦ ν΄λμ€ κ°μ²΄κ° λ€μ΄μ€λ©΄, λμ λ νμ (<T>)μ λ°λΌ λ©μλλ₯Ό λ°λ‘ λ§λ€μ΄μΌ λλλ°, κ·Έλ¬λ©΄ μ€λ³΅λ λ©μλ μ μλ‘ μλ¬κ° λ°μν΄μ(μ§λ€λ¦ νμ μ΄ λ€λ₯Έ κ²λ§μΌλ‘λ μ€λ²λ‘λ© μ±λ¦½X)T.T
class Juicer {
static Juice makeJuice (FruitBox<Fruit> box) {
String ingredient = "";
for(Fruit f: box.getList()) ingredient += f + " ";
return new Juice(ingredient);
}
}
Juicer.makeJuice(new FruitBox<Fruit>()); // OK
Juicer.makeJuice(new FruitBox<Apple>()); // μλ¬. FruitBox<Fruit> box = new FruitBox<Apple>()μ΄ λΆκ°λ₯νκΈ° λλ¬Έ!
π‘ μμΌλ μΉ΄λ(?)λ₯Ό μ¬μ©
class Juicer {
static Juice makeJuice (FruitBox<? extends Fruit> box) {
String ingredient = "";
for(Fruit f: box.getList()) ingredient += f + " ";
return new Juice(ingredient);
}
}
β <? extends T>, <? super T>, <?> (= <? extends Object>) λ‘ μ ν κ°λ₯!! (&μ μ¬μ©λΆκ°)
ππ»βοΈ <? super T>λ μΈμ μ¬μ©νμ£ ? (μ°Έκ³ . <T super T>λ λΆκ°!)
π©π»π« Comparatorμ ν¨κ» κ°μ₯ λΉλ²νκ² μ¬μ©λ¨!, μ΄μ¨λ μ€λ³΅λ μ½λλ₯Ό μ κ±°νκΈ° μν΄μ!
Comparator<? super Apple> // Comparator<Apple>, Comparator<Fruit>, Comparator<Object> κ°λ₯!
βοΈ μ§λ€λ¦ λ©μλ
: λ©μλ μ μΈλΆμ μ§λ€λ¦ νμ μ΄ μ μΈλ λ©μλ
: μ§λ€λ¦ νμ μ μ μΈ μμΉλ λ°ν νμ λ°λ‘ μ!
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
β static λ©μλμλ μ¬μ© κ°λ₯! (μ§λ€λ¦ νμ μ§μλ³μλ₯Ό μ μΈνλ κ²κ³Ό κ°μμ)
class Juicer {
static <T extends Fruit> Juice makeJuice (FruitBox<T> box) {
String ingredient = "";
for(Fruit f: box.getList()) ingredient += f + " ";
return new Juice(ingredient);
}
}
Juicer.makeJuice(new FruitBox<Fruit>()); // Juicer.<Fruit>makeJuice(new FruitBox<Fruit>());
β <T>λ₯Ό μλ΅ν μ μλ κ²½μ°μλ μ°Έμ‘°λ³μ(ex. this)λ ν΄λμ€ μ΄λ¦(ex. Juicer) μλ΅ λΆκ°!
βοΈ μ§λ€λ¦ νμ μ νλ³ν
: μ§λ€λ¦ νμ κ³Ό μμ νμ (non-generic) κ°μ νλ³ν O
Box box = (Box) new Box<String>(); // OK
Box<String> strBox = (Box<String>) new Box(); // OK
: λμ λ νμ μ΄ λ€λ₯Έ μ§λ€λ¦ κ°μ νλ³νμ X
Box<Object> objbox = (Box<Object>) new Box<String>(); // μλ¬.
Box<String> strBox = (Box<String>) new Box<Object>(); // μλ¬.
: μμΌλ μΉ΄λ(?)λ₯Ό μ¬μ©ν νμ κ³Ό μ§λ€λ¦ νμ κ°μ νλ³ν O
FruitBox<Apple> box = (FruitBox<Apple>) FruitBox<? extends Fruit>(); // OK
β κ·Έλμ λμ λ νμ μ΄ λ€λ₯Έ μ§λ€λ¦ κ°μ νλ³νμ΄ λΆκ°λ₯ νμ§λ§, μμΌλ μΉ΄λκ° ν¬ν¨λ μ§λ€λ¦ νμ μΌλ‘ νλ³ν νλ©΄ κ°λ₯!
: μμΌλ μΉ΄λκ° μ¬μ©λ μ§λ€λ¦ νμ λΌλ¦¬ νλ³ν λΆλΆμ κ°λ₯
FruitBox<? extends Object> objBox = (FruitBox<? extends Object>) new FruitBox<? extends String>();
βοΈ μ§λ€λ¦ νμ μ κ±°
: μ»΄νμΌλ¬λ μ§λ€λ¦ νμ μ μ΄μ©ν΄μ μμ€μ½λλ₯Ό 체ν¬νκ³ , νμν κ³³μ νλ³νμ λ£μ΄μ€ ν μ§λ€λ¦ νμ μ μ κ±°!
1οΈβ£ μ§λ€λ¦ νμ μ κ²½κ³ μ κ±°
: <T extends Fruit>λΌλ©΄ Tλ FruitμΌλ‘ μΉν, <T>λΌλ©΄ Tλ Objectλ‘ μΉν! ν΄λμ€ μμ μ μΈμ μ κ±°
2οΈβ£ μ§λ€λ¦ νμ μ μ κ±°ν νμ νμ μ΄ μΌμΉνμ§ μμΌλ©΄, νλ³ν μΆκ°
3οΈβ£ μμΌλ μΉ΄λκ° ν¬ν¨λμ΄ μλ κ²½μ°μλ μ μ ν νμ μΌλ‘ νλ³νμ΄ μΆκ°!
'μΈμ΄ > μλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ λν μ΄μ (0) | 2023.07.20 |
---|---|
μ΄κ±°ν (0) | 2023.07.17 |
컬λ μ νλ μμ (0) | 2023.07.13 |
java.langν¨ν€μ§μ μ μ©ν ν΄λμ€ (0) | 2023.06.29 |
μμΈμ²λ¦¬ (0) | 2023.06.25 |