AVA - 지네릭스(Generics) (2)

지네릭스의 용어

지네릭 클래스 Box가 선언되어 있을 때,

class Box<T>{}

Box<T>	//지네릭 클래스. 'T의 Box'또는 'T Box'라고 읽는다
T		//타입변수 또는 타입 매개변수
Box		//원시타입

지네릭스의 제한

지네릭 클래스 Box의 객체를 생성할 때, 객체별로 다른 타입을 지정하는 것은 적절하다. 지네릭스는 이처럼 인스턴스별로 다르게 동작하도록 하려고 만든 기능이니까.

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

그러나 모든 객체에 대해 동일하게 동작해야하는 static멤버에 타입 변수 T를 사용할 수 없다. T는 인스턴스변수로 간주되기 때문이다.

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

static멤버는 타입 변수에 지정된 타입, 즉 대입된 타입의 종류에 관계없이 동일한 것이어야 하기 때문이다.

그리고 지네릭 타입의 배열을 생성하는 것도 허용되지 않는다.

지네릭 배열 타입의 참조변수를 선언하는 것은 가능하지만 'new T[10]'과 같이 배열을 생성하는 것은 안 된다는 뜻이다.

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

컴파일 시점에 타입 T가 뭔지 알아야 한다. 그런데 위의 코드에 작성된 클래스를 컴파일하는 시점에서는 T가 어떤 타입이 될지 전혀 알 수 없다.

꼭 지네릭 배열을 생성해야할 필요가 있을 때는, new연산자대신 'Reflection API'의 newInstance()와 같이 동적으로 객체를 생성하는 메서드로 배열을 생성

또는, Object배열을 생성해서 복사한 다음에 'T[]'로 형변환하는 방법 등을 사용한다.

좋은 웹페이지 즐겨찾기