- μ λ€λ¦μ΄λ?
- μ λ€λ¦ μ¬μ©μ μ₯μ
- μ λ€λ¦ μ¬μ© λ°©λ²
- μ λ€λ¦ λ©μλ
- <?> : μμΌλ μΉ΄λ(Wild card)
- extends μ super
- μ λ€λ¦ μ¬μ© μμ
μ λ€λ¦μ΄λ?
ν΄λμ€ λ΄λΆμμ μ§μ νλ κ²μ΄ μλ μΈλΆμμ μ¬μ©μμ μν΄ μ§μ λλ κ²μ μλ―Έν¨.
μ λ€λ¦ μ¬μ©μ μ₯μ
- νμ
μμ μ± λ³΄μ₯
- μ»΄νμΌ μμ μμ νμ μλ¬λ₯Ό μ‘μλ΄ λ°νμ μμ λ°μν μ μλ μλ¬λ₯Ό λ°©μ§
- μ½λ μ¬μ¬μ©μ± μ¦κ°
- μ½λ μμ±ν λ νμ μ μ§μ ν νμκ° μμΌλ―λ‘ λ€μν νμ μ λν΄ μ¬μ¬μ©μ±μ΄ λμμ§.
- μ½λ κ°λ
μ± ν₯μ
- μ½λλ₯Ό λ μ§κ΄μ μΌλ‘ μμ±ν μ μμ.
- ν λ³ν μ κ±°
- νλ³νμ μ κ±°ν μ μμ΄μ μ½λκ° λ κΉλν΄μ§κ³ κ°κ²°ν΄μ§.
- 컬λ μ
μμ μ μ©ν¨
- 컬λ μ μ λ€μν νμ μ λ΄μ μ μμ΄μΌνλ―λ‘ μ λ€λ¦μ νμ μμ μ±κ³Ό νλ³ν μ κ±°λ‘ μ½λκ° λ κΉλν΄μ§
- μλ£κ΅¬μ‘°μμμ νμ©
- μλ£κ΅¬μ‘°μμλ λ€μν νμ μ λν΄ μ μ°νκ² λμ²κ°λ₯. Stackν΄λμ€λ₯Ό ꡬνν λ μ¬μ©νλ©΄ λ€μν νμ μ μμλ₯Ό λ΄μ μ μλ μ€νμ ꡬνν μ μμ.
μ λ€λ¦ μ¬μ© λ°©λ²
μ λ€λ¦ νμ
| νμ | μ€λͺ |
|---|---|
| <\T> | Type |
| <\E> | Element |
| <\K> | Key |
| <\V> | Value |
| <\N> | Number |
ν΄λμ€ λ° μΈν°νμ΄μ€ μ μΈ
κΈ°λ³Έμ μΈ μ λ€λ¦ νμ μ ν΄λμ€ , μΈν°νμ΄μ€ μ μΈ
public class ClassName <T> {...}
public Interface InterfaceName <T> {...}
Tνμ μ ν΄λΉ λΈλ {β¦}μμμ μ ν¨ν¨.
μ λ€λ¦ νμ μΈμ λ κ° μ μΈ
public class ClassName <T,K> {...}
public Interface InterfaceName <T,K> {...}
//λνμ μΌλ‘ νμ
μΈμ λ κ° λ°λ 컬λ μ
: HashMap
public class HashMap<K,V> {...}
λ°μ΄ν° νμ μ μΈλΆλ‘λΆν° μ§μ ν μ μμ.
μμ²λΌ μμ±λ μ λ€λ¦ ν΄λμ€λ₯Ό μ¬μ©νκ³ μΆλ€? β κ°μ²΄ μμ±μ ν λ ꡬ체μ μΈ νμ μ λͺ μν΄μ£Όμ΄μΌ ν¨.
public class ClassName <T,K> {...}
public class Main {
public static void main(String[] args){
ClassName<String, Integer> a = new ClassName<String, Integer>();
}
}
μ£Όμ! νμ νλΌλ―Έν°λ‘ λͺ μν μ μλ κ²μ μ°Έμ‘° νμ (Reference Type)λ°μ μ¬ μ μμ
μ¦, int, double, char κ°μ primitive typeμ λΆκ°. κ·Έλμ intν doubleν λ± primitive Typeμ κ²½μ° Integer, Double κ°μ Wrapper TypeμΌλ‘ μ°λ μ΄μ κ° λ°λ‘ μμκ°μ μ΄μ λ€.
λν λ°κΏ λ§νλ©΄ μ°Έμ‘° νμ μ΄ μ¬ μ μλ€λ κ²μ μ¬μ©μκ° μ μν ν΄λμ€λ νμ μΌλ‘ μ¬ μ μλ€λ κ²μ΄λ€.
public class ClassName <T> {...}
public class Student {...}
public class Main {
public static void main(String[] args){
ClassName<Student> a = new ClassName<Student>();
}
}
μ λ€λ¦ λ©μλ
λ©μλμ μ μΈλΆμ νμ λ³μλ₯Ό μ¬μ©ν λ©μλ μ΄λ νμ λ³μμ μ μΈμ λ©μλ μ μΈλΆμμ λ°ν νμ λ°λ‘ μμ μμΉ
public static <T> void sort( ... ) { ... }
public <T> T genericMethod(T o){
...
}
[μ κ·Ό μ μ΄μ] <μ λ€λ¦νμ
> [리ν΄νμ
] [λ©μλλͺ
]([νλΌλ―Έν°νμ
] [νλΌλ―Έν°]){
//ν
μ€νΈ
}

