티스토리 뷰

제한된 지네릭 클래스

  • extends로 대입할 수 있는 타입을 제한
  • 인터페이스인 경우에도 extends를 사용(implements X)
더보기

extends로 대입할 수 있는 타입을 제한

FruitBox<Toy> fruitBox = new FruitBox<Toy>();
fruitBox.add(new Toy());  // OK. 과일상자에 장난감을 담을 수 있다.
  • FruitBox<T>                          모든 타입 대입 가능
  • FruitBox<T extends Fruit> Fruit의 자손만 대입 가능(Fruit 포함)
FruitBox<Apple> appleBox = new FruitBox<Apple>();  // OK.
FruitBox<Toy>     toyBox = new FruitBox<Toy>();    // 에러. Toy는 Fruit의 자손이 아님

Toy는 Fruit의 자손이 아니기 때문에 위와 같이 제네릭을 사용하면 에러가 발생한다.

인터페이스인 경우에도 extends를 사용

interface Eatable {}
class FruitBox<T extends Eatable> { ... }

'implements'를 사용하지 않는다는 점에 주의하자.

 

예제12-3

더보기

상속관계도

Ex12_3 클래스들의 상속관계도
복잡할 땐, 클래스 간 상속관계도를 그리면 훨씬 이해하기 쉽다. 👨‍🏫

대입된 타입과 인터페이스를 같이 쓰기 위해서는 ','가 아닌 '&'을 사용

class FruitBox<T extends Fruit & Eatable> extends Box<T> {}

사실, Fruit이 Eatable인터페이스를 구현했기 때문에 & Eatable은 작성하지 않아도 된다.

class FruitBox<T extends Fruit> extends Box<T> {}

 

지네릭스의 제약

  • 타입 변수에 대입은 인스턴스 별로 다르게 가능
  • [제약1] static멤버에 타입 변수 사용 불가
  • [제약2] 배열(또는 객체) 생성할 때(new연산자 다음에) 타입 변수 사용불가. 타입 변수로 배열 선언은 가능
더보기

타입 변수에 대입은 인스턴스 별로 다르게 가능

Box<Apple> appleBox = new Box<Apple>();  // OK. Apple객체만 저장가능
Box<Grape> grapeBox = new Box<Grape>();  // OK. Grape객체만 저장가능

 

[제약 1] static멤버에 타입 변수 사용 불가

class Box<T> {
    static T items; // 에러
    static int compare(T t1, T t2) { ... }. // 에러
        ...
}

static멤버는 모든 인스턴스에 공통으로 사용되기 때문에, 타입 변수를 사용할 수 없다. 타입 변수는 인스턴스마다 다르게 사용할 수 있다.

 

[제약 2] 배열(또는 객체) 생성할 때 타입 변수 사용불가. 타입 변수로 배열 선언은 가능

class Box<T> {
    T[] itemArr; // OK. T타입의 배열을 위한 참조변수
        ...
    T[] toArray() {
        T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
            ...
        return tmpArr;
    }
        ...
}
T[] itemArr; // OK. T타입의 배열을 위한 참조변수

배열을 선언할 땐 괜찮다.

T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가

하지만, new연산자로 생성할 땐 T가 오면 안 된다.

객체 생성 또는 배열 생성 시 T를 사용할 수 없다. new연산자는 뒤에 올 객체 또는 배열의 타입이 확정돼있어야 한다. T는 타입변수로 아직 타입이 정해지지 않았기 때문에 사용할 수 없는 것이다.

쉽게 얘기해서 new연산자 다음에 타입 변수 사용 불가.

 

'Java의 정석_기초편' 카테고리의 다른 글

지네릭 타입의 형 변환  (0) 2022.11.08
와일드카드 & 지네릭 메서드  (0) 2022.11.08
Iterator<E>, HashMap<K,V>  (0) 2022.11.07
지네릭스 용어  (0) 2022.11.07
지네릭스란 & 타입 변수  (0) 2022.11.07
댓글
공지사항