μ λ€λ¦(Generic)μ λνμ¬
by JiwonDevκΈ°μ‘΄μ μλ°μμλ Object νμ μ μ΄μ©νμ¬ λ€νμ±μ ꡬννμλ€. μ΄ κ²½μ° λ°νλ Object νμ μ λ€μ μνλ κ°μ²΄λ‘ λ³ννλ κ³Όμ μμ λ¬Έμ κ° λ°μνλλΌλ μ»΄νμΌνμμμ ν΄λΉ μ€λ₯λ₯Ό μ‘μ μ μμλ€. μ¦ λ¨μν νμ μ€μκ° λ°νμ μ€λ₯λ‘ λμ΄κ° μ±μ΄ λ©μΆ°λ²λ¦¬λ μ΅μ μ μν©κΉμ§ κ° μ μμλ€.
κ·Έλμ Java 5λΆν° Genericμ΄λΌλ νμ κΈ°λ₯μ μ 곡ν΄μ€λ€. μ»΄νμΌ μμ μ νμ μ 체ν¬νμ¬ λ€μν λ¬Έμ λ₯Ό λ°©μ§νκ³ λ€νμ±μ μ§μνλ μ½λλ₯Ό μ½κ² λ§λ€ μ μκ² ν΄μ€λ€.
# μ λ€λ¦μ μ₯μ
μ λ€λ¦μ μ¬μ©μμ μ»λ μ΄μ μ μ»΄νμΌ νμμ κ°ν νμ 체ν¬λ₯Ό ν μ μκ² λ§λ€μ΄μ€λ€λ κ²μ΄λ€. νμ μ λͺ μμ μΌλ‘ νμνλ©΄μ λΆνμν νμ μΊμ€ν μ΄λ λ°νμμ λ°μν μ μλ μ€λ₯λ₯Ό μλ°©ν΄μ€λ€.
* μ λ€λ¦μ μ¬μ©νλ€κ³ ν΄μ λ°μ΄νΈμ½λκ° λ³νμ§λ μλλ€.
μ λ€λ¦μ μ»΄νμΌ νμμ λμμ£Όλ λꡬμ΄μ§, μ»΄νμΌ μ΄νμ λ°μ΄νΈμ½λμ λ³νλ₯Ό μ£Όκ±°λ JVMμ μ±λ₯μ ν₯μμν€μ§λ μλλ€. μ»΄νμΌ μλ£ λ λ°μ΄νΈμ½λλ₯Ό λ―μ΄λ³΄λ©΄ μ λ€λ¦μ java.lang.Objectλ‘ μμ λμ΄μκΈ°μ μλ° μ½λμμ μ λ€λ¦μ μΌλ° νμ μΌλ‘ λ°κΏλ λ°μ΄νΈμ½λλ λμΌνλ€.
μ¦, μλμ λ μ½λλ μ λ€λ¦μ μ¬μ©νλ, κ·Έλ₯ Listλ₯Ό μ¬μ©νλ λμΌν λ°μ΄νΈ μ½λλ₯Ό μμ±μ νλ€.
// λ§μ½ Listμ λ€λ₯Έ μλ£νμ΄ λ€μ΄κ°λ€ν΄λ μ»΄νμΌ μμ μ νμΈν λ°©λ²μ΄ μλ€.
// listμ λ€λ₯Έ νμ
μ μλͺ» λ£μ μ¬μ€μ κ°λ°μκ° λμΉλ€λ©΄ μ¬κ°ν λ°νμ λ²κ·Έλ₯Ό λ§λ€ μ μλ€.
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // λΆνμν Object -> String μΊμ€ν
// μ λ€λ¦μ νμ
μ λͺ
μμ μΌλ‘ λνλ΄κ³ , μ»΄νμΌ μμ μ 체ν¬κ° κ°λ₯νλ€.
// νμνλ€λ©΄ < exnteds, super > λ±μ μ΄μ©νμ¬ μ»΄νμΌ μμ μ νμ
μ κ°μ ν μλ μλ€.
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // listμ λ€λ₯Έ νμ
μ΄ λ€μ΄κ° μ μλ€. νμ
μ΄ StringμΌλ‘ κ°μ λλ€.
μ λ€λ¦μΌλ‘ μ μΈλ κ°μ²΄λ μ»΄νμΌ μμ μ νμ μ΄ κ²°μ λλ€. κ·Έλμ ν΄λμ€ μ λ€λ¦μ κ²½μ° Static λ©€λ²λ new μ κ²½μ° μΈμ€ν΄μ€κ° λ§λ€μ΄μ§κΈ° μ κΉμ§ νμ μ μ μμκΈ° λλ¬Έμ μ λ€λ¦ νμ λ³μ(T)λ₯Ό μ¬μ© ν μ μμμ μ μνμ.
# ν΄λμ€ μ λ€λ¦
public class ν΄λμ€λͺ
<T> { ... }
public interface μΈν°νμ΄μ€λͺ
<T> { ... }
public class Box<T> {
private T t;
public T get() { return t; }
public void set(T t) { this.t = t }
}
Box<Integer> box = new Box<Integer>();
Box<String> box = new Box<String>();
// μλμ κ°μ΄ μλ΅νλλΌλ μ»΄νμΌλ¬κ° μμ μ½λλ‘ λ³νν΄μ€λ€.
Box<Integer> box = new Box<>();
Box<String> box = new Box<>();
# μ λ€λ¦ λ©μλ
ν΄λμ€κ° μλ λ©μλ λ¨μμμλ μ λ€λ¦ μ¬μ©μ΄ κ°λ₯νλ€. λ°νκ° μμ <νμ >μ λͺ μν΄μ£Όλ©΄ λλ€.
public <νμ
νλΌλ―Έν°,...> 리ν΄νμ
λ©μλλͺ
(맀κ°λ³μ,...) { ... }
// λ°νκ° μμ νμ
μ λͺ
μν΄μ£Όμ΄μΌνλ€.
public <T> Box<T> boxing(T t) { ... }
// μ¬μ©ν λλ λ§μ°¬κ°μ§λ‘ λ°ν κ° μμ νμ
μ λͺ
μν΄μ£Όλ©΄ λλ€.
Box<Integer> box = <Integer>boxing(100);
Box<Integer> box = boxing(100); //java 7λΆν° νμ
μ μλ΅ν μ μκ² λμλ€.
# λ©ν°νμ νλΌλ©ν
μ°Έκ³ λ‘ μ λ€λ¦μ μ¬λ¬νμ μ μ¬μ©νλ 건 Java 7λΆν° μ§μνλ κΈ°λ₯μ΄λ€.
class<K,V,...> { ... }
interface<K,V,...> { ... }
Product<TV, String> product = new Product<Tv,String>();
Product<Tv,String> product = new Product<>(); // νμ
μ μλ΅ν΄λ λλ€. μΆλ‘ κ°λ₯
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public void setKey(K key) {
this.key = key;
}
public void setValue(V value) {
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
public class Util {
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
boolean keyCompare, valueCompare;
keyCompare = p1.getKey().equals(p2.getKey());
valueCompare = p1.getValue().equals(p2.getValue());
return keyCompare && valueCompare;
}
}
# μ λ€λ¦ νμ μ ν
extends μ superλ₯Ό μ΄μ©νμ¬ νμ μ μ ν ν μ μλ€. μ°Έκ³ λ‘ μ¬λ¬ ν΄λμ€ μ μ½μ λμμ κ±Έκ³ μΆλ€λ©΄ & μ°μ°μλ₯Ό μ°λ©΄ λλ€.
// ν΄λΉ νμ
λλ ν΄λΉ νμ
μ μμ νμ
λ§ μ¬μ©κ°λ₯
public <T extends νμ
> 리ν΄νμ
λ©μλ(맀κ°λ³μ, ...) { ... }
// ν΄λΉ νμ
λλ ν΄λΉ νμ
μ λΆλͺ¨ νμ
λ§ μ¬μ©κ°λ₯
public <T super νμ
> 리ν΄νμ
λ©μλ(맀κ°λ³μ, ...) { ... }
// λ€μ€μμμ μλμ§λ§, μΈν°νμ΄μ€μ κ²½μ° μ¬λ¬ ν΄λμ€μ μ μ½μ λμμ κ±°λ κ²½μ°λ μκΈ΄λ€.
public class Item<T extends Book & List> { }
// λ€μκ³Ό κ°μ μ λ€λ¦μ΄ μμ λ
public class Item<T extends Book> { }
public class Book { } // μκΈ°μμ , Book ν΄λμ€ μ¬μ©κ°λ₯
public class JavaBook extends Book { } // Bookμ μμν΄λμ€ μ¬μ©κ°λ₯
public class Drink { } // μκ΄μλ ν΄λμ€. μ¬μ©λΆκ°λ₯
public <T extends Number> int compare(T t1, T t2) {
double v1 = t1.doubleValue();
double v2 = t2.doubleValue();
return Double.compare(v1, v2);
}
# μμΌλ μΉ΄λ
μ λ€λ¦μΌλ‘ λ§λ€μ΄μ§ ν΄λμ€λ₯Ό μ¬μ©νλ μ½λλ₯Ό μ΄ν΄λ³΄μ.
class Juicer {
static Juice makeJuice(FruitBox<Fruit> box) {
String names = "";
for(Fruit fruit : box.getList()) { names += fruit }
return new Juice(names);
}
}
μ λ€λ¦μ λ§λ€ λμλ λ³ λ¬Έμ κ° μμ μ€ μμμ§λ§, μ¬μ©ν λ λ€μκ³Ό κ°μ λ¬Έμ κ° λ°μνλ€.
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
Juicer.makeJuice(fruitBox); // OK
FruitBox<Grape> grapeBox = new FruitBox<Grape>();
Juicer.makeJuice(grapeBox); // Err!, FruitBoxλ Fruitνμ
μΌλ‘ κ²°μ λμ΄ λ³κ²½λΆκ°λ₯.
μ΄ λ μ¬μ©ν΄λΌκ³ λ§λ κ²μ΄ μμΌλμΉ΄λ( <?> ) μ΄λ€. μμΌλμΉ΄λλ μ΄λ ν νμ λ λ°μ μ μλ μ λ€λ¦μΈλ°, μ¬κΈ°μ μ λ€λ¦ μ νμ κ±Έμ΄ λ΄κ° μνλ νΉμ νμ μ μ§μ νμ¬ μ¬μ© ν μ μλ€.
<? extends T> // Tμ μμλ€λ§ κ°λ₯
<? super T> // Tμ μ‘°μλ€λ§ κ°λ₯
<?> // λͺ¨λ νμ
κ°λ₯. <? extends Object>μ κ°μ. λ³΄ν΅ μ΄λ κ² μ¬μ©νμ§λ μμ
// μμΌλ μΉ΄λλ₯Ό μ΄μ©νμ¬ μ λ€λ¦μ ꡬννλ©΄ λ€νμ±μ ꡬννκΈ° μ¬μμ§λ€.
static Juice makeJuice(FruitBox<? extends Fruit>) {
...
}
FruitBox<Grape> grapeBox = new FruitBox<Grape>();
Juicer.makeJuice(grapeBox); // OK!
μ€μ λ‘ μ¬λ¬ μλ£νμ λ€λ£¨λ Collectionμ κ²½μ° μμΌλμΉ΄λλ₯Ό μ΄μ©νμ¬ λ§λ λ©μλλ€μ λ§μ΄ λ³Ό μ μλ€.
static <T> void sort(List<T> list, Comparator<? super T> cmp)
'πκΈ°λ³Έ μ§μ > Java κΈ°λ³Έμ§μ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ°λ λ λκΈ°ν (sync, volatile, AtomicClass) (0) | 2021.07.27 |
---|---|
μλ°μ Stringκ³Ό Constant Pool (2) | 2021.07.27 |
.equalsμ .hashCode()λ νμ ν¨κ» μ€λ²λΌμ΄λ©ν΄μΌνλ€. (0) | 2021.07.27 |
μλ°μμ Stack Memory & Heap Memory (0) | 2021.07.10 |
JVM(μλ°κ°μλ¨Έμ )κ³Ό JRE, JDK (0) | 2021.06.30 |
λΈλ‘κ·Έμ μ 보
JiwonDev
JiwonDev