[Java] Generic Type classμ λν΄
by rlaehddnd0422μ€νλ§μ λ€λ£¨λ€ 보면 Generics κΈ°λ₯μ μμ£Ό μ¬μ©νκ² λ©λλ€. μ΄ κΈ°λ₯μ μ¬μ©νλ©΄μ μ 맀νκ² μκ³ μλ κ²λ€μ μ§κ³ κ°κΈ° μν΄, λ¬Έλ²μ μΌλ‘ ν λ² μ μ§κ³ κ°λλ‘ νκ² μ΅λλ€. νΉν μλ£κ΅¬μ‘° κ°μ΄ μ§μ ꡬ쑰체λ₯Ό λ§λ€μ΄ μ¬μ©ν λ λ§€μ° μ μ©ν κΈ°λ₯μ΄λΌ μ¬μ©λ²μ λ°λμ μμλλ κ²μ΄ μ’μ΅λλ€.
Genericsλ?
Genericsλ "λ€μν νμ μ κ°μ²΄λ€μ λ€λ£¨λ λ©μλλ 컬λ μ ν΄λμ€μ μ»΄νμΌ μμ νμ Checkλ₯Ό ν΄μ£Όλ μλ°μ κΈ°λ₯"μ λλ€.
μ λ¬Έμ₯λ§ μ½μ΄λ΄€μ λ μ΄κ² λ¬΄μ¨ λ»μ΄λ ν μ μλλ° μ½κ² νμ΄μ μ€λͺ νλ©΄, λ¨μν λ€λ£° κ°μ²΄μ νμ μ 미리 λͺ μν΄μ€μΌλ‘μ¨ λ²κ±°λ‘μ΄ νλ³νμ μ€μ¬μ€λ€λ μλ―Έμ λλ€.
κ°λ¨νκ² μλ₯Ό λ€μ΄λ³΄κ² μ΅λλ€.
public class Generics_1 {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
}
}
ArrayListλ₯Ό 보면 Listμ <>μμλ Stringμ΄λΌκ³ μ μΈν΄μ£Όμμ΅λλ€.
μ΄λ κ² μ μΈν¨μΌλ‘μ¨ λ€λ£° κ°μ²΄μ νμ μ 미리 λͺ μν΄μ£Όμμ΄μ. μ¦, stringListμμ λ€μ΄κ°λ νμ μ λ³λμ νλ³ν μμ΄ λ΄κ° μ¬μ©νκ³ μΆμ λ°μ΄ν° νμ λ§ μ¬μ©ν μ μκ² ν΄μ£Όλ νΈμμ±μ΄ μμ΅λλ€. μ μ½λμμ stringListμ Stringλ§ μ¬μ©μ΄ κ°λ₯ν©λλ€.
Generics Type Class μ μΈ
Generics νμ μ ν΄λμ€μ λ©μλμ μ μΈν μ μμ΅λλ€.
λ¨Όμ ν΄λμ€μ μ μΈνλ Generics νμ μ λν΄ μμλ΄ μλ€.
public class Box {
Object item;
void setItem(Object Item) {
this.item = item;
}
Object getItem() {
return this.item;
}
}
ν΄λμ€ Boxκ° μμ΅λλ€.
μ΄ ν΄λμ€λ₯Ό Generics ν΄λμ€λ‘ λ°κΎΈκ³ μΆλ€λ©΄, μλ μ½λμ²λΌ λ¨μν ν΄λμ€ μμ <T>λ§ λΆμ¬μ£Όλ©΄λ©λλ€.
public class Box<T> {
T item;
void setItem(T Item) {
this.item = item;
}
T getItem() {
return this.item;
}
}
Box<T>μμ Tλ 'νμ λ³μ'λΌκ³ νλ©°, Typeμ 첫 κΈμμμ λ°μ¨ κ²μ λλ€.
νμ λ³μλ Tκ° μλ λ€λ₯Έ κ²μ μ¬μ©ν΄λ λ©λλ€.
ArrayList<E>μ κ²½μ° νμ λ³μ Eλ₯Ό Elementμ 첫 κΈμλ₯Ό λ°μ μ¬μ©νμ΅λλ€.
public class ArrayList<E> extends AbstractList<E>
** package java.util μ°Έκ³
μΌλ°μ μΌλ‘ νμ λ³μκ° μ¬λ¬ κ°μΈ κ²½μ°μλ Map<K,V>μ κ°μ΄ μ½€λ§λ₯Ό ꡬλΆμλ‘ λμ΄νλ©΄ λ©λλ€.
Mapμμ μ§λ€λ¦ νμ λ³μλ Kλ Key, Vλ Valueλ₯Ό μλ―Έν©λλ€. 무쑰건μ μΌλ‘ Tλ₯Ό μ¬μ©νκΈ° λ³΄λ€ μν©μ λ§κ² μλ―Έμλ λ¬Έμλ₯Ό μ νν΄μ μ¬μ©νλ©΄ λκ² μ΅λλ€. μΌλ°μ μΌλ‘ μλ νμ νμ λ€μ΄ λ§μ΄ μ°μ λλ€. ν κΈμκ° μλμ¬λ μκ΄μμ§λ§ ν΅μμ μΌλ‘ ν κΈμλ‘ μ¬μ©.
νμ | μ€λͺ |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
class Box<γ
> {
γ
item;
void setItem(γ
item) {
this.item = item;
}
γ
getItem() {
return this.item;
}
}
- μ΄μ²λΌ νκΈλ κ°λ₯νμ§λ§ μ νμ²λΌ μ¬λλ€μ΄ λ§μ΄ μ°λ νμ μΌλ‘ λͺ μνλλ‘ ν©μλ€. λ΄ μ½λλ λλ§ μ½λκ² μλλκΉ
Generics μ©μ΄
ν·κ°λ¦¬κΈ° μ¬μ΄ Generics μ©μ΄λ₯Ό λ¨Όμ μ 리νκ³ λμ΄κ°μλ€.
class Box<T>
- Box<T> : Generic ν΄λμ€. 'Tμ Box' λλ 'T Box' λΌκ³ μ½μ΄μ.
- Box : μμ νμ
- T : νμ λ³μ λλ νμ 맀κ°λ³μ. (Tλ νμ λ¬Έμ)
Generic Classμ κ°μ²΄ μμ±, μ¬μ©
Generics ν΄λμ€κ° λ Box ν΄λμ€μ κ°μ²΄λ₯Ό μμ±ν λλ μ°Έμ‘°λ³μμ μμ±μμ νμ T λμ μ¬μ©λ μ€μ νμ μ μ§μ ν΄μ£Όμ΄μΌ ν©λλ€.
Box<String> b = new Box<String>();
b.setItem("ABC");
System.out.println("b.getItem() = " + b.getItem());
Box<Long> longBox = new Box<Long>();
longBox.setItem(1L);
System.out.println("longBox.getItem() = " + longBox.getItem());
λ§μΌ Box ν΄λμ€μ Stringλ§ λ΄κ³ μΆλ€λ©΄, νμ λ³μλ₯Ό μ μΈνμ§ μκ³ μ§μ νμ μ μ μ΄μ£Όλ κ²λ κ°λ₯ν©λλ€. μλ₯Ό λ€μ΄ μ μ½λμ²λΌ String νμ μΌλ‘ νμ νμ¬ νμ λ³μλ₯Ό μμ±νλ©΄ Box<String> bμλ Stringλ§ μ¬μ©ν μ μμ΅λλ€.
λλ ν΄λμ€λ₯Ό μ μΈν λ μ΄λ κ² νμ μ 미리 μ ν΄λμ μμ± μ Box<String>μΌλ‘ μ ννλ λ°©λ²λ μμ΅λλ€.
class Box<String> {
String item;
void setItem(String item) {
this.item = item;
}
String getItem() {
return this.item;
}
}
- + λΉμ°ν μ΄μΌκΈ°κ² μ§λ§, static λ©€λ²λ μΈμ€ν΄μ€ λ³μλ₯Ό μ°Έμ‘°ν μ μκΈ° λλ¬Έμ static λ©€λ²μ νμ λ³μ Tλ₯Ό μ¬μ©ν μ μμ΅λλ€.
Generic ν΄λμ€μ κ°μ²΄λ₯Ό μμ±ν λλ λ°λμ μ§μΌμΌν λ£°μ΄ μμ΅λλ€.
λ°λμ μμ±μμ λμ λ νμ κ³Ό μ°Έμ‘°λ³μκ° μΌμΉν΄μΌ ν©λλ€.
Box<String> b = new Box<Long>(); // Error
Box<String> b = new Box<String>(); // OK
+ μ§λ€λ¦ ν΄λμ€μ νμ μ΄ μμκ΄κ³μ μμ λλ μ μΈ μ νμ λ³μλ μΌμΉμμΌ μ£Όμ΄μΌ ν¨.
class Box<T> {
T item;
void setItem(T item) {
this.item = item;
}
T getItem() {
return this.item;
}
}
class RedBox<T> extends Box {}
}
Box<String> b = new RedBox<String>();
+ JDK 1.7 λΆν°λ μΆμ μ΄ κ°λ₯ν κ²½μ° μμ±μμ λμ λ νμ μλ΅ν μ μμ΅λλ€.
Box<String> b = new Box<>();
Box<String> b = new Box<String>(); // λ λ¬Έμ₯μ΄ λμΌνκ² λμν©λλ€
+ μμκ΄κ³κ° μλ νμ λ³μλ₯Ό μ¬μ©ν λ λν, μ μΈ μ λ°λμ νμ λ³μλ₯Ό μΌμΉ μμΌμ£Όμ΄μΌ νμ§λ§, μ€μ μμ± μ΄ν μ¬μ©ν λμλ μμ νμ μ λ©μλκ° λ©μλμ 맀κ°λ³μκ° λ μ μμ΅λλ€.
Box<Fruit> fruitBox = new Box<Fruit>();
fruitBox.add(new Fruit());
frutBox.add(new Apple());
β‘οΈ "Apple extends FruitλΌκ³ κ°μ "
Generic Type μ ν
class Box <T extends Fruit> {
...
}
Generic Type ν΄λμ€ μ μΈμμ extends ν€μλλ‘ νΉμ νμ λ³μλ§ λ€μ΄μ€κ² νλλ‘ μ§μ ν μ μμ΅λλ€.
- μ caseμ κ²½μ°, κ°μ²΄ μμ± μ Fruitμ μμ νμ κ³Ό Fruitλ§ νμ λ³μλ‘ μ§μ κ°λ₯
- λ§μΌ ν΄λμ€κ° μλ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ€λ μ μ½μ΄ μλ€ν΄λ implementsλ₯Ό μ¬μ©νμ§ μκ³ extends ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ€λ μ μ μ£Όμν©μλ€.
- interface Eatable{}
- class FruitBox<T implements Eatable> ( X )
- class FruitBox<T extends Eatable> ( O )
- Fruitμ μμμ΄λ©΄μ Eatable μΈν°νμ΄μ€λ ꡬνν΄μΌ νλ€λ©΄ '&' κΈ°νΈλ‘ μ°κ²°ν©μλ€.
- class FruitBox<T extends Fruit & Eatable>
- μ΄μ FruitBoxμλ Fruitμ μμμ΄λ©΄μ, Eatableμ ꡬνν ν΄λμ€λ§ νμ 맀κ°λ³μ Tμ λ€μ΄μ¬ μ μμ΅λλ€.
Generic Type μμΌλ μΉ΄λ
μλ°λ Generic νμ μ λν΄ κ³΅λ³μ±/λ°κ³΅λ³μ±μ μ§μνμ§ μμ΅λλ€.
곡λ³μ±μ μλ‘ λ€λ₯Έ νμ μ΄ μμκ΄κ³μΌ λ, μμ νμ μΌλ‘ μΊμ€ν ν μ μλ μ±μ§μ λλ€.
λ°κ³΅λ³μ±μ μλ‘ λ€λ₯Έ νμ μ΄ μμκ΄κ³μΌ λ, λΆλͺ¨ νμ μΌλ‘ μΊμ€ν ν μ μλ μ±μ§μ λλ€.
μλ°λ κ°μ²΄μ λν΄μλ μλμ²λΌ 곡λ³μ±/λ°κ³΅λ³μ±μ μ§μνμ§λ§ μ λλ¦ νμ μ λν΄μλ μ§μνμ§ μμ΅λλ€.
κ°μ²΄ νμ μ μν κ΄κ³κ° μμ΅λλ€.
κ°μ²΄μ λ€νμ±(polymorphism)μ κ΄ν μ±μ§λ‘ κ°μ²΄λ Object νμ μΌλ‘ μ μΈν parent λ³μμ Integer νμ μΌλ‘ μ μΈν child λ³μκ° μλλ° κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ μ΄λ€ λΌλ¦¬ μλ‘ κ°μ μΊμ€ν μ΄ κ°λ₯ν©λλ€.
Object o = new Integer(); // λ€μ΄ μΊμ€ν
Integer i = new Object(); // μ
μΊμ€ν
μ λ€λ¦ νμ μ μνκ΄κ³κ° μμ΅λλ€.
κ°μ²΄μ λ¬λ¦¬ μ λ€λ¦μ νμ νλΌλ―Έν°(κΊΎμ κ΄νΈ) λΌλ¦¬λ νμ μ΄ μ무리 μμ κ΄κ³μ λμΈλ€ νλ€ μΊμ€ν μ΄ λΆκ°λ₯ν©λλ€.
μ λ€λ¦μ μ λ¬λ°μ λ± κ·Έ νμ μΌλ‘λ§ μλ‘ μΊμ€ν μ΄ κ°λ₯ν©λλ€.
ArrayList<Object> arrlist = new ArrayList<String>(); // 곡λ³μ± μ§μ X μ»΄νμΌ μλ¬
ArrayList<Integer> arrlist = new ArrayList<Object>(); // λ°κ³΅λ³μ± μ§μ X μ»΄νμΌ μλ¬
- μ λλ¦μ 곡λ³/λ°κ³΅λ³μ μ§μνμ§ μκΈ° λλ¬Έμ 무곡λ³μ μ±μ§μ μ§λλ€λΌκ³ λ³Ό μ μμ΅λλ€.
곡λ³μ±μ΄ μλ μ λλ¦ νμ μ κ°μ²΄μ§ν₯μ κΈ°λ₯μΈ λ€νμ±μ μ¬μ©ν μ μμ΅λλ€.
λ°λΌμ κ°μ κΈ°λ₯μ νλ λ©μλλ₯Ό λ§λ€κ³ μ ν λ, μ¬λ¬ νμ μ κ±Έμ³ μλμ κ°μ΄ μ€λ²λ‘λ© ν΄μ£Όμ΄μΌ ν κ² κ°μ§λ§, μ€λ²λ‘λ© λν λΆκ°λ₯ν©λλ€.
Why?
μλ°μμλ μ»΄νμΌ μμ μ μ§λ€λ¦ νμ μ μ κ±°ν΄λ²λ¦¬κΈ° λλ¬Έμ FruitBoxλΌλ μμνμ λ§ λ¨κ² λ©λλ€. λ°λΌμ μλ°λ μ»΄νμΌ μμ μ μ΄λ₯Ό μ€λ²λ‘λ©μΌλ‘ λ³΄μ§ μκ³ 'λ©μλ μ€λ³΅ μ μ'λ‘ λ³Ό μ λ°μ μμ΄ λ¬Έμ κ° μκΉλλ€.
public static void makeJuice(FruitBox<Fruit> box){
String tmp = "";
for(Fruit f : box.getList()){
System.out.println("Fruit = " + f);
}
}
public static void makeJuice(FruitBox<Apple> box){
for(Fruit f : box.getList()){
System.out.println("Apple = " + f);
}
}
β‘οΈ Appleμ Fruitμ μμνμ μ΄λΌκ³ κ°μ .
μ΄λ΄ λ μ¬μ©νκΈ° μν΄ κ³ μλ κ²μ΄ λ°λ‘ 'μμΌλ μΉ΄λ' μ λλ€.
<? extends T> : μμΌλ μΉ΄λμ μν μ ν, Tμ κ·Έ μμλ€λ§ κ°λ₯
<? super T> : μμΌλ μΉ΄λμ νν μ ν, Tμ κ·Έ μ‘°μλ€λ§ κ°λ₯
<?> : μ ν X, λͺ¨λ νμ μ΄ κ°λ₯. <? extends Object>μ λμΌ
** μμΌλ μΉ΄λλ κΈ°νΈ '?'λ‘ νννκ³ ?μλ μ΄λ ν νμ λ λ€μ΄μ¬ μ μμ΅λλ€.
μμΌλ μΉ΄λμλ '&'λ₯Ό μ¬μ©ν μ μμ΅λλ€.
μν κ²½κ³ <? extends T>
- νμ 맀κ°λ³μμ λ²μλ T ν΄λμ€μ΄κ±°λ , Tλ₯Ό μμν νμ ν΄λμ€, μ¦ Tμ Tμ μμλ§ κ°λ₯.
- μν : νμ μ μ΅κ³ νλκ° TλΌλ λ».
νν κ²½κ³ <? super T >
- μνκ³Ό λ°λλ‘ νμ 맀κ°λ³μμ λ²μκ° Tν΄λμ€ μ΄κ±°λ Tμ μ‘°μ νμ λ§ κ°λ₯.
- νν : νμ μ μ΅μ νλκ° TλΌλ λ».
λΉκ²½κ³ <?>
- νμ 맀κ°λ³μμ λ²μμ μ νμ΄ μμ΅λλ€. μ¦ μ΄λ νμ μ΄λ λͺ¨λ κ°λ₯!
- < ? extends Obejct > μ λμΌν νν : μνμ μ΄ Object.
μ΄μ μλμ²λΌ μμΌλ μΉ΄λλ₯Ό μ¬μ©νλ©΄ Fruitμ ν¬ν¨ν λͺ¨λ μμ νμ μ FruitBoxκ° λ©μλμ 맀κ°λ³μλ‘ λ£μ μ μκ² λμμ΅λλ€.
static Juice makeJuice(FruitBox<? extends Fruit> box){
String tmp = "";
for(Fruit f : box.getList()) tmp += f + " ";
return new Juice(tmp);
}
<μ°Έκ³ μλ£>
https://mangkyu.tistory.com/241
https://www.yes24.com/Product/Goods/24259565
'π Backend > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] κΈ°λ³Έμ μΈ λ¬Έλ²λ€ - μλ£ν, μμ, 리ν°λ΄μ λν΄ (0) | 2023.09.20 |
---|---|
[Java] Java μΈμ΄μ νΉμ§, μ₯μ μ λν΄ (0) | 2023.09.20 |
[Java] λλ€μ - 2. ν¨μν μΈν°νμ΄μ€μ λν΄ (0) | 2023.08.13 |
[Java] λλ€μ - 1. λλ€μ μμ±λ²μ λν΄ (0) | 2023.08.13 |
[JAVA] μμΈ(Exception)μ²λ¦¬μ λν΄ (0) | 2023.04.06 |
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422