<?> : μμΌλ μΉ΄λ(Wild card)
νμ νλΌλ―Έν°λ₯Ό ꡬ체μ μΌλ‘ μ ν
public static <T extends Number> int compare(T t1, T t2) {
// extendsλ₯Ό μ΄μ©ν΄ νμ
μ ν
double v1 = t1.doubleValue();
double v2 = t2.doubleValue();
return Double.compare(v1, v2);
}
μμΌλμΉ΄λ(wild card)λ μ΄λ¦μ μ νμ λμ§ μμμ νννλ λ° μ¬μ©λλ κΈ°νΈλ₯Ό μλ―Έν¨.
extends μ super
? extends T : μν κ²½κ³ ? super T : νν κ²½κ³ λ¨, κ²½κ³λ₯Ό μ§μ νκ³ Kλ νΉμ νμ μΌλ‘ μ§μ μ΄ λμ§λ§, ?λ νμ μ΄ μ§μ λμ§ μλλ€.
<?>Β
νμ λ³μμ λͺ¨λ νμ μ μ¬μ©ν μ μμ. (<? extends Object>μ κ°μ μλ―Έ )
<?Β extendsΒ T>Β
T νμ κ³Ό T νμ μΒ μμλ°λΒ μμ ν΄λμ€ νμ λ§μ μ¬μ©ν μ μμ.
<?Β superΒ T>Β
T νμ κ³Ό T νμ μ΄Β μμλ°μ μ‘°μΒ ν΄λμ€ νμ λ§μ μ¬μ©ν μ μμ.
<K extends T>
Tμ Tμ μμ νμ λ§ κ°λ₯ (Kλ λ€μ΄μ€λ νμ μΌλ‘ μ§μ λ¨.)
<K super T>
Tμ Tμ λΆλͺ¨(μ‘°μ) νμ λ§ κ°λ₯ (Kλ λ€μ΄μ€λ νμ μΌλ‘ μ§μ λ¨.)
/*
* Numberμ μ΄λ₯Ό μμνλ Integer, Short, Double, Long λ±μ
* νμ
μ΄ μ§μ λ μ μμΌλ©°, κ°μ²΄ νΉμ λ©μλλ₯Ό νΈμΆ ν κ²½μ° Kλ
* μ§μ λ νμ
μΌλ‘ λ³νμ΄ λλ€.
*/
<K extends Number>
/*
* Numberμ μ΄λ₯Ό μμνλ Integer, Short, Double, Long λ±μ
* νμ
μ΄ μ§μ λ μ μμΌλ©°, κ°μ²΄ νΉμ λ©μλλ₯Ό νΈμΆ ν κ²½μ° μ§μ λλ νμ
μ΄ μμ΄
* νμ
μ°Έμ‘°λ₯Ό ν μλ μλ€.
*/
<? extends T> // Tμ Tμ μμ νμ
λ§ κ°λ₯
?(λ¬Όμν)
μμΌλ μΉ΄λ <?> μ <? extends Object> μ κ°λ€.
[Objectλ μλ°μμμ λͺ¨λ API λ° μ¬μ©μ ν΄λμ€μ μ΅μμ νμ μ΄λ€. ]
public class ClassName { ... }public class ClassName extends Object { ... }
κΈ°λ³Έμ μΌλ‘ public class ClassName extends Object {} λ₯Ό 묡μμ μΌλ‘ μμλ°λ κ²μ΄λ λ€λ¦μ΄ μμ!
νλ§λλ‘ <?>μ μ΄λ€ νμ μ΄λ μκ΄ μλ€λ μλ―Έ.
=> λ°μ΄ν°κ° μλ 'κΈ°λ₯'μ μ¬μ©μλ§ κ΄μ¬μ΄ μλ κ²½μ°μ <?>λ‘ μ¬μ©ν μ μμ
μ λ€λ¦ μ¬μ© μμ
μ λ€λ¦ ν΄λμ€ μμ
- νμ μΈμ 1κ°
class ClassName<E>{
private E element; //μ λ€λ¦ νμ
λ³μ μ μΈ
void set(E element) { // μ λ€λ¦ λ§€κ°λ³μ λ©μλ
this.element = element;
}
E get(){ // μ λ€λ¦ νμ
λ°ν λ©μλ
return element;
}
}
public class Main {
public static void main(String[] args){
ClassName<String> a = new ClassName<String>();
ClassName<String> b = new ClassName<String>();
a.set("10");
b.set(10);
System.out.println("a data : " + a.get());
//λ°νλ λ³μμ νμ
μΆλ ₯
System.out.println("a E Type : " + a.get().getClass().getName());
System.out.println("b data : " + b.get());
//λ°νλ λ³μμ νμ
μΆλ ₯
System.out.println("b E Type : " + b.get().getClass().getName());
}
}
ClassNameμ΄λ κ°μ²΄λ₯Ό μμ±ν λ <> μμ νμ νλΌλ―Έν°(Type parameter) E λ₯Ό μ§μ .
aκ°μ²΄μ ClassNameμ E μ λ€λ¦ νμ μ StringμΌλ‘ λͺ¨λ λ³νλλ€.
bκ°μ²΄μ ClassNameμ E μ λ€λ¦ νμ μ IntegerμΌλ‘ λͺ¨λ λ³νλλ€.
μ€μ λ‘ μ μ½λλ₯Ό μ€νμν€λ©΄ λ€μκ³Ό κ°μ΄ μΆλ ₯λλ€.

