본문 바로가기

프로그래밍/JAVA

[ JAVA ] 지네릭스(Generics) - ②

1. 지네릭 클래스의 객체 생성과 사용

class Box<T> {
    ArrayList<T> list = new ArrayList<T>();
    
    void add(T item)       { list.add(item); }
    T get(int i)           { return list.get(i); }
    ArrayList<T> getList() { return list; }
    int size()             { return list.size(); }
    public String toString { return list.toString(); }
}

① 참조변수와 생성자에 대입된 타입(매개변수화된 타입)이 일치해야 한다.

Box<Apple> appleBox = new Box<Apple>(); // OK
Box<Apple> appleBox = new Box<Grape>(); // 에러

// 두 타입이 상속관계라도 일치해야 한다.
// Apple이 Fruit의 자손인 경우
Box<Fruit> appleBox = new Box<Apple>(); // 에러. 대입된 타입이 다름

// 두 지네릭 클래스의 타입이 상속관계에 있고, 대입된 타입이 같은 것은 가능
// FruitBox가 Box의 자손인 경우
Box<Apple> appleBox = new FruitBox<Apple>(); // OK. 다형성

② JDK1.7부터는 추정이 가능한 경우 타입을 생략할 수 있다.

Box<Apple> appleBox = new Box<Apple>(); 
Box<Apple> appleBox = new Box<>(); // OK. JDK1.7부터 생략가능

③ 대입된 타입과 다른 타입의 객체는 추가할 수 없다.

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

// 대입된 타입의 자손들은 추가가 가능하다.
// Apple이 Fruit의 자손인 경우
Box<Fruit> fruitBox = new Box<Fruit>();
fruitBox.add(new Fruit()); // OK.
fruitBox.add(new Apple()); // OK.

2. 제한된 지네릭 클래스

▶ 지네릭 타입에 'extends'를 사용하면, 특정 타입의 자손들만 대입할 수 있게 제한할 수 있다.
▶ 타입 매개변수 T에 Object를 대입하면, 모든 종류의 객체를 저장할 수 있다.
▶ 클래스가 아니라 인터페이스를 구현해야 한다는 제약이 필요하면, 이때도 'extends'를 사용한다.
    'implements'를 사용하지 않는다는 점에 주의!
class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정가능
    ArrayList<T> list = new ArrayList<T>();   
}

FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK. Apple은 Fruit의 자손
FruitBox<Toy> toyBox = new FruitBox<Toy>(); // 에러. Toy는 Fruit의 자손이 아님

FruitBox<Fruit> fruitBox = new FriotBox<Fruit>();
fruitBox.add(new Apple()); // OK. Apple은 Fruit의 자손
fruitBox.add(new Grape()); // OK. Grape은 Fruit의 자손

// 인터페이스 구현
interface Eatable {}
class FruitBox<T extends Eatable> { ... }  // 'implements'를 사용하지 않음

// 클래스 Fruit의 자손이면서 Eatable 인터페이스도 구현해야하는 경우 '&'기호로 연결
class FruitBox<T extends Fruit & Eatable> { ... }

'프로그래밍 > JAVA' 카테고리의 다른 글

[ JAVA ] 쓰레드의 실행제어  (0) 2023.02.26
[ JAVA ] 지네릭스(Generics) - ③  (0) 2023.02.07
[ JAVA ] 지네릭스(Generics) - ①  (0) 2023.02.06
[ JAVA ] Arrays  (0) 2023.01.08
[ JAVA ] Iterator, ListIterator, Enumeration  (0) 2023.01.08