제네릭은 Set이나 Map 같은 컬렉션등과 같이 하나의 원소만을 담는 컨테이너에 가장 많이 쓰인다. 따라서 컨테이너별로 형인자의 수는 고정된다. 하지만 좀 더 유연한 방법이 필요하다면 어떻게 해야할까? 컨테이너 대신 키에 형인자를 지정하여 사용하는 방법이 있다. 컨테이너에 값을 넣거나 뺄 때마다 키를 제공하는 것이다. 예를 들어 임의 클래스 객체 가운데 맘에 드는 것을 골라 저장하고 꺼낼 수 있는 Favorites 클래스를 만든다고 하자. 인자화 된 키 구실은 Class 객체가 할 것이다. 컴파일 시간 자료형이나 실행시간 자료형 정보들 메서드들에 전달할 목적으로 class 리터럴을 이용하는 경우, 그런 class 리터럴을 자료형 토큰이라 부른다. 아래는 Favorites 클래스의 API이다.
위의 Favoites 클래스는 형인자가 지정되는 곳이 키라는 것만 제외하면 간단한 맵같아 보인다. 하지만 일반적인 맵과 달리 모든 키의 자료형이 서로 다르다. 따라서 Favorites와 같은 클래스를 형 안전 다형성 컨테이너라 부른다.
Favorites 맵의 값 자료형이 Object다. 다시 말해, 이 맵은 키와 값 사이의 자료형 관계가 일치되도록, 그러니까 값의 자료형이 키가 나타내는 자료형이 되도록 보장하지 않는다. 하지만 자바에서는 자료형 시스템은 그런 관계까지 표현할 정도로 강력하지 않다. 이러한 구현은 putFavorite 메소드에서 담당하며 case메소드를 이용하여 구현한다.
요약
컬렉션 API를 통해 확인할 수 있는 제네릭의 일반적인 용법에 따르면, 컨테이너별로 형인자 개수는 고정되어 있다. 그런데 컨테이너 대신 키를 제네릭으로 만들면 그런 제약이 없는 형 안전 다형성 컨테이너를 만들 수 있다. 그런 컨테이너는 Class 객체를 ㄱ키로 쓰는데, 그런 Class 객체를 자료형 토큰이라 부른다.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[열거형과 어노테이션]규칙31. ordinal 대신 객체 필드를 사용하라 (0) | 2017.05.03 |
---|---|
[열겨형과 어노테이션]규칙30. int 상수 대신 enum을 사용하라 (0) | 2017.05.03 |
[제네릭]규칙28. 한정적 와일드카드를 써서 API유연성을 높여라 (0) | 2017.05.03 |
[제네릭]규칙27.가능하면 제네릭 메서드로 만들 것 (0) | 2017.05.03 |
[제네릭]규칙26. 가능하면 제네릭 자료형으로 만들 것 (0) | 2017.04.29 |