제네릭은 Set이나 Map 같은 컬렉션등과 같이 하나의 원소만을 담는 컨테이너에 가장 많이 쓰인다. 따라서 컨테이너별로 형인자의 수는 고정된다.  하지만 좀 더 유연한 방법이 필요하다면 어떻게 해야할까? 컨테이너 대신 키에 형인자를 지정하여 사용하는 방법이 있다. 컨테이너에 값을 넣거나 뺄 때마다 키를 제공하는 것이다. 예를 들어 임의 클래스 객체 가운데 맘에 드는 것을 골라 저장하고 꺼낼 수 있는 Favorites 클래스를 만든다고 하자. 인자화 된 키 구실은 Class 객체가 할 것이다. 컴파일 시간 자료형이나 실행시간 자료형 정보들 메서드들에 전달할 목적으로 class 리터럴을 이용하는 경우, 그런 class 리터럴을 자료형 토큰이라 부른다. 아래는 Favorites 클래스의 API이다.

 위의 Favoites 클래스는 형인자가 지정되는 곳이 키라는 것만 제외하면 간단한 맵같아 보인다. 하지만 일반적인 맵과 달리 모든 키의 자료형이 서로 다르다. 따라서 Favorites와 같은 클래스를 형 안전 다형성 컨테이너라 부른다. 

 Favorites 맵의 값 자료형이 Object다. 다시 말해, 이 맵은 키와 값 사이의 자료형 관계가 일치되도록, 그러니까 값의 자료형이 키가 나타내는 자료형이 되도록 보장하지 않는다. 하지만 자바에서는 자료형 시스템은 그런 관계까지 표현할 정도로 강력하지 않다. 이러한 구현은 putFavorite 메소드에서 담당하며 case메소드를 이용하여 구현한다. 


요약

컬렉션 API를 통해 확인할 수 있는 제네릭의 일반적인 용법에 따르면, 컨테이너별로 형인자 개수는 고정되어 있다. 그런데 컨테이너 대신 키를 제네릭으로 만들면 그런 제약이 없는 형 안전 다형성 컨테이너를 만들 수 있다. 그런 컨테이너는 Class 객체를 ㄱ키로 쓰는데, 그런 Class 객체를 자료형 토큰이라 부른다. 


+ Recent posts