ν‹°μŠ€ν† λ¦¬ λ·°

πŸ“Œ μ§€λ„€λ¦­μŠ€(Generics)

: λ‹€μ–‘ν•œ νƒ€μž…(Object의 μžμ†)의 객체듀을 λ‹€λ£¨λŠ” λ©”μ„œλ“œλ‚˜ μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μ— 컴파일 μ‹œμ˜ νƒ€μž… 체크λ₯Ό ν•΄μ£ΌλŠ” κΈ°λŠ₯

 

πŸ’πŸ»‍♀️ μ§€λ„€λ¦­μŠ€ μ™œ μ“°λ‚˜μš”?

1️⃣ 객체의 νƒ€μž… μ•ˆμ •μ„±↑

    - μ˜λ„ν•˜μ§€ μ•Šμ€ νƒ€μž…μ˜ 객체가 μ €μž₯λ˜λŠ” 것을 λ§‰μŒ

    - 잘λͺ» ν˜•λ³€ν™˜ λ˜μ–΄ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό μ€„μ—¬μ€Œ

2️⃣ νƒ€μž… 체크와 ν˜•λ³€ν™˜μ˜ λ²ˆκ±°λ‘œμ›€↓

 

βœ”οΈ μ§€λ„€λ¦­ 클래슀

class Box<T> {
    T item;
    
    void setItem(T item) { this.item = item; }
    T getItem() { return item; }
}

Box<String> box = new Box<>(); // new Box<String>()κ³Ό κ°™μŒ!

- T : νƒ€μž… λ³€μˆ˜ (상황에 맞게 E(element), K(key), V(value) λ“± μ˜λ―ΈμžˆλŠ” 문자λ₯Ό νƒ€μž… 문자둜 μ‚¬μš©), μž„μ˜μ˜ μ°Έμ‘°ν˜• νƒ€μž…

- Box<T> : μ§€λ„€λ¦­ 클래슀, 'T Box'라고 읽음

- Box : μ›μ‹œ νƒ€μž…

- Box<String> : μ§€λ„€λ¦­ νƒ€μž… 호좜 (μ—¬κΈ°μ„œ String은 λŒ€μž…λœ νƒ€μž… = λ§€κ°œλ³€μˆ˜ν™”λœ νƒ€μž…)

 

❕ 컴파일 ν›„μ—λŠ” Box<String>은 μ›μ‹œ νƒ€μž…μΈ Box둜 λ°”λ€œ! (μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•  λ•Œλ§Œ μ‚¬μš©ν•˜κ³  μ œλ„€λ¦­ νƒ€μž… 제거)

class Box {
    String item;
    
    void setItem(String item) { this.item = item; }
    String getItem() { return item; }
}

 

❗ static 멀버 λ³€μˆ˜μ— νƒ€μž… λ³€μˆ˜ Tλ₯Ό μ‚¬μš©ν•  수 μ—†μŒ!

 : μ§€λ„€λ¦­μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ³„λ‘œ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λ„λ‘ λ§Œλ“  κΈ°λŠ₯(TλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‘œ κ°„μ£Ό)μ΄λ‹ˆκΉŒ! λͺ¨λ“  객체에 λŒ€ν•΄ λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ” static λ©€λ²„λŠ” νƒ€μž… λ³€μˆ˜ T μ‚¬μš©X 

 

❗ μ§€λ„€λ¦­ νƒ€μž… λ°°μ—΄(ex. new T[])을 생성할 수 μ—†μŒ!

 : new μ—°μ‚°μžλŠ” 컴파일 μ‹œμ μ— νƒ€μž… Tκ°€ λ­”μ§€ μ •ν™•ν•˜κ²Œ μ•Œμ•„μ•Ό 함! (같은 이유둜 instanceof μ—°μ‚°μžλ„ μ‚¬μš©ν•  수 μ—†μŒ) but ArrayList<T>λŠ” κ°€λŠ₯!

 

❗ μ§€λ„€λ¦­ 클래슀λ₯Ό 생성할 λ•Œ, μ°Έμ‘°λ³€μˆ˜μ™€ μƒμ„±μžμ˜ λŒ€μž…λœ νƒ€μž…μ΄ μ™„μ „νžˆ μΌμΉ˜ν•΄μ•Όν•¨! (상속 관계여도X)

