Jiny Jan 27, 2021 2021-01-27T23:40:00+09:00
Sep 4, 2021 2021-09-04T10:25:19+09:00 8 min
Generic
πΏ Generic
Data Typeμ μΌλ°ν νλκ²μ μλ―Έ
- Classs λ Methodμμ μ¬μ©ν λ΄λΆ λ°μ΄ν° νμ
μ μ»΄νμΌ μμ 미리 μ§μ νλ λ°©λ²
- Classλ λ©μλ λ΄λΆμμ μ¬μ©λλ κ°μ²΄μ νμ
μ μμ μ±μ λμΌ μ μλ€.
- λ°νκ°μ λν νμ
λ³ν λ° νμ
κ²μ¬μ λ€μ΄κ°λ λ
Έλ ₯μ μ€μΌ μ μλ€.
- Object νμ
μΌλ‘ μ¬μ©μ λ€μ νμ
λ³νμ ν΄μ€μΌ νλ λ²κ±°λ‘μμ΄ μμ μ μλ€.
μ₯μ
- μλͺ»λ νμ
μ΄ μ¬μ©λ μ μλ λ¬Έμ λ₯Ό μ»΄νμΌ κ³Όμ μμ μ κ±°ν μ μκΈ° λλ¬Έ
- μ»΄νμΌλ¬λ μ λ€λ¦ μ½λμ λν΄ κ°ν νμ
체ν¬λ₯Ό νλ€.
- μ€ν μ νμ
μλ¬κ° λλ κ²λ³΄λ€ μ»΄νμΌ μμ 미리 νμ
μ κ°νκ² μ²΄ν¬ν΄μ μλ¬λ₯Ό μ¬μ μ λ°©μ§
- νμ
λ³νμ ν νμκ° μμ΄ νλ‘κ·Έλ¨ μ±λ₯μ΄ ν₯μ
μ¬μ©
1
2
3
4
5
6
7
8
9
| class GenericSample<T> {
T element;
void setElement(T element){
this.element = element;
T getElement() {
return element;
}
}
}
|
νμ
λ³μ
- μ΄λ¦μ μ ν μμ
- μ¬λ¬κ°μ νμ
λ³μλ ,λ‘ κ΅¬λΆ
- Classμμ λΏλ§ μλλΌ Methodμ 맀κ°λ³μλ λ°νκ°μΌλ‘λ μ¬μ© κ°λ₯
- μμμ μ°Έμ‘°ν νμ
μ μλ―Έ
- νμ‘΄νλ ν΄λμ€λ₯Ό μ¬μ©ν΄λ λκ³ μ‘΄μ¬νμ§ μλ κ²μ μ¬μ©ν΄λ λ¨
μ΄λ¦
- E: μμ
- K: ν€
- N: μ«μ
- T: νμ
- V: κ°
- S,U,V: λλ²μ¨°, μΈλ²μ§Έ, λ€λ²μ§Έ
πΏ Bounded type parameter
νΉμ νμ
μ μλΈ νμ
μΌλ‘ μ ν
1
2
3
4
5
6
| public class BoundTypeSample<T extends Number> {
public void set(T value) {}
public static void main(String[] args) {
BoundTypeSample<Integer> bound = new BoundTypeSample<>();
}
}
|
- Numberμ μλΈ νμ
λ§ νμ©
πΏ WildCard
μ λ€λ μΌλ‘ ꡬνλ Methodμ κ²½μ° μ μΈλ νμ
μΌλ‘λ§ λ§€κ°λ³μλ₯Ό μ
λ ₯ν΄μΌ νλ€. μ΄λ₯Ό μμλ°μ ν΄λμ€ νΉμ λΆλͺ¨ Classμμ μ¬μ© λΆκ°νκΈ° νκ³ μ΄λ€ νμ
μ΄ μλ μκ΄μλ κ²½μ°μ λμνκΈ° μ’μ§ μλ€.
Unbounded WildCard
- List<?> μ κ°μ ννλ‘ λ¬Όμνλ§ κ°μ§κ³ μ μ
- λ΄λΆμ μΌλ‘ Objectλ‘ μ μλμ΄μ μ¬μ©λκ³ λͺ¨λ νμ
μ μΈμλ₯Ό λ°μ μ μλ€.
- Object ν΄λμ€μμ μ 곡λλ κΈ°λ₯μ μ¬μ©νμ¬ κ΅¬νν μ μλ Methodλ₯Ό μμ±ν κ²½μ°
- νμ
νλΌλ―Έν°μ μμ‘΄μ μ΄μ§ μμ Classμ Methodλ₯Ό μ¬μ©νλ κ²½μ°
Upper Bounded WildCard
- List<? extends Foo> μ κ°μ ννλ‘ νΉμ ν΄λμ€μ μλΈ ν΄λμ€λ§ μΈμλ‘ λ°μ
- Foo ν΄λμ€μ μ μλ κΈ°λ₯λ§ μ¬μ©μ΄ κ°λ₯νλ€.
Lost Bounded WildCard
- List<? super Foo> μ κ°μ ννλ‘ νΉμ ν΄λμ€μ μμ ν΄λμ€λ§ μΈμλ‘ λ°μ
πΏ 맀κ°λ³μν νμ
(Parameterized Type)
- νλ μ΄μμ νμ
맀κ°λ³μλ₯Ό μ μΈνκ³ μλ Class λ Interfaceλ₯Ό μ λ€λ¦ ν΄λμ€ λλ μ λ€λ¦ μΈν°νμ΄μ€λΌκ³ νκ³ μ΄λ₯Ό μ λ€λ¦ νμ
μ΄λΌ νλ€. κ° μ λ€λ¦ νμ
μμλ 맀κ°λ³μν νμ
λ€μ μ μνλ€.
1
| List<String>list = new ArrayList<>();
|
- <>μμ Stringμ μ€ νμ
맀κ°λ³μλΌκ³ νκ³ List μΈν°νμ΄μ€μ μ μΈλμ΄μλ Listμ Eλ₯Ό νμ νμ
맀κ°λ³μλΌκ³ νλ€.
- μ λ€λ¦μ νμ
μκ±°μμ μν΄ μμ μ νμ
μμ μ 보λ₯Ό μμ νλ€.
- ArrayListλ₯Ό μμ±ν λ μ΄λ ν νμ
μ 보λ λ€κ³ μμ§ μκ² λλ€.
- μ¦ new ArrayList() μ κ°μ
- μ»΄νμΌλ¬λ μ»΄νμΌ λ¨κ³μμ List 컬λ μ
μ String μΈμ€ν΄μ€λ§ μ μ₯λμ΄μΌ νλ€λ κ²μ μκ²λμκ³ λ κ·Έκ²μ 보μ₯ν΄μ£ΌκΈ° λλ¬Έμ ArrayList listλ‘ λ³κ²½νμ¬λ λ°νμμ λμΌν λμμ 보μ₯
- νμ
μκ±°μμμν΄ μ»΄νμΌ νμμ νμ
μ λ³΄κ° μ¬λΌμ§λ κ²: λΉ κ΅¬μ²΄ν
- E, List μ κ°μ λ°νμμ ꡬ체ννμ§ μλ νμ
λ€μ λΉ κ΅¬μ²΄ν(non reifiable type)νμ
μ΄λΌκ³ νλ€.
- λ°λλ‘ primitive, non-generic types, raw types λλ List<?> Map κ³Ό κ°μ Unbounded WildCard Typeμ λ°νμμ ꡬ체ν νμ¬ κ΅¬μ²΄ν(reifiable type)μ΄λΌκ³ νλ€.
μ λ€λ¦ μ μμ μ¬μ©νλ νμ
μ λ²μλ μ§μ κ°λ₯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public class CarWildCardSample {
public static void main(String[] args) {
CarWildCardSample sample = new CardWukdcardSample();
sample.callBoundedWildcardMethod();
}
public void callBoundedWildcardMethod() {
WildcardGeneric<Car> wildcard = new WildcardGeneric<Car>();
boundedWildCardMethod(wildcard);
}
public void boundedWildCardMethod(WildCardGeneric<? extends Car> c) {
Car value = c.getWildCard();
}
}
|
1
2
3
| public class WildcardGeneric<W> {
W wildcard;
}
|
1
2
3
| public class Car {}
public class Bus extends Car {}
|
πΏ μ λ€λ¦ λ©μλ
1
2
| - μ κ·Όμ§μμ <νμ
νλΌλ―Έλ, ...> 리λνμ
λ©μλλͺ
(맀κ°λ³μ, ...) { ... }μ νμ
- public <T> Box<T> boxing(T t) { ... };
|
νΈμΆ
- Box box = boxing(100);
- λͺ
μμ μΌλ‘ ꡬ체μ νμ
μ§μ
- Box box = boxing(1000);
- 맀κ°κ°μ λ³΄κ³ κ΅¬μ²΄μ νμ
μ μΆμ
πΏ Erasure
μμ νμ
μ μ»΄νμΌ νμμμλ§ κ²μ¬νκ³ λ°νμμλ ν΄λΉ νμ
μ 보λ₯Ό μμκ° μλ€.
- μ¦ μ»΄νμΌ μνμλ§ μ μ½ μ‘°κ±΄μ μ μ©νκ³ λ°νμμλ νμ
μ λν μ 보λ₯Ό μκ±°
κ³Όμ
- μ λ€λ¦ νμ
μμλ ν΄λΉ νμ
νλΌλ―Έν°(T)λ Object(unbounded)λ‘ λ³κ²½
- νμ
μμ μ± λ³΄μ‘΄μ μν΄ νμμ type casting μ½μ
- νμ₯λ μ λ€λ¦ νμ
μμ λ€νμ± λ³΄μ‘΄νκΈ° μν΄ bridge method μμ±
μ ν
Class Type Erasure
ν΄λμ€ μμ€μμ μ»΄νμΌλ¬λ ν΄λμ€μ Type Parameterλ₯Ό λ²λ¦¬κ³ 첫λ²μ§Έ λ°μΈλ©μΌλ‘ λ체νκ±°λ Type Parameterκ° λ°μΈλ©(extends λ±μΌλ‘) λμ§ μμ κ²½μ° Objectλ‘ λ³ν
Method Type Erasure
method-level type erasureκ° λ°μΈλ©λμ§ μμ κ²½μ° λΆλͺ¨ νμ Objectλ‘ λ³νλκ±°λ λ°μΈλ© λ λ 첫λ²μ¨° λ°μΈλ© λ ν΄λμ€λ‘ λ³ν