Java컬렉션과 제네릭

제네릭 기초

Java 제네릭이 왜 필요한지, `List<String>` 같은 타입 매개변수가 컴파일 타임 안전성을 어떻게 높이는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

java
List<String> names = new ArrayList<>();
names.add("Kim");
String first = names.get(0);

설명

  • 제네릭은 클래스와 메서드가 다루는 타입을 매개변수처럼 표현하는 문법입니다. List<String>은 "문자열만 담는 리스트"라는 사실을 컴파일러가 알게 해 줍니다.
  • 제네릭이 없던 시절에는 컬렉션에서 값을 꺼낼 때 cast가 많았고, 잘못된 타입이 들어가도 런타임에서야 문제가 드러나기 쉬웠습니다. 제네릭은 이런 오류를 컴파일 타임으로 끌어올립니다.
  • 핵심은 코드 재사용보다 타입 관계 보존입니다. 같은 자료구조라도 어떤 타입을 담는지 정확히 표현할 수 있어, API가 훨씬 안전하고 읽기 쉬워집니다.
  • Java 제네릭은 type erasure 위에서 동작하므로, C#이나 C++ 템플릿과는 성격이 다릅니다. 초반에는 이 사실을 몰라도 되지만, 나중에 instanceof T 같은 제약을 만날 때 이유를 이해하는 데 중요합니다.
  • 실무에서는 컬렉션, repository, wrapper 클래스, helper 메서드 등에서 제네릭이 계속 등장하므로, 이 카드는 Java 중급 진입의 중요한 문턱입니다.

빠른 정리

표현의미
List<String>문자열만 담는 리스트
장점컴파일 타임 타입 안전성
부가 효과cast 감소, API 가독성 향상
자주 쓰는 곳컬렉션, 유틸리티 클래스, 메서드
추가 학습wildcard, bounded type, type erasure

주의할 점

제네릭은 "어떤 타입이든 된다"는 뜻이 아니라, "어떤 타입인지 정확히 추적한다"는 뜻에 가깝습니다. raw type을 계속 쓰면 제네릭의 장점이 거의 사라집니다.

참고 링크

2 sources