- νμ μΈμ 2κ°
class ClassName<K,V>{
private K first; //K μ λ€λ¦ νμ
private V second; //V μ λ€λ¦ νμ
void set(K first,V second) { // μ λ€λ¦ λ§€κ°λ³μ λ©μλ
this.first = first;
this.second = second;
}
K getfirst(){ // μ λ€λ¦ νμ
λ°ν λ©μλ
return first;
}
V getsecond(){
return second;
}
}
public class Main {
public static void main(String[] args){
ClassName<String,Integer> a = new ClassName<String,Integer>();
a.set("10",10);
System.out.println("first data : " + a.getfirst());
//λ°νλ λ³μμ νμ
μΆλ ₯
System.out.println("K Type : " + a.getfirst().getClass().getName());
System.out.println("second data : " + second.getsecond());
//λ°νλ λ³μμ νμ
μΆλ ₯
System.out.println("V Type : " + b.getseconde().getClass().getName());
}
}
κ²°κ³Ό

μ λ€λ¦ λ©μλ μμ
λ©μλ νμ μ λ€λ¦ μ¬μ©νλ λ°©λ²
// λ§€κ° λ³μ νμ
: T
// λ¦¬ν΄ νμ
: Box<T>
public <T> Box<T> boxing(T t) {
Box<T> box = new Box<T>();
box.set(t);
return box;
}
//νΈ
public class BoxingMethodExample {
public static void main(String[] args) {
Box<Integer> box1 = <Integer>boxing(100);
int intValue = box1.get();
Box<String> box2 = boxing("νκΈΈλ");
String strValue = box2.get();
}
}