본문 바로가기
dev/JAVA

[JAVA] 제네릭스

by dev_Step 2022. 6. 2.
Box<T>   지네릭 클래스, T의 Box 또는, T Box라고 읽는다.
T        타입변수, 또는 타입 매개변수(T는 타입문자)
Box      원시타입

지네릭 클래스를 생성할 떄는 다음과 같이 진행해야한다.  참조변수와 생성자에 대입된 타입(매개 변수화된 타입)이 일치해야 한다. 일치하지 않으면 에러가 발생한다.

Box<Apple> appleBox = new Box<Apple>();          -- OK
Box<Apple> appleBox = new Box<Grape>();          -- Failed

두타입이 상속 관계에 있더래도 마찬가지이다. Apple이 Fruit의 자손이라고 생각하자

Box<Fruit> appleBox = new Box<Apple>();          -- Fail..  타입이 다르다.

단, 두 지네릭 클래스의 타입이 상속관계에 있고, 대입된 타입이 같은것은 괜찮다
FruitBox가 Box의 자손이라고 가정하자

Box<Apple> appleBox = new FruitBox<Apple>();     -- Ok, 다형성에 의해서 가능


Box<T> 의 void add(T item) 메서드의 경우를 생각해보자

Box<Apple> appleBox = new Box<Apple>();
appleBox.add(new Apple());          -- OK             
appleBox.add(new Grape());          -- Fail... Box<Apple> 에는 Apple 객체만 추가 가능

만약에 타입 T가 Fruit인 경우는
Box<Fruit> fruitBox = new Box<Fruit>();
fruitBox.add(new Fruit());      -- Ok
fruitBox.add(new Apple());      -- Ok ,,,   다형성에 의해 가능
                                Fruit f = new Apple(); // Fruit f = new Grape(); 가능하듯이.

제한된 지네릭 클래스.

< ? extends T >  와일드 카드의 상한 제한 T와 그 자손들만 가능
< ? super T >    와일드 카드의 하한 제한 T와 그 조상들만 가능
<?>              제한 없음 모든 타입이 가능, <? extends Object> 와 동일하다.

 

 

 

public static < T extends Comparable<? super T>> void sort(List<T> list) 

--> 매개변수로 지정한 List<T>를 정렬하는 매서드 

 

이해하기 위해서는 와이드 카드를 우선 제거한다음 다시보자

public static < T extends Comparable<T>> void sort(List<T> list)

List<T>의 요소가 Comparable인터페이스를 구현한 것이어야 한다는 의미이다.

 

즉 T는 Comparable을 구현한 클래스이어야 하며, (T extends Comparable), 

'T'또는 그 조상의 타입을 비교하는 Comparable이어야 한다는 것 즉 T는 하한 제한이 걸려있으며 T는 Comparable을 구현하거나 그 조상들이어야 한다.

즉 T가 Student이고, Person의 자손이라면 , <? super T> 는 Student, Person, Object 모두 가능하다, 

'dev > JAVA' 카테고리의 다른 글

[JAVA] StandardMultipartHttpServletRequest  (0) 2023.03.11
[JAVA] 익명 클래스  (0) 2022.05.31
[JAVA] 인터페이스의 장점  (0) 2022.05.31
[JAVA] 인터페이스의 다형성  (0) 2022.05.31
[JAVA] 인터페이스  (0) 2022.05.31