Skip to content

Latest commit

Β 

History

History
134 lines (89 loc) Β· 3.76 KB

Generic.md

File metadata and controls

134 lines (89 loc) Β· 3.76 KB

의미

객체의 νƒ€μž…μ„ 컴파일 μ‹œμ— μ²΄ν¬ν•΄μ£ΌλŠ” κΈ°λŠ₯

ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ—μ„œ μ‚¬μš©ν•  λ‚΄λΆ€ 데이터 νƒ€μž…μ„ 컴파일 μ‹œμ— 미리 μ§€μ •ν•˜λŠ” 방법

클래슀 λ‚΄λΆ€μ—μ„œ μ§€μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ , μ™ΈλΆ€μ—μ„œ μ‚¬μš©μžμ— μ˜ν•΄ μ§€μ •λœλ‹€.

μž₯점

νƒ€μž… μ•ˆμ •μ„±μ„ 높인닀.

λΆˆν•„μš”ν•œ ν˜•λ³€ν™˜μ„ ν•˜μ§€ μ•Šλ„λ‘ 도와쀀닀

μ˜ˆμ‹œ ν˜•νƒœ

class Box<T> {
    T item;

    void setItem(T item) {
        this.item = item;
    }

    T getItem() {
        return item;
    }
}

μ—¬κΈ°μ„œ T λ₯Ό νƒ€μž… λ³€μˆ˜λΌκ³  ν•œλ‹€. T λŒ€μ‹  E, V, K λ“± 상황에 맞게 μ˜λ―ΈμžˆλŠ” 문자λ₯Ό μ„ νƒν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

Box : μ œλ„€λ¦­ 클래슀, β€˜T의 Box’ λ˜λŠ” β€˜T Box’ 라고 μ½λŠ”λ‹€. μ˜λ―ΈλŠ” νƒ€μž… Tλ₯Ό μš”μ†Œλ‘œ ν•˜λŠ” Box 클래슀 이닀.

Box : μ›μ‹œ νƒ€μž… 이라고 μ½λŠ”λ‹€.

μ œλ„€λ¦­ νƒ€μž… 호좜

μ œλ„€λ¦­ ν΄λž˜μŠ€κ°€ 된 Box μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•ŒλŠ” μ‹€μ œ νƒ€μž…μ„ 지정해주면 λœλ‹€.

Box<String> b = new Box<String>();
b.setItem("ABC");
String item = b.getItem();

Q. static 멀버에 νƒ€μž… λ³€μˆ˜λ₯Ό 지정할 수 μžˆμ„κΉŒ?

IMAGES

static λ©€λ²„λŠ” νƒ€μž…μ˜ μ’…λ₯˜μ— 관계없이 λ™μΌν•œ λ³€μˆ˜μ—¬μ•Ό ν•˜λ―€λ‘œ, νƒ€μž…μ΄ 달라지면 μ•ˆλœλ‹€. 즉, νƒ€μž… λ³€μˆ˜λ₯Ό 지정할 수 μ—†λ‹€.

Q. μ œλ„€λ¦­ νƒ€μž…μ˜ 배열을 μ„ μ–Έν•  수 μžˆμ„κΉŒ?

IMAGES

T νƒ€μž…μ˜ 배열을 μœ„ν•œ μ°Έμ‘°λ³€μˆ˜ 선언은 κ°€λŠ₯ν•˜λ‹€.

ν•˜μ§€λ§Œ, μ œλ„€λ¦­ 배열을 생성할 μˆ˜λŠ” μ—†λ‹€. μœ„μ™€ 같이 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

이유 : new μ—°μ‚°μžλŠ” 컴파일 μ‹œμ μ— νƒ€μž…μ„ μ •ν™•νžˆ μ•Œμ•„μ•Ό ν•˜λŠ”λ° μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜κ²Œ 되면 νƒ€μž…μ„ μ•Œ 수 μ—†μœΌλ‹ˆκΉŒ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. instanceof μ—°μ‚°μžλ„ λ§ˆμ°¬κ°€μ§€λ‘œ νƒ€μž… λ³€μˆ˜(T)λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.

