2024λ μλ°κΈ° λ©΄μ μμ¦μ΄ λλκ³ λ€μ 곡λΆλ₯Ό μμνλ€π₯² κ°μ₯ μ΅κ·Όμ λ³Έ λ©΄μ μμ μ λ€λ¦μ λν΄ κ°λ¨νκ² μ€λͺ νλΌλ μ§λ¬Έμ λ°μκ³ , μ΄μ λλ 'κ°νμ μΈμ΄μΈ μλ°μ κ°μ©μ±μ λλ €μ€ μ μλ κΈ°μ λ‘ λ²μ© ν΄λμ€μ λ©μλλ₯Ό λ§λ€ μ μκ² ν΄μ€λ€' λΌκ³ λ΅νλ€. λ°μͺ½μ§λ¦¬ λ΅λ³μ΄μκ³ μ΄ λ λ΄κ° μκ°μ μΌλ‘ λ μ¬λ¦° κ²μ μ λ€λ¦μ μμΌλμΉ΄λ, μ¦ `?` ν€μλμλ€. λ§μ½ μ΄μ λν΄μ 꼬리μ§λ¬Έμ΄ λ€μ΄μλ€λ©΄ λλ μ€μ€μ΄ νλ¦° λ΅λ³μ νμ κ²μ΄κ³ μ λ€λ¦μ λν΄μ μμΈνκ² λͺ¨λ₯Έλ€λ μκ°μ΄ λ€μλ€. κ·Έλμ μ€λμ μ λ€λ¦μ λν΄μ 곡λΆν λ΄μ©μ μ 리ν΄λ³΄κ³ μ νλ€.
βοΈ μ λ€λ¦
μ λ€λ¦μ μΊμ€ν μΌλ‘ μΈν΄ λ°μνλ μ€λ²ν€λλ₯Ό μ€μ΄κ³ κ°μ©μ±μ λ리기 μν΄ κ°λ°ν λ¬Έλ²μΌλ‘ ν΄λμ€ λ΄λΆμμ μ¬μ©ν νμ μ μΈλΆμμ μ§μ νλ κ²μ μλ―Ένλ€.
μ λ€λ¦μ `<>` λ€μ΄μλͺ¬λ μ°μ°μ μ체λ₯Ό μλ―Ένλ©° `<>` λ΄λΆμ λ€μ΄κ°λ `T`, `U`, `?`, `Reference Type` λ±μ μ λ€λ¦μ νμ λ§€κ°λ³μλΌκ³ λΆλ₯Έλ€.
βοΈ μ λ€λ¦ λ©μλ
μ λ€λ¦ λ©μλλ λ©μλ μ μΈλΆμ μ§μ μ λ€λ¦ `<T>`λ₯Ό μ μΈν λ©μλλ₯Ό λ§νλ€. ν΄λμ€ νμ λ§€κ°λ³μλ₯Ό μ¬μ©ν λ©μλμ νΌλν κ°λ₯μ±μ΄ λκΈ° λλ¬Έμ μ£Όμν΄μΌνλ€.
μλ μ½λμ κ°μ μ λ€λ¦ λ©μλλ₯Ό λ³΄κ³ μκΈΈ μ μλ μλ¬Έμ μ 'κ°μ νμ νλΌλ―Έν° κΈ°νΈλ₯Ό μ¬μ©νλλ° μ΄λ»κ² λ³κ°μ μ λ€λ¦μΌλ‘ μ¬μ©λλκ°' μ΄λ€.
class Test<T>{
public T JustMethod(T n){}
public <T> void GenericMethod(T n){}
}
μ¬μ€ μ λ€λ¦ λ©μλλ ν΄λμ€ μΈμ€ν΄μ€κ° μ μΈλ κ²½μ° ν΄λμ€μ νμ λ§€κ°λ³μμ κ°μ νμ μ μ¬μ©νμ¬ μμ±λλ€. νμ§λ§ μλμ κ°μ΄ μ λ€λ¦ ν΄λμ€κ° μ μΈλ ν μ λ€λ¦ λ©μλ νμ νλΌλ―Έν°μ νμ μ λ³λλ‘ μ§μ ν΄μ€ κ²½μ°, λ 립μ μΈ νμ μ κ°μ§ μ λ€λ¦ λ©μλλ‘μ μ΄μ©λ μ μλ κ²μ΄λ€.
class Test<T, U> {
public <T, U> void running(T x, U y) {}
}
public static void main(String[] args) {
Test<Integer, Long> test = new Test<>();
test.running(1, 1); // <Integer, Long>
test.<String, Double>running("Yeop", 30.0);
}
βοΈ μ λ€λ¦μ νΉμ§
1οΈβ£ static κ°μ²΄
static λ©μλμλ ν΄λμ€μμ μ μΈν μ λ€λ¦ μ¬μ©μ΄ λΆκ°λ₯νλ€. μ΄λ ν΄λμ€ μΈμ€ν΄μ€μ μλͺ μ£ΌκΈ°κ° λ€λ₯΄κΈ° λλ¬ΈμΌλ‘ static λ©μλμμ μ λ€λ¦μ μ¬μ©νκΈ° μν΄μλ static λ©μλλ₯Ό static μ λ€λ¦ λ©μλλ‘ μμ±ν΄μΌνλ€.
class Test<T>{
static T impossible(int n){} // λΆκ°λ₯
static <T> void possible(T[] array){} // κ°λ₯
}
2οΈβ£ 볡μ νμ , μ€μ²© νμ μ μΈ κ°λ₯
Class Test<T, U>{} // 볡μ μ μΈ
LinkedList<ArrayList<Integer>> list = new LinkedList<ArrayList<Integer>>(); // μ€μ²© μ μΈ
βοΈ μ λ€λ¦ νμ λ²μ
μ λ€λ¦μ λ²μ©μ±κ³Ό κ°μ©μ±μ ν¬κ² μ¦κ°μμΌμ£Όμ§λ§ λ무 μμ λ‘λ€λ λ¨μ κ³Ό 곡λ³μ±μ΄ λΆλΆμ μΌλ‘ μ μ©λλ€λ λ¬Έμ μ μ΄ μ‘΄μ¬νλ€. μ΄λ₯Ό 보μνκΈ° μν κ²μ΄ κ°κ°`extends, super` ν€μλμ μμΌλμΉ΄λμ΄λ€.
`extends`μ `super` ν€μλκ° μμΌλ μΉ΄λμ ν¨κ» μ¬μ©λ κ²½μ°μλ νΌλλλ κ°λ μ ν¬ν¨νκ³ μκΈ° λλ¬Έμ λ¨Όμ μΌλ°μ μΈ νμ λ§€κ°λ³μμ ν¨κ» μ¬μ©λλ κ²½μ°μ λν΄ κ°λ¨ν λ€λ£¬ ν μμΌλ μΉ΄λμ μν κ²½κ³μ νν κ²½κ³μ λν΄ μ€λͺ νκ³ μ νλ€.
1οΈβ£ μ λ€λ¦μ μνκ²½κ³
'extends' ν€μλλ μμ νμ μ μ ννμ¬ μ§μ νμ κ³Ό κ·Έ νμ νμ λ€λ§ λ°λλ‘ νλ κ²μ΄λ€. μ λ€λ¦μ extends ν€μλ λ€μλ μΌλ° ν΄λμ€, μΆμ ν΄λμ€, μΈν°νμ΄μ€ λͺ¨λ μ¬ μ μμΌλ©° λ€μκ³Ό κ°μ΄ `&` ν€μλλ₯Ό μ¬μ©νμ¬ λ€μ€ μ νμ΄ κ°λ₯νλ€.
interface peach {}
interface apple {}
class FruitType implements Peach, Apple {}
class Fruit<T extends Peach & Apple> {}
λν μ¬κ·μ νμ νμ μ΄ κ°λ₯νλ°, μ¬κ·μ νμ νμ μ΄λ μκΈ° μμ μ΄ λ€μ΄κ° λ©μλλ₯Ό μ¬μ©νμ¬ νμ λ§€κ°λ³μλ₯Ό νμ λ²μλ₯Ό μ ννλ κ²μ λ§νλ€. μ€λ¬΄μμλ μ£Όλ‘ Comparable μΈμ€ν΄μ€μ ν¨κ» μ¬μ©λλ€. `<E extends Comparable<E>>`
2οΈβ£ μ λ€λ¦μ ννκ²½κ³
'super' ν€μλλ μ§μ νμ κ³Ό κ·Έ μμ νμ λ€λ§ λ°λλ‘ μ ννλ€. `super` ν€μλλ μμΌλμΉ΄λκ° μλ νμ λ§€κ°λ³μμ ν¨κ» λ€μκ³Ό κ°μ΄ μ¬μ©νλ€λ©΄ `<T super U>` Objectμ μ μ¬ν μν μ νκ² λκΈ° λλ¬Έμ μΌλ°μ μΌλ‘ μ μ¬μ©λμ§ μλλ€.
3οΈβ£ μμΌλ μΉ΄λ
μ λ€λ¦μ μμΌλ μΉ΄λλ `?` ν€μλλ‘ μ μΈνλ©° μΌλ°μ μΈ νμ μ μΈμμμ Objectμ κ°μ μν μ νλ€. κ° κ°μ²΄ κ°μλ 곡λ³μ±μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ κ°μ₯ μμ κ°μ²΄μΈ Objectλ₯Ό μ μΈνλ€λ©΄ μΊμ€ν μ ν΅ν΄ μ μ°νκ² νμ μ μ μ©ν μ μλ€. νμ§λ§ μ λ€λ¦μ 무곡λ³μ μ±μ§μ λκΈ° λλ¬Έμ νμ μ λ¬λ°μ νλμ νμ μΌλ‘λ§ μ¬μ©ν μ μκΈ° λλ¬Έμ κ°μ²΄ μ§ν₯μ μ₯μ μ μ ν μ΄μ©νμ§ λͺ»νλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μμΌλ μΉ΄λκ° νμν κ²μ΄λ€.
μλμ κ°μ΄ μμΌλ μΉ΄λμ κ²½κ³ μ ν ν€μλλ₯Ό νμ©νλ©΄ μ λ€λ¦μ 곡λ³μ±κ³Ό λ°κ³΅λ³μ±μ μ μ ν λΆμ¬ν μ μλ€.
ArrayList<? extends Animal> animals = new ArrayList<Dog>(); // 곡λ³
ArrayList<? super Dog> dogs = new ArrayList<Animal>(); // λ°κ³΅λ³
μΌλ°μ μΌλ‘ μμΌλ μΉ΄λλ μ λ€λ¦ νμ μ ν ν€μλμΈ `extends`, `super`μ ν¨κ» λ€μκ³Ό κ°μ΄ μ°μ΄λ©° κ° κ²½μ°λ μ£μ§ μΌμ΄μ€λ₯Ό λ μ¬λ¦¬λ©° μκ°ν΄ λ³Ό νμκ° μλ€.
μν κ²½κ³ List<? extends U>
- GET : μμ νκ² κΊΌλ΄λ €λ©΄ U νμ μΌλ‘ λ°μμΌνλ€. (EX - for λ¬Έ μ¬μ©ν κ²½μ°)
- SET : μ΄λ ν νμ μ μλ£λ λ£μμ μλ€. (nullλ§ μ½μ κ°λ₯)
νν κ²½κ³ List<? super U>
- GET : μμ νκ² κΊΌλ΄λ €λ©΄ Object νμ μΌλ‘λ§ λ°μμΌνλ€.
- SET : Uμ Uμ νμ νμ λ§ λ£μ μ μλ€.
λΉκ²½κ³ List<?>
- GET : μμ νκ² κΊΌλ΄λ €λ©΄ Object νμ μΌλ‘λ§ λ°μμΌνλ€. (super μ νΉμ§)
- SET : μ΄λ ν νμ μ μλ£λ λ£μμ μλ€. (nullλ§ μ½μ κ°λ₯) (extends μ νΉμ§)
μΆκ°μ μΌλ‘ νμ μ νμ λν PECSλΌλ 곡μμ΄ μλλ° μ΄λ Producer - Extends / Consumer - Super μ μ½μλ‘ λ©μλκ° λ°μ΄ν°λ₯Ό μμ°νλ€λ©΄ `extends`, μλΉνλ€λ©΄ `super`λ₯Ό μ¬μ©ν΄μΌνλ€λ μλ―Έλ₯Ό κ°μ§κ³ μλ€. νμ§λ§ ν΄λΉ 곡μμ μ§κ΄μ μΌλ‘ μ μ©νκΈ°μλ λ¬΄λ¦¬κ° μλ€κ³ μκ°νλ€.
μ λ€λ¦μ νμ
μμ μ±κ³Ό μΊμ€ν
μ€λ²ν€λ κ°μ μ μν΄ JDK 1.5λΆν° λμ
λ λ¬Έλ²μ΄λ€. κ·Έλ κΈ° λλ¬Έμ μ΄μ λ²μ κ³Ό νΈνμ μν΄ μ»΄νμΌ κ³Όμ μ΄ν ν΄λμ€ νμΌμμλ λͺ¨λ Object νμ
μΌλ‘ λ³νλκ±°λ μ κ±°λλ€.
βοΈ κ²°λ‘
μ λ€λ¦ λ©μλ λΆλΆμ 곡λΆνλ©΄μ λΆλͺ ν μ μλ μ λ€λ¦μ λν΄μ 곡λΆν κ² κ°μ λλμ΄ λ€μμ§λ§, μ΄μ λλ©΄ μ λ€λ¦μ λν΄μ μ ν λͺ¨λ₯΄κ³ μμλ€κ³ ν΄λ ν λ§μ΄ μμ μμ€μ΄λ€.. νΉν μμΌλμΉ΄λ κ²½κ³λ₯Ό κ°λ° μν©μ μ μ νκ² μ μ©νκΈ° μν΄μλ μ¬λ¬ μ£μ§ μΌμ΄μ€λ₯Ό κ³ λ €ν΄λ³Ό νμκ° μμ κ² κ°λ€.