Box<Object> box = new Box<String>(); // μ—λŸ¬!

 

πŸ’πŸ»‍♀️ νƒ€μž… λ§€κ°œλ³€μˆ˜ T에 μ§€μ •ν•  수 μžˆλŠ” νƒ€μž…μ˜ μ’…λ₯˜λ₯Ό μ œν•œν•  순 μ—†λ‚˜μš”?

πŸ‘©πŸ»‍🏫 extends을 μ‚¬μš©ν•΄μ„œ μ œν•œ κ°€λŠ₯!

class FruitBox<T extends Fruit> { ... }
class FruitBox<T extends Eatable> { ... } // 주의! Eatable(μΈν„°νŽ˜μ΄μŠ€)도 extends μ‚¬μš©!
class FruitBox<T extends Fruit & Eatable> { ... }

 

πŸ™‹πŸ»‍♀️ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ§€λ„€λ¦­ 클래슀 객체가 λ“€μ–΄μ˜€λ©΄, λŒ€μž…λœ νƒ€μž…(<T>)에 따라 λ©”μ„œλ“œλ₯Ό λ”°λ‘œ λ§Œλ“€μ–΄μ•Ό λ˜λŠ”λ°, 그러면 μ€‘λ³΅λœ λ©”μ„œλ“œ μ •μ˜λ‘œ μ—λŸ¬κ°€ λ°œμƒν•΄μš”(μ§€λ„€λ¦­ νƒ€μž…μ΄ λ‹€λ₯Έ κ²ƒλ§ŒμœΌλ‘œλŠ” μ˜€λ²„λ‘œλ”© 성립X)T.T

class Juicer {
    static Juice makeJuice (FruitBox<Fruit> box) {
        String ingredient = "";
        for(Fruit f: box.getList()) ingredient += f + " ";
        return new Juice(ingredient);
    }
}

Juicer.makeJuice(new FruitBox<Fruit>()); // OK
Juicer.makeJuice(new FruitBox<Apple>()); // μ—λŸ¬. FruitBox<Fruit> box = new FruitBox<Apple>()이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έ!

 

πŸ’‘ μ™€μΌλ“œ μΉ΄λ“œ(?)λ₯Ό μ‚¬μš©

class Juicer {
    static Juice makeJuice (FruitBox<? extends Fruit> box) {
        String ingredient = "";
        for(Fruit f: box.getList()) ingredient += f + " ";
        return new Juice(ingredient);
    }
}

❕ <? extends T>, <? super T>, <?> (= <? extends Object>) 둜 μ œν•œ κ°€λŠ₯!! (&은 μ‚¬μš©λΆˆκ°€) 

 

πŸ’πŸ»‍♀️ <? super T>λŠ” μ–Έμ œ μ‚¬μš©ν•˜μ£ ? (μ°Έκ³ . <T super T>λŠ” λΆˆκ°€!)

πŸ‘©πŸ»‍🏫 Comparator와 ν•¨κ»˜ κ°€μž₯ λΉˆλ²ˆν•˜κ²Œ μ‚¬μš©λ¨!, 어쨋든 μ€‘λ³΅λœ μ½”λ“œλ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄μ„œ!

Comparator<? super Apple> // Comparator<Apple>, Comparator<Fruit>, Comparator<Object> κ°€λŠ₯!

 

βœ”οΈ μ§€λ„€λ¦­ λ©”μ„œλ“œ

: λ©”μ„œλ“œ 선언뢀에 μ§€λ„€λ¦­ νƒ€μž…μ΄ μ„ μ–Έλœ λ©”μ„œλ“œ

: μ§€λ„€λ¦­ νƒ€μž…μ˜ μ„ μ–Έ μœ„μΉ˜λŠ” λ°˜ν™˜ νƒ€μž… λ°”λ‘œ μ•ž!

 

static <T> void sort(List<T> list, Comparator<? super T> c) { ... }

❕ static λ©”μ„œλ“œμ—λ„ μ‚¬μš© κ°€λŠ₯! (μ§€λ„€λ¦­ νƒ€μž… μ§€μ—­λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것과 κ°™μ•„μ„œ)

class Juicer {
    static <T extends Fruit> Juice makeJuice (FruitBox<T> box) {
        String ingredient = "";
        for(Fruit f: box.getList()) ingredient += f + " ";
        return new Juice(ingredient);
    }
}