νƒ€μž… μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€. (JDK 1.7이후)

Box<Apple> appleBox = new Box<>(); // κ°€λŠ₯ : νƒ€μž… μƒλž΅ 
Box<Apple> appleBox = new Box<Apple>(); // κ°€λŠ₯

Q. T implements XXX κ°€ λ§žμ„κΉŒ T extends XXX 이 λ§žμ„κΉŒ?

IMAGES

T implements XXX 둜 ν•˜λ©΄ 인식할 수 μ—†λ‹€.

λ§Œμ•½, ν΄λž˜μŠ€λ„ 상속받고, μΈν„°νŽ˜μ΄μŠ€λ„ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€λ©΄ & 기호둜 μ—°κ²°ν•˜λ©΄ λœλ‹€.

class Box<T extends Fruit & Eatable> // extends λ₯Ό μ΄μš©ν•˜μ—¬ νƒ€μž… λ³€μˆ˜μ˜ νƒ€μž… μ’…λ₯˜λ₯Ό μ œν•œν•  수 μžˆλ‹€.

μ œλ„€λ¦­ λ©”μ„œλ“œ

λ©”μ„œλ“œμ˜ 선언뢀에 μ œλ„€λ¦­ νƒ€μž…μ΄ μ„ μ–Έλœ λ©”μ„œλ“œλ₯Ό μ œλ„€λ¦­ λ©”μ„œλ“œλΌκ³  ν•œλ‹€.

class FruitBox<T> {

/* 
    ? λŠ” μ™€μΌλ“œμΉ΄λ“œλΌκ³  μ½λŠ”λ‹€. 
    μ—¬κΈ°μ„  , T λ˜λŠ” T의 super ν΄λž˜μŠ€λ“€λ§Œ Comparator < > 의 νƒ€μž…μœΌλ‘œ 올 수 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€. 
*/

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

FruitBox 의 νƒ€μž… λ§€κ°œλ³€μˆ˜ T와, μ œλ„€λ¦­ λ©”μ„œλ“œ sort() 에 μ„ μ–Έλœ νƒ€μž… λ§€κ°œλ³€μˆ˜ TλŠ” νƒ€μž… 문자만 같을 뿐, μ„œλ‘œ λ‹€λ₯Έ 것이닀.

static λ©”μ„œλ“œμ—λŠ” μ œλ„€λ¦­ νƒ€μž…μ„ μ„ μ–Έν•˜κ³  μ‚¬μš©ν•  수 μžˆλ‹€.

class FruitBox<T> {
...
}
static class Juice {
...
}
class Fruit {
...
}
class Juicer {
    static <T extends Fruit> Juice makeJuice(FruitBox<T> box) {
        String tmp = "juice";
        return new Juice();
    }
}

FruitBox<Apple> appleBox = new FruitBox<Apple>();

호좜 μ‹œ,
Juicer.makeJuice(appleBox);  // κ°€λŠ₯
Juicer.<Fruit>makeJuice(appleBox);  // κ°€λŠ₯ ( T extends Fruit )
Juicer.<Apple>makeJuice(appleBox);  // κ°€λŠ₯

IMAGES

(line 24) : 같은 클래슀 내에 μžˆλŠ” λ©€λ²„λ“€λΌλ¦¬λŠ” makeJuice 처럼 μ•žμ— ν΄λž˜μŠ€μ΄λ¦„(Juicer) λ₯Ό μƒλž΅ν•  수 μžˆμ§€λ§Œ,

(line 28) : 클래슀 μ™ΈλΆ€μ—μ„œλŠ” λ°˜λ“œμ‹œ 클래슀 이름을 μ¨μ€˜μ•Ό ν•œλ‹€.

Reference

  • Java의 정석 3판