어제 오늘 내일

[Java] Collections.checkedList() – 런타임 타입 안전한 리스트 만들기 본문

IT/Java

[Java] Collections.checkedList() – 런타임 타입 안전한 리스트 만들기

hi.anna 2025. 9. 12. 12:14

Java에서 제네릭은 컴파일 시 타입 안전성을 보장합니다.
하지만 제네릭 타입이 런타임에는 지워(erasure) 되기 때문에, 잘못된 타입이 들어와도 컴파일러가 잡지 못하는 경우가 발생할 수 있습니다.

이럴 때 Collections.checkedList()를 사용하면, 런타임에도 타입 검사를 수행하여 예상치 못한 타입 오류를 빠르게 잡을 수 있습니다.
이 메서드는 런타임에 제네릭 타입 안정성을 강제할 수 있도록 도와줍니다.

 

1. 기본 사용법

import java.util.*;

public class CheckedListExample1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        List<String> safeList = Collections.checkedList(list, String.class);

        safeList.add("Hello");
        safeList.add("World");

        System.out.println(safeList); // [Hello, World]
    }
}

👉 checkedList()원래 리스트(list)를 감싸면서, 허용할 타입(String.class)을 지정합니다.

2

. 잘못된 타입 삽입 방지

만약 잘못된 타입을 넣으려 하면 런타임 예외(ClassCastException)가 발생합니다.

import java.util.*;

public class CheckedListExample2 {
    public static void main(String[] args) {
        List rawList = new ArrayList(); // Raw 타입 사용 (제네릭 미적용)
        List<String> safeList = Collections.checkedList(rawList, String.class);

        rawList.add(123); // 컴파일러는 경고만 하고 통과
        // safeList.add(123); → 런타임 시 ClassCastException 발생
    }
}

👉 이렇게 하면 Raw 타입이나 외부 코드에서 잘못된 값을 삽입했을 때 문제를 바로 발견할 수 있습니다.

 

3. 왜 필요한가?

  • 레거시 코드 호환성: 옛날 Java 코드에는 Raw 타입 컬렉션이 많음 → 타입 안전하지 않음
  • 외부 API와 연동: 외부 라이브러리나 프레임워크에서 제네릭을 제대로 안 쓰는 경우 안전장치 필요
  • 디버깅 편의: 문제를 조기에 발견 가능

 

4. 다른 컬렉션에서도 사용 가능

checkedSet(), checkedMap()도 동일한 방식으로 동작합니다.

Set<Integer> set = Collections.checkedSet(new HashSet<>(), Integer.class);
set.add(10);
set.add(20);
// set.add("Wrong"); // 런타임 예외 발생

 

5. 정리

  • Collections.checkedList(List<E> list, Class<E> type)
    → 주어진 리스트를 감싸서 런타임 타입 검사를 수행
  • 잘못된 타입이 들어가면 ClassCastException 발생
  • checkedSet(), checkedMap()도 동일한 원리
  • 레거시 코드, 외부 API 연동 시 타입 안정성 확보에 유용

👉 제네릭 타입을 런타임에도 강제하고 싶다면 Collections.checkedList()를 활용하자!

 

 

반응형
Comments