13.3 μ λ€λ¦ λ©μλ
* μ λ€λ¦ λ©μλ : νμ
νλΌλ―Έν°λ₯Ό κ°μ§κ³ μλ λ©μλ
- νμ
νλΌλ―Έν°κ° λ©μλ μ μΈλΆμ μ μλ¨ (<- μ λ€λ¦ νμ
κ³Ό μ°¨μ΄!)
- κ°μ²΄ νμ
μ μκ΄μλ μ μ°ν λ©μλ μ μ κ°λ₯
- λ¦¬ν΄ νμ μμ <> κΈ°νΈλ₯Ό μΆκ°νκ³ νμ νλΌλ―Έν°λ₯Ό μ μν¨
- λ¦¬ν΄ νμ , λ§€κ°λ³μ νμ μμ μ¬μ©ν¨
| κ΅¬λΆ | μ λ€λ¦ νμ | μ λ€λ¦ λ©μλ |
| μ μ μμΉ | ν΄λμ€, μΈν°νμ΄μ€ μ μΈλΆμ <T> λ±μΌλ‘ λͺ μ | λ©μλ μ μΈλΆμ <T> λ±μΌλ‘ λͺ μ |
| μ μ© λ²μ | ν΄λΉ ν΄λμ€/μΈν°νμ΄μ€ λ΄μμ λ©€λ² λ³μ, λ©μλ λ± μ 체 | ν΄λΉ λ©μλ λ΄λΆμμλ§ μ¬μ©, λ©μλ μκ·Έλμ²μλ§ μν₯ |
| μμ | class Box<T> { T value; } | <T> void print(T item) {...} |
| μ¬μ¬μ©μ± | νλμ νμ μ μ¬λ¬ λ°μ΄ν° νμ μ μ μ©ν μ μμ | νλμ λ©μλμμ μ¬λ¬ λ°μ΄ν° νμ μ²λ¦¬ κ°λ₯ |
| μΈμ€ν΄μ€ μμ± | Box<Integer> intBox = new Box<>(); | print(123); print("hello"); λ± λ€μν νμ μ¬μ© κ°λ₯ |
| μ λ€λ¦ νμ μ¬μ© | μ°Έμ‘° λ³μμμ νμ μ§μ , νμ μΌκ΄μ± ν보 | λ§€ νΈμΆλ§λ€ νμ μΆλ‘ , μ μ°νκ² μ¬μ© κ°λ₯ |
- μ λ€λ¦ νμ
- ν΄λμ€λ μΈν°νμ΄μ€ μ 체μ κ±Έμ³ νμ νλΌλ―Έν°λ₯Ό μ¬μ©ν¨
- μμ: Box<T>λ BoxλΌλ ν΄λμ€μμ TλΌλ νμ μ λ΄λΆμ κ±Έμ³ κ³μ μ¬μ©ν¨
- μ£Όλ‘ μλ£κ΅¬μ‘° ν΄λμ€(ArrayList, HashMap λ±)μμ λ§μ΄ μ¬μ©λλ©°, μμ±ν λ νμ μ νλ² μ νλ©΄ ν΄λΉ μΈμ€ν΄μ€μμ λ΄λ΄ κ·Έ νμ λ§ μ¬μ©ν¨
- μ λ€λ¦ λ©μλ
- λ©μλ μ μΈμλ§ νμ νλΌλ―Έν°λ₯Ό μ¬μ©ν¨(λ©μλ μκ·Έλμ² μΌμͺ½μ <T> λ± λͺ μ).
- ν΄λμ€μ μ λ€λ¦ νμ κ³Ό λ³κ°λ‘, λ©μλλ§λ€ λ 립μ μΌλ‘ λ€μν νμ μ μ²λ¦¬ κ°λ₯
- μμμ²λΌ print(T item)μ νΈμΆν λλ§λ€ int, String λ± μ΄λ€ νμ μ΄λ μΈ μ μμ
// μ λ€λ¦ νμ
μμ
class Box<T> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}
// μ λ€λ¦ λ©μλ μμ
class Util {
public static <T> void print(T item) { System.out.println(item); }
}
- Box<Integer>, Box<String>μ²λΌ κ°κ° νμ λ³ μΈμ€ν΄μ€ μμ±.
- Util.print(100); Util.print("hi");μ²λΌ λ€μν νμ μ κ°μ λ©μλλ‘ μΆλ ₯ κ°λ₯.
- ν΅μ¬
- "νμ μ 체μ μ μ©" → μ λ€λ¦ νμ
- "λ©μλ μμμλ§ μ μ©" → μ λ€λ¦ λ©μλ
public <A, B, ...> 리ν΄νμ
λ©μλλͺ
(λ§€κ°λ³μ, ...) { ... }
//νμ
νλΌλ―Έν° μ μ
(μ) boxing() λ©μλμμ νμ
νλΌλ―Έν°λ‘ <T>λ₯Ό μ μνκ³ , λ§€κ°λ³μ νμ
κ³Ό λ¦¬ν΄ νμ
μμ Tλ₯Ό μ¬μ©
(λ¦¬ν΄ νμ
: Tλ₯Ό λ΄μ©λ¬Όλ‘ κ°λ Box κ°μ²΄)
public <T> Box<T> boxing(T t) { ... }
- public : μ κ·Ό μ μ΄μ
- <T> : μ λ€λ¦ νμ
νλΌλ―Έν°(νμ
λ³μ)μ μΈ <-- μ΄ λΆλΆμ΄ μμΌλ©΄ μ΄ λ©μλλ μ λ€λ¦ λ©μλμ
- μ΄ λ©μλκ° TλΌλ μμμ νμ μ μ¬μ©ν μ μλ€λ λ»
- λ©μλμ λ°ν νμ λ°λ‘ μμ μμΉν΄μΌ ν¨
- Box<T> : λ¦¬ν΄ νμ
- μ΄ λ©μλλ Box<T> κ°μ²΄λ₯Ό λ°ννλ€λ λ»
- Tκ° μ΄λ€ νμ μ΄ λλμ§λ λ©μλ νΈμΆ μμ κ²°μ λ¨
- boxing : λ©μλ μ΄λ¦
- (T t) : νλΌλ―Έν°(λ§€κ°λ³μ) μ μΈ
- μ΄ λ©μλλ νλμ νλΌλ―Έν° tλ₯Ό λ°λλ°, μ΄ tμ νμ μμ Tμ
- boxing(100) μ΄λ©΄ Tλ Integerλ‘ μλ μΆλ‘ λ¨
public <T> Box<T> boxing(T t) {
Box<T> box = new Box<>();
box.set(t);
return box;
}
- νλΌλ―Έν°λ‘ λ°μ tλ₯Ό λ΄κ³ μλ Box<T> κ°μ²΄λ₯Ό λ§λ€μ΄ λ°νν¨
Box<Integer> intBox = boxing(123);
Box<String> strBox = boxing("hello");
- <T> : "μ΄ ν¨μ μμμ μμλ‘ TλΌλ νμ μ μΈ μ μλ€"λ μ μΈ
- Box<T> boxing(T t) : "T νμ κ°μ λ°μμ, κ·Έ νμ μ λ΄λ Box κ°μ²΄λ₯Ό λ°ννλ€"
- tμ νμ μΆλ‘ : λ©μλ νΈμΆ μ, μ λ¬λ μΈμλ‘λΆν° → μ»΄νμΌ νμμ κ²°μ λ¨
- μ½λ μ€ν(λ°νμ) μ€μλ νμ μ κ΄λ ¨ν΄ μΆκ° μΆλ‘ μ΄ μΌμ΄λμ§ μκ³ , μ΄λ―Έ μ»΄νμΌλ¬κ° νμ ν νμ μΌλ‘ μ²λ¦¬ν¨
-> νΈμΆν λ μ΄λ€ κ°μ λκΈ°λλμ λ°λΌ μ»΄νμΌκ³Όμ μμ μλμΌλ‘ νμ μ΄ μ ν΄μ Έμ νμ μμ μ±μ ν보νκ² λ¨
(μ 2) μ λ€λ¦ λ©μλ μ μΈ, νΈμΆ
public class Box<T> {
//νλ
private T t;
//getter λ©μλ
public T get() {
return t;
}
//setter λ©μλ
public void set(T t) {
this.t = t;
}
}
public class GenericExample {
//μ λ€λ¦ λ©μλ
public static <T> Box<T> boxing (T t){ //νμ
νλΌλ―Έν° T μ μ
Box<T> box = new Box<T>();
box.set(t);
return box;
}
public static void main(String[] args) {
//μ λ€λ¦ λ©μλ νΈμΆ
Box<Integer> box1 = boxing(100); //Tλ₯Ό Integerλ‘ λ체
int intValue = box1.get();
System.out.println(intValue);
//μ λ€λ¦ λ©μλ νΈμΆ
Box<String> box2 = boxing("νκΈΈλ"); //Tλ₯Ό StringμΌλ‘ λ체
String strValue = box2.get();
System.out.println(strValue);
}
}
- λ€λ₯Έ μμλ€
(μ 3) swap - λ°°μ΄μ λ κ°μ νμ
μ μκ΄μμ΄ λΉκ΅ κ°λ₯
public static <T> void swap(T[] arr, int i, int j) {
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
(μ 4) λΉκ΅ - μ¬λ¬ νμ (T, V)μ κ°μ κ°λ People κ°μ²΄λΌλ¦¬ κ°μ΄ κ°μμ§ λΉκ΅ν λ, νμ μ μκ΄μμ΄ μ¬μ©
public static <T, V> boolean compare(People<T, V> p1, People<T, V> p2) {
boolean nameCompare = p1.getName().equals(p2.getName());
boolean ageCompare = p1.getAge().equals(p2.getAge());
return nameCompare && ageCompare;
}
13.4 μ νλ νμ νλΌλ―Έν°
* μ νλ νμ
νλΌλ―Έν° (bounded type parameter)
- νμ
νλΌλ―Έν°λ₯Ό λ체νλ ꡬ체μ μΈ νμ
μ μ νν νμκ° μλ κ²½μ°κ° μ‘΄μ¬
(μ: μ«μλ₯Ό μ°μ°νλ μ λ€λ¦ λ©μλλ λ체 νμ
μΌλ‘ Number λλ μμ ν΄λμ€λ‘ μ ν)
public <T extends μμνμ
> 리ν΄νμ
λ©μλ(λ§€κ°λ³μ, ... ) { ... }
- μμ μμνμ μ ν΄λμ€ λΏλ§ μλλΌ μΈν°νμ΄μ€λ κ°λ₯ (<- μΈν°νμ΄μ€λΌκ³ ν΄μ implementsλ₯Ό μ¬μ©νμ§ μμ)
(μ 1) Number νμ κ³Ό μμ ν΄λμ€μλ§ λ체 κ°λ₯ν νμ νλΌλ―Έν°λ₯Ό μ μνκΈ°
public <T extends Number> boolean compare(T t1, T t2) {
double v1 = t1.doubleValue(); //Numberμ doubleValue() λ©μλ μ¬μ©
double v2 = t2.doubleValue(); //Numberμ doubleValue() λ©μλ μ¬μ©
return (v1 == v2);
}
public static void main(String[] args) {
//μ λ€λ¦ λ©μλ νΈμΆ
boolean result1 = compare(10, 20); //<- Tλ₯Ό Integer νμ
μΌλ‘ λ체
System.out.println(result1);
}
- νμ νλΌλ―Έν°κ° Number νμ μΌλ‘ μ νλλ©΄μ Objectμ λ©μλλΏλ§ μλλΌ Numberκ° κ°μ§κ³ μλ λ©μλλ μ¬μ© κ°λ₯
13.5 μμΌλμΉ΄λ νμ νλΌλ―Έν°
- μ λ€λ¦ νμ
μ λ§€κ°κ°μ΄λ λ¦¬ν΄ νμ
μΌλ‘ μ¬μ©ν λ, νμ
νλΌλ―Έν°λ‘ ? (μμΌλμΉ΄λ)λ₯Ό μ¬μ© κ°λ₯
* ? μμΌλμΉ΄λ : λ²μμ μλ λͺ¨λ νμ
μΌλ‘ λ체 κ°λ₯νλ€λ νμ
1) νμ νλΌλ―Έν°μ λ체 νμ μΌλ‘ Studentμ μμ ν΄λμ€λ§ κ°λ₯νλλ‘ λ§€κ°λ³μ μ μΈνκΈ° => <? extends Student>
리ν΄νμ
λ©μλλͺ
(μ λ€λ¦νμ
<? extends Studnet> λ³μ) { ... }
2) νμ νλΌλ―Έν°μ λ체 νμ μΌλ‘ Workerκ³Ό λΆλͺ¨ ν΄λμ€λ§ κ°λ₯νλλ‘ λ§€κ°λ³μ μ μΈνκΈ° => <? super Worker>
리ν΄νμ
λ©μλλͺ
(μ λ€λ¦νμ
<? super Worker> λ³μ) { ... }
3) νμ νλΌλ―Έν°μ λ체 νμ μΌλ‘ μ΄λ€ νμ μ΄λ κ°λ₯νλλ‘ λ§€κ°λ³μ μ μΈνκΈ° => <?>
리ν΄νμ
λ©μλλͺ
(μ λ€λ¦νμ
<?> λ³μ) { ... }
(μ 1) λͺ¨λ μ¬λ / νμ / μΌλ°μΈ μ λ°λΌ μ ννκΈ°
public class Applicant<T> {
public T kind;
public Applicant(T kind) {
this.kind = kind;
}
}
public class Course {
//λͺ¨λ μ¬λμ΄ λ±λ‘ κ°λ₯
public static void registerCourse1(Applicant<?> applicant) {
System.out.println(applicant.kind.getClass().getSimpleName() + "1 λ±λ‘");
}
//νμλ§ λ±λ‘ κ°λ₯
public static void registerCourse2(Applicant<? extends Student> applicant) {
System.out.println(applicant.kind.getClass().getSimpleName() + "2 λ±λ‘");
}
//μΌλ°μΈλ§ λ±λ‘ κ°λ₯
public static void registerCourse3(Applicant<? super Worker> applicant) {
System.out.println(applicant.kind.getClass().getSimpleName() + "3 λ±λ‘");
}
}
public class GenericExample {
public static void main(String[] args) {
//λͺ¨λ μ¬λμ΄ μ μ² κ°λ₯
Course.registerCourse1(new Applicant<Person>(new Person()));
//νμλ§ μ μ² κ°λ₯
Course.registerCourse2(new Applicant<Student>(new Student()));
//μΌλ°μΈλ§ μ μ² κ°λ₯
Course.registerCourse3(new Applicant<Worker>(new Worker()));
}
}
'μΈμ΄ > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Java] 13. μ λ€λ¦ (1) - 1, 2 (0) | 2025.07.30 |
|---|---|
| [Java] 12. java.base λͺ¨λ (6) - 11, 12 (3) | 2025.07.25 |
| [Java] 12. java.base λͺ¨λ (5) - 9, 10 (1) | 2025.07.25 |
| [Java] 12. java.base λͺ¨λ (4) - 7, 8 (0) | 2025.07.24 |
| [Java] 12. java.base λͺ¨λ (3) - 4~6 (2) | 2025.07.22 |