Coding Planet
μ§λ€λ¦μ€(Generics) ν΅μ¬ μ 리νκΈ° - μ§λ€λ¦ ν΄λμ€ λ³Έλ¬Έ
μ§λ€λ¦μ€(Generics) ν΅μ¬ μ 리νκΈ° - μ§λ€λ¦ ν΄λμ€
jhj.sharon 2024. 3. 5. 16:46
μλ° μ λ¬Έ λ 벨μμ κ°λ°μ λ¬Έμλ₯Ό 보거λ githubμ λ€λ₯Έ μ½λλ€μ λ³΄λ€ λ³΄λ©΄ Box<T>μ κ°μ λ―μ ννμ λ¬Έμ₯μ λ§λκ² λλ€. μ΄λ¬ν κ²λ€μ΄ μ§λ€λ¦μ€μΈλ° λ¨κΆμ± μ μμ μλ°μ μ μμ μ°Έκ³ νμ¬ μ λ¬Έμμ€μμ κ°λ¨νκ² μ΄ν΄λ³΄κ³ μ νλ€.
μ΄λ ΅λ€λ©΄ κ°μ‘°λ λ΄μ©λ§ λ΄λ λμΆ© κ°μ μ‘μ μ μλ€.
| μ§λ€λ¦μ€λ?
μ§λ€λ¦μ€λ λ€μν νμ μ κ°μ²΄λ€μ λ€λ£¨λ λ©μλλ 컬λ μ ν΄λμ€μ μ»΄νμΌ μ μ νμ 체ν¬(compile-time type check)λ₯Ό ν΄μ£Όλ κΈ°λ₯μ΄λ€. κ°μ²΄μ νμ μ μ»΄νμΌ μμ 체ν¬νκΈ° λλ¬Έμ κ°μ²΄μ νμ μμ μ±μ λμ΄κ³ νλ³νμ λ²κ±°λ‘μμ΄ μ€μ΄λ λ€.
-μλ°μ μ μ
1. μ»΄νμΌ μ μ νμ 체ν¬(compile-time type check)
μ§λ€λ¦μ€λ₯Ό μ¬μ©νλ©΄, 컬λ μ μ μ μ₯λλ κ°μ²΄μ νμ μ μ»΄νμΌ μμ μ 체ν¬νλ€. μ΄λ μλͺ»λ νμ μ κ°μ²΄κ° μΆκ°λλ κ²μ λ°©μ§νμ¬ μ€νμκ°(runtime)μ 'ClassCastException'μ μλ°©νλ€.
μλ₯Ό λ€μ΄, List<String>μ λ¬Έμμ΄λ§μ μμλ‘ κ°μ§ μ μμΌλ©°, μ»΄νμΌλ¬λ μ΄ λ¦¬μ€νΈμ λ¬Έμμ΄μ΄ μλ λ€λ₯Έ νμ μ κ°μ²΄κ° μΆκ°λλ €κ³ ν λ μ»΄νμΌ μ€λ₯λ₯Ό λ°μμν¨λ€.
2. κ°μ²΄ νμ μ μμ μ±(Type Safety)
μ§λ€λ¦μ€λ₯Ό μ¬μ©ν¨μΌλ‘μ¨, 컬λ μ μμμ κ°μ²΄λ₯Ό μ½μ΄μ¬ λ λͺ μμ μΈ νλ³νμ΄ νμ μκ² λλ€. μ»΄νμΌλ¬κ° μ΄λ―Έ μμμ νμ μ μκ³ μκΈ° λλ¬Έμ, μ¬λ°λ₯Έ νμ μ κ°μ²΄λ§μ΄ μ²λ¦¬λ κ²μμ 보μ₯νκΈ° λλ¬Έμ΄λ€. μ΄λ νλ‘κ·Ήλ¨μ μμ μ±μ μ¬λ €μ€λ€.
3. νλ³νμ λ²κ±°λ‘μ κ°μ
μ§λ€λ¦μ€λ₯Ό μ¬μ©νμ§ μλ κ²½μ°, 컬λ μ μμ κ°μ²΄λ₯Ό κΊΌλΌ λλ§λ€ ν΄λΉ κ°μ²΄λ₯Ό μ μ ν νμ μΌλ‘ νλ³νν΄μΌνλ€. μ΄λ μ½λλ₯Ό λ²κ±°λ‘κ² λ§λ€ λΏλ§ μλλΌ, μλͺ»λ νμ μΌλ‘μ νλ³ν κ°λ₯μ±μ λ΄ν¬νκ³ μμ΄ μ€λ₯μ κ°λ₯μ±μ λμΈλ€. μ§λ€λ¦μ€λ₯Ό μ¬μ©νλ©΄ μ΄λ¬ν νλ³νμ΄ λΆνμν΄μ§λ―λ‘, μ½λκ° λ κ°κ²°νκ³ μμ ν΄μ§λ€.
// μ§λ€λ¦μ€ μμ΄ μ»¬λ μ
μ μ¬μ©ν λ
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // λͺ
μμ νλ³ν νμ
//μ§λ€λ¦μ€λ₯Ό μ¬μ©ν λ
List<String> list = new ArrayList<>();
list.add("hello");
String str = list.get(0); // νλ³ν λΆνμ
βΆ κ°λ¨ν λ§νμλ©΄ λ€λ£° κ°μ²΄μ νμ μ 미리 λͺ μν΄μ€μΌλ‘μ¨ λ²κ±°λ‘μ΄ νλ³νμ μ€μ¬μ€λ€λ μλ―Έμ΄λ€.
| μ§λ€λ¦ ν΄λμ€ μ μΈνκ³ μ¬μ©νκΈ°
μ§λ€λ¦ νμ μ ν΄λμ€μ λ©μλμ μ μΈν μ μλ€. μ΄λ² ν¬μ€νΈμμλ ν΄λμ€ μμ£Όλ‘ μμλ³΄λ €κ³ νλ€.
μ§λ€λ¦μ€λ₯Ό μ¬μ©νμ¬ Box ν΄λμ€λ₯Ό λ³κ²½νλ μμ΄λ€. Box ν΄λμ€κ° λ€μν νμ μ κ°μ²΄λ₯Ό μ μ₯ν μ μλλ‘ ν΄λμ€ μμ <T>λ₯Ό λΆμ΄λ©΄λλ€. <T>λ νλΌλ―Έν° νμ μ λνλ΄λ©° Box ν΄λμ€λ₯Ό μ¬μ©ν λ ꡬ체μ μΈ νμ μΌλ‘ λ체λλ€. (ex. Box<String>, Box<Integer>). μ΄λ κ² νλ©΄ Box ν΄λμ€λ λ€μν νμ μ κ°μ²΄λ₯Ό μ μ₯ν μ μκ² λλ€.
- <T> : νμ λ³μ(type variable). μμμ μ°Έμ‘°ν νμ μ μλ―Ένλ€. Tλ§κ³ λ λ€λ₯Έ κ²μ μ¬μ©ν΄λ λλ€(ex. ArrayList<E>, Map<K,V>)
//μΌλ° ν΄λμ€
public class Box {
Object item;
void setItem(Object item){ this.item = item;}
Object getItem(){return item;}
}
//μ§λ€λ¦μ€ ν΄λμ€λ‘ λ³ν
public class Box<T> {
private T item;
public void setItem(T item){this.item = item; }
public T getItem(){ return item;}
}
μ§λ€λ¦ ν΄λμ€λ₯Ό μ¬μ©ν λλ λ€μκ³Ό κ°μ΄ μ°Έμ‘°λ³μμ μμ±μ νμ Tλμ μ¬μ©λ μ€μ νμ μ μ§μ ν΄μ€μΌ νλ€.
μ€μ IDEμμ μ§μ λ νμ μ΄μΈμ νμ μ μ¬μ©ν κ²½μ° μλ¬κ° λ°μνλ€.
public class Box<T> {
private T item;
public void setItem(T item){
this.item = item;
}
public T getItem(){
return item;
}
public static void main(String[] args) {
Box<String> b = new Box<String>();
b.setItem(new Object()); // μλ¬. String νμ
μΈ μ§μ λΆκ°
b.setItem("Planet"); // O. String μ§μ κ°λ₯
String item = b.getItem(); // νλ³ν λΆνμ
}
}
| μ§λ€λ¦ μ£Όμ μ©μ΄ μ 리
- Box<T> : μ§λ€λ¦ ν΄λμ€. 'Tμ Box' λλ 'T Box'λΌκ³ μ½λλ€.
- T : νμ λ³μ νΉμ νμ 맀κ°λ³μ(Tλ νμ λ¬Έμ).
- Box : μμνμ
- λμ λ νμ : μ§λ€λ¦ ν΄λμ€μ μ§μ λ νμ .
- μ§λ€λ¦ νμ νΈμΆ : 맀κ°λ³μμ νμ μ μ§μ νλ κ².
| μ§λ€λ¦μ€ μ¬μ©μ μ ν
1. static λ©€λ²μλ νμ λ³μ Tλ₯Ό μ μΈν μ μλ€.
static λ©€λ²λ λͺ¨λ κ°μ²΄μ λν΄ λμΌνκ² λμν΄μΌνλ―λ‘ static λ©€λ²μ νμ λ³μ Tλ₯Ό μ¬μ©ν μ μλ€. Tλ μΈμ€ν΄μ€λ³μλ‘ κ°μ£ΌλκΈ° λλ¬Έμ΄λ€. static λ©€λ²λ λμ λ νμ μ μ’ λ₯μ κ΄κ³μμ΄ λμΌνμ¬μΌ νλ€.
2. μ§λ€λ¦ νμ μ λ°°μ΄μ μμ±ν μ μλ€.
μ§λ€λ¦ λ°°μ΄ νμ μ μ°Έμ‘°λ³μλ₯Ό μ μΈνλ κ²μ κ°λ₯νμ§λ§ 'new T[10]'κ³Ό κ°μ΄ λ°°μ΄μ μμ±νλ κ²μ μλλ€.
μ§λ€λ¦ λ°°μ΄μ μμ±ν μ μλ κ²μ new μ°μ°μμ΄λ€. μ΄ μ°μ°μλ μ»΄νμΌ μμ μ νμ Tκ° λ¬΄μμΈμ§ μ ννκ² μμμΌνλ€. κ·Έλ¬λ μλ μ½λμμ Tμ μ€μ νμ μ μ»΄νμΌ μμ μ μ μ μλ€.
public class GenericArray<T> {
private T[] array; // κ°λ₯
public GenericArray(int size) {
array = new T[size]; // μ»΄νμΌ μλ¬: Generic array creation
}
}
| μ§λ€λ¦ ν΄λμ€μ κ°μ²΄ μμ±κ³Ό μ¬μ©
μλ μ½λλ μ§λ€λ¦ ν΄λμ€μ κ°μ²΄ μμ±κ³Ό μ¬μ©μ 보μ¬μ£Όλ μμμ΄λ€. μλ μ½λμμ μ£Όμ κΉκ² λ΄μΌ ν λ΄μ©μ λ€μκ³Ό κ°λ€
- JDK 1.7λΆν°λ μΆμ μ΄ κ°λ₯ν κ²½μ° νμ μ μλ΅ν μ μκ² λμλ€. μ°Έμ‘°λ³μμ νμ λ§μΌλ‘λΆν° Boxμ λμ λ νμ μ μ μ μμΌλ―λ‘ new μ°μ°μ λ€μμ μ§λ€λ¦ νμ νΈμΆμμλ Tλ₯Ό μλ΅κ°λ₯νλ€.
- λ€νμ±μ μμΉμ λ°λΌ Javaμμ νμ ν΄λμ€μ μΈμ€ν΄μ€λ μμ ν΄λμ€ νμ μ μ°Έμ‘°λ³μλ‘ μ°Έμ‘°ν μ μλ€. λ°λΌμ Fruitμ μμν Appleμ Fruitμ μ°Έμ‘°λ³μλ‘ μ¬μ©ν μ μλ κ²μ΄λ€. ( fruitBox.add(new Apple()); )
- κ·Έλ¬λ Fruitμ Appleμ μμ νμ μ΄λ―λ‘ νμ νμ μ μ°Έμ‘°λ³μλ‘ μ¬μ©ν γΉμ μλ€. ( appleBox.add(new Fruit()); )
package generics;
import java.util.ArrayList;
// κΈ°λ³Έ ν΄λμ€ μ μ
class Fruit { public String toString(){return "Fruit";}}
class Apple extends Fruit { public String toString(){return "Apple";}}
class Grape extends Fruit { public String toString(){return "Grape";}}
class Toy { public String toString(){return "Toy";}}
// μ λ€λ¦ Box ν΄λμ€ μ¬μ© μμ
public class FruitBox1 {
public static void main(String[] args) {
// Fruitμ κ·Έ νμ νμ
μ μ μ₯ν μ μλ Box μμ±
Box<Fruit> fruitBox = new Box<>();
// Apple νμ
λ§ μ μ₯ν μ μλ Box μμ±
Box<Apple> appleBox = new Box<>();
// Toy νμ
μ μ μ₯ν μ μλ Box μμ±
Box<Toy> toyBox = new Box<>();
// Box<Grape> grapeBox = new Box<Apple>(); // μ»΄νμΌ μλ¬, μ λ€λ¦ νμ
λΆμΌμΉ
// Fruit κ°μ²΄ λ° Fruitμ νμ νμ
κ°μ²΄λ₯Ό FruitBoxμ μΆκ°
fruitBox.add(new Fruit()); // Fruit μΈμ€ν΄μ€ μΆκ°
fruitBox.add(new Apple()); // Apple μΈμ€ν΄μ€ μΆκ°, Appleμ Fruitμ νμ νμ
// AppleBoxμ Apple μΈμ€ν΄μ€ μΆκ°
appleBox.add(new Apple());
// appleBox.add(new Fruit()); // μ»΄νμΌ μλ¬, Fruitμ Appleμ μμ νμ
μ΄λ―λ‘ μΆκ° λΆκ°
// appleBox.add(new Toy()); // μ»΄νμΌ μλ¬, Toyλ Fruit κ³μΈ΅κ΅¬μ‘°μ 무κ΄
// Box λ΄μ© μΆλ ₯
System.out.println(fruitBox); // Fruitμ Apple μΈμ€ν΄μ€κ° ν¬ν¨λ 리μ€νΈ μΆλ ₯
System.out.println(appleBox); // Apple μΈμ€ν΄μ€λ§ ν¬ν¨λ 리μ€νΈ μΆλ ₯
}
}
// μ λ€λ¦ Box ν΄λμ€ μ μ
class Box<T> {
ArrayList<T> list = new ArrayList<T>(); // T νμ
μ κ°μ²΄λ₯Ό μ μ₯ν 리μ€νΈ
void add(T item){ list.add(item);} // T νμ
μ κ°μ²΄λ₯Ό 리μ€νΈμ μΆκ°
T get(int i){ return list.get(i);} // 리μ€νΈμμ T νμ
μ κ°μ²΄λ₯Ό λ°ν
ArrayList<T> getList() {return list;} // 리μ€νΈ λ°ν
int size() { return list.size();} // 리μ€νΈμ ν¬κΈ° λ°ν
public String toString(){ return list.toString();} // 리μ€νΈμ λ¬Έμμ΄ νν λ°ν
}
| μ νλ μ§λ€λ¦ ν΄λμ€
νμ 맀κ°λ³μ Tμ μ§μ ν μ μλ νμ μ μ’ λ₯λ₯Ό μ νν μ μλ€. μλ₯Όλ€μ΄ fruitBox<T>λΌλ κ³ΌμΌ λ°μ€ ν΄λμ€μ μ€μ§ κ³ΌμΌλ§ λ΄λλ‘ ν μ μλ€(μ ν μμ΄λ μ₯λκ°λ λ΄μ μ μλ€. fruitBox<Toy>).
- λ€μ μ½λμμ λ³Ό μ μλ― μ§λ€λ¦ νμ μ 'extends'λ₯Ό μ¬μ©νλ©΄ νΉμ νμ μ μμλ€λ§ λμ ν μ μκ² μ νν μ μλ€.
- ν΄λμ€κ° μλλΌ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ ν λλ implementsκ° μλ extendsλ₯Ό μ¬μ©νλ€.
- ν΄λμ€λ₯Ό μμνλ©΄μ λμμ μΈν°νμ΄μ€λ ꡬνν΄μΌνλ€λ©΄ '&' κΈ°νΈλ₯Ό μ΄λ€.
class FruitBox<T extends Fruit & Eatable> extends Box<T> {}
import java.util.ArrayList;
class Fruit implements Eatable {
public String toString() { return "Fruit";}
}
class Apple extends Fruit { public String toString() { return "Apple";}}
class Grape extends Fruit { public String toString() { return "Grape";}}
class Toy { public String toString() { return "Toy" ;}}
interface Eatable {}
class FruitBoxEx2 {
public static void main(String[] args) {
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
FruitBox<Grape> grapeBox = new FruitBox<Grape>();
// FruitBox<Grape> grapeBox = new FruitBox<Apple>(); // μλ¬. νμ
λΆμΌμΉ
// FruitBox<Toy> toyBox = new FruitBox<Toy>(); // μλ¬.
fruitBox.add(new Fruit());
fruitBox.add(new Apple());
fruitBox.add(new Grape());
appleBox.add(new Apple());
// appleBox.add(new Grape()); // μλ¬. Grapeλ Appleμ μμμ΄ μλ
grapeBox.add(new Grape());
System.out.println("fruitBox-"+fruitBox);
System.out.println("appleBox-"+appleBox);
System.out.println("grapeBox-"+grapeBox);
} // main
}
class FruitBox<T extends Fruit & Eatable> extends Box<T> {}
class Box<T> {
ArrayList<T> list = new ArrayList<T>();
void add(T item) { list.add(item); }
T get(int i) { return list.get(i); }
int size() { return list.size(); }
public String toString() { return list.toString();}
}
'π» Java Study > Java μ΄λ‘ μ 리' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
CSV μμ±μ νΉμλ¬Έμ Escape μ²λ¦¬νλ λ©μλ (0) | 2024.05.20 |
---|---|
μλΈλ¦Ώμμ ν΄λΌμ΄μΈνΈ μΈ‘μ JavaScript Alert μ°½ νμνκΈ° : PrintWriter (0) | 2024.05.13 |
λλ€μ - λ©μλ μ°Έμ‘°(μμ±μμ λ©μλ μ°Έμ‘° μμ ν¬ν¨) (0) | 2024.03.04 |
λλ€μ(Lamda expression) μ΄μ 리μ νμ©μμ (0) | 2024.03.04 |
[Java] λ©μλμ ν¨μμ μ°¨μ΄λ? (0) | 2024.03.04 |