Generics는 타입으로 매개변수화된 class와 메서드를 작성하게 하여, 같은 코드가 여러 타입과 작동하면서도 컴파일 타임 타입 안전성을 유지합니다. 이것이 **매개변수 다형성(parametric polymorphism)**입니다 — "하나의 형태, 어떤 타입이든".
해결하는 문제
java
();
list.add();
(String) list.get();
// Generics 와 함께: 타입이 알려지고 컴파일 타임에 검사됨
List<String> list = new ArrayList<>();
list.add("hi");
String s = list.get(0); // 캐스트 불필요; list.add(42) 는 컴파일되지 않음
class Box<T> { // T 는 타입 매개변수
private T value;
Box(T value) { this.value = value; }
T get() { return value; }
}
Box<Integer> b = new Box<>(42); // T = Integer, 컴파일 타임에 검사됨
int n = b.get(); // 캐스트 불필요
<T extends Comparable<T>> // 경계: T 는 비교 가능해야 함
List<? extends Number> // 공변성: List<Integer>, List<Double> 허용
Java는 런타임에 generic 타입을 지웁니다(타입 소거) — new T()나 instanceof List<String>을 할 수 없습니다. C++ 템플릿과 C# generics는 다르게 동작합니다(단형화 / 구체화된 타입).
Generics는 재사용과 안전성을 동시에 제공합니다: 하나의 List<T>가 모든 원소 타입을 처리하며, 컴파일러가 그렇지 않으면 런타임 충돌이 될 타입 오류를 잡아냅니다.
안전하지 않은 캐스트를 제거하고 컬렉션의 근간을 이루어, 코드를 더 재사용 가능하고 오용하기 어렵게 만듭니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기