기본 패턴
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