# [Java] Generic Type class에 λŒ€ν•΄
Study Repository

[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
 

[Java] μ œλ„€λ¦­κ³Ό μ™€μΌλ“œμΉ΄λ“œ νƒ€μž…μ— λŒ€ν•΄ 쉽고 μ™„λ²½ν•˜κ²Œ μ΄ν•΄ν•˜κΈ°(곡변과 λΆˆκ³΅λ³€, μƒν•œ νƒ€μž…κ³Ό ν•˜

μ΄λ²ˆμ—λŠ” 곡변과 λΆˆκ³΅λ³€μ— λŒ€ν•΄μ„œ λ¨Όμ € μ•Œμ•„λ³΄κ³ , 이후에 μ œλ„€λ¦­κ³Ό μ™€μΌλ“œμΉ΄λ“œμ— λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. λ§Žμ€ 뢄듀이 μ–΄λ €μ›Œν•˜λŠ” μ œλ„€λ¦­μΈ 만큼 μ‰½κ²Œ ν’€μ–΄μ„œ μ„€λͺ…ν•˜λ €κ³  λ…Έλ ₯ν–ˆλŠ”λ°, 많

mangkyu.tistory.com

https://www.yes24.com/Product/Goods/24259565

 

Java의 정석 - YES24

졜근 7λ…„λ™μ•ˆ μžλ°” λΆ„μ•Όμ˜ 베슀트 μ…€λŸ¬ 1μœ„λ₯Ό μ§€μΌœμ˜¨ `μžλ°”μ˜ 정석`의 μ΅œμ‹ νŒ. μ €μžκ°€ μΉ΄νŽ˜μ—μ„œ 12λ…„κ°„ 직접 λ…μžλ“€μ—κ²Œ 닡변을 ν•΄μ˜€λ©΄μ„œ μ΄ˆλ³΄μžκ°€ μ–΄λ €μ›Œν•˜λŠ” 뢀뢄을 잘 νŒŒμ•…ν•˜κ³  μ“΄ μ±…. 뿐만 μ•„

www.yes24.com

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°