제네릭의 제약과 제한

Soobin Kim·2024년 4월 6일

Java

목록 보기
37/47

제약

요약

제네릭 클래스의 static 멤버에 타입변수를 활용할 수 없다(∵정적 바인딩).
제네릭 타입을 선언한 메서드는 static 멤버가 될 수 있다.
클래스가 로드될 때 정적 제네릭 메서드도 메모리에 로드되지만, 타입 매개변수는 구체적 타입으로 결정되지 않다가, 호출될 때 전달된 인수를 기반으로 타입이 결정되기 때문이다.

public static void example(T generic) { /*...*/ } // error
public static <T> T getID(T id) { return (T)id; } // correct

객체 / 배열 생성 시 타입변수를 사용할 수 없다(선언 O | 생성 즉 new 연산자 뒤 X).

public class GenericArray<T> {
    public GenericArray(int capacity) {
        elements = (T[])(new Object[capacity]);
        // elements = new T[capacity]; X!!
    }
}

타입변수는 instanceof 연산자의 피연산자가 될 수 없다.

제네릭 클래스의 타입 매개변수 T와 제네릭 클래스 내부에 선언된 제네릭 메서드의 타입 매개변수 T가 있다고 가정하였을 때, 이 둘은 타입 문자만 같은 것일 뿐, 사실상 서로 다른 별개의 타입 매개변수다.

타입변수에 대입된 제네릭 타입과 생성자에 대입된 매개변수화된 타입은 일치해야 하는데, 이는 제네릭 타입 간의 다형성이 허용되지 않기 때문이다.

GenericArray<Object> obj = new GenericArray<String>(); // error

제한

	// 제네릭 타입 변수의 구체적 타입이 Products의 자손타입으로 제한된다.
	class ProductsList<T extends Products>{}
    class Calculate<T extends Number>{}
    public <T extends Animal> T animal(T animal){}
  • 제네릭 타입을 좁은 범위로 특정하는 방법은 extends 키워드를 이용하는 것이다.
  • 이를 통해 제네릭 클래스나 메서드에서 사용할 수 있는 타입을 제한할 수 있다.
  • 주의: 인터페이스 구현 제약이 필요해도 키워드는 extends를 사용한다.
  • A의 자손이면서 B인터페이스를 구현하는 제네릭 타입일 경우, <T extends A & B>처럼 &기호로 연결한다.

0개의 댓글