본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템 33. 타입 안전 이종 컨테이너를 고려하라

 

타입 안전 이종 컨테이너(Type-safe heterogeneous container) : 다양한 타입의 요소를 안전하게 저장하고 검색할 수 있는 컨테이너. 이를 통해 다양한 타입의 데이터를 일관된 방식으로 처리할 수 있다. 이러한 컨테이너를 고려함으로써 프로그램의 유연성과 안정성을 향상시킬 수 있다.

 

import java.util.HashMap;
import java.util.Map;

// 데이터베이스의 행을 표현하는 클래스
public class DatabaseRow {
    // 열(Column)과 해당 열의 값을 저장하는 맵
    // 타입 안전 이종컨테이너
    private final Map<Column<?>, Object> columns = new HashMap<>();

    // 열과 해당하는 값을 추가하는 메서드
    public <T> void addColumn(Column<T> column, T value) {
        columns.put(column, value);
    }

    // 열에 해당하는 값을 반환하는 메서드
    public <T> T getValue(Column<T> column) {
        // 맵에서 열에 해당하는 값을 가져와 형변환하여 반환
        return column.getType().cast(columns.get(column));
    }
}

// 열(Column)을 나타내는 클래스
class Column<T> {
    // 열의 값의 타입을 나타내는 클래스
    private final Class<T> type;

    // 열의 값의 타입을 받아 초기화하는 생성자
    public Column(Class<T> type) {
        this.type = type;
    }

    // 열의 값의 타입을 반환하는 메서드
    public Class<T> getType() {
        return type;
    }
}

 

 

결론 : 컬렉션 API로 대표되는 일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수의 수가 고정되어 있다. 하지만 컨테이너 자체가 아닌 키를 타입 매개변수로 바꾸면 이런 제약이 없는 타입 안전 이종 컨테이너를 만들 수 있다. 타입 안전 이종 컨테이너는 Class를 키로 쓰며, 이런 식으로 쓰인 Class 객체를 타입 토큰이라 한다. 또한, 직접 구현한 키 타입도 쓸 수 있다. 예컨대 데이터베이스의 행(컨테이너)을 표현한 DateabaseRow 타입에는 제네릭 타입인 Column<T>를 키로 사용할 수 있다.