Juicer.makeJuice(new FruitBox<Fruit>()); // Juicer.<Fruit>makeJuice(new FruitBox<Fruit>());

❕ <T>λ₯Ό μƒλž΅ν•  수 μ—†λŠ” κ²½μš°μ—λŠ” μ°Έμ‘°λ³€μˆ˜(ex. this)λ‚˜ 클래슀 이름(ex. Juicer) μƒλž΅ λΆˆκ°€!

 

βœ”οΈ μ§€λ„€λ¦­ νƒ€μž…μ˜ ν˜•λ³€ν™˜

: μ§€λ„€λ¦­ νƒ€μž…κ³Ό μ›μ‹œ νƒ€μž…(non-generic) κ°„μ˜ ν˜•λ³€ν™˜ O

Box box = (Box) new Box<String>(); // OK
Box<String> strBox = (Box<String>) new Box(); // OK

: λŒ€μž…λœ νƒ€μž…μ΄ λ‹€λ₯Έ μ§€λ„€λ¦­ 간에 ν˜•λ³€ν™˜μ€ X

Box<Object> objbox = (Box<Object>) new Box<String>(); // μ—λŸ¬.
Box<String> strBox = (Box<String>) new Box<Object>(); // μ—λŸ¬.

: μ™€μΌλ“œ μΉ΄λ“œ(?)λ₯Ό μ‚¬μš©ν•œ νƒ€μž…κ³Ό μ§€λ„€λ¦­ νƒ€μž… κ°„μ˜ ν˜•λ³€ν™˜ O

FruitBox<Apple> box = (FruitBox<Apple>) FruitBox<? extends Fruit>(); // OK

❕ κ·Έλž˜μ„œ λŒ€μž…λœ νƒ€μž…μ΄ λ‹€λ₯Έ μ§€λ„€λ¦­ 간에 ν˜•λ³€ν™˜μ΄ λΆˆκ°€λŠ₯ ν•˜μ§€λ§Œ, μ™€μΌλ“œ μΉ΄λ“œκ°€ ν¬ν•¨λœ μ§€λ„€λ¦­ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν•˜λ©΄ κ°€λŠ₯!

: μ™€μΌλ“œ μΉ΄λ“œκ°€ μ‚¬μš©λœ μ§€λ„€λ¦­ νƒ€μž…λΌλ¦¬ ν˜•λ³€ν™˜ 뢀뢄적 κ°€λŠ₯

FruitBox<? extends Object> objBox = (FruitBox<? extends Object>) new FruitBox<? extends String>();

 

βœ”οΈ μ§€λ„€λ¦­ νƒ€μž… 제거

: μ»΄νŒŒμΌλŸ¬λŠ” μ§€λ„€λ¦­ νƒ€μž…μ„ μ΄μš©ν•΄μ„œ μ†ŒμŠ€μ½”λ“œλ₯Ό μ²΄ν¬ν•˜κ³ , ν•„μš”ν•œ 곳에 ν˜•λ³€ν™˜μ„ λ„£μ–΄μ€€ ν›„ μ§€λ„€λ¦­ νƒ€μž…μ„ 제거!

 

1️⃣ μ§€λ„€λ¦­ νƒ€μž…μ˜ 경계 제거

: <T extends Fruit>라면 TλŠ” Fruit으둜 μΉ˜ν™˜, <T>라면 TλŠ” Object둜 μΉ˜ν™˜! 클래슀 μ˜†μ˜ 선언을 제거

2️⃣ μ§€λ„€λ¦­ νƒ€μž…μ„ μ œκ±°ν•œ 후에 νƒ€μž…μ΄ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄, ν˜•λ³€ν™˜ μΆ”κ°€

3️⃣ μ™€μΌλ“œ μΉ΄λ“œκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ” κ²½μš°μ—λŠ” μ μ ˆν•œ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜μ΄ μΆ”κ°€!

 

'μ–Έμ–΄ > μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μ• λ„ˆν…Œμ΄μ…˜  (0) 2023.07.20
μ—΄κ±°ν˜•  (0) 2023.07.17
μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›  (0) 2023.07.13
java.langνŒ¨ν‚€μ§€μ™€ μœ μš©ν•œ 클래슀  (0) 2023.06.29
μ˜ˆμ™Έμ²˜λ¦¬  (0) 2023.06.25
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/05   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
κΈ€ 보관함