모든 종류의 타입을 다룰 수 있도록 일반화된 타입 매개 변수(generic type)로 클래스나 메서드를 선언하는 기법이다. 클래스 내부에서 사용하는 데이터 타입을 클래스의 인스턴스를 생성할 때 결정한다.
처리 방법: 타입 제거(type erasure)라는 개념에 근거한다.
복수 제네릭도 가능하다.
특징
컴파일 시 강한 체크 타입 가능
제네릭 타입으로 특정 클래스나 자식 클래스 타입만 오도록 타입 매개변수를 제한할 수 있다.
class Stack<T extends 클래스>
개념: 템플릿은 하나의 클래스를 서로 다른 여러 타입에 재사용할 수 있도록 하는 방법
처리 방법: 컴파일러는 인자로 주어진 각각의 타입에 대해 별도의 템플릿 코드를 생성한다.
예를 들어 MyClass가 MyClass와 정적 변수(static variable)를 공유하지 않는다.
하지만 java에서 정적 변수는 제네릭(Generic) 인자로 어떤 타입을 주었는지에 관계없이 MyClass로 만든 모든 객체가 공유한다.
2. c++의 Template에는 int와 같은 기본 타입을 인자로 넘길 수 있지만, java의 Generic에서는 기본 자료형은 사용할 수 없고 Integer와 같은 참조 자료형만 사용 가능하다.
3. java에서 MyClass로 만든 모든 객체는 Generic 타입 인자가 무엇이냐에 관계없이 전부 동등한 타입이다.
- c++에서는 다른 Template 타입 인자를 사용해 만든 객체는 서로 다른 타입의 객체이다.
3. java의 경우 Generic 타입 인자를 특정 클래스나 자식 클래스 타입만 오도록 타입 매개변수를 제한할 수 있다.
4. java에서 Generic 타입의 인자는 static 메서드나 변수를 선언하는 데 사용될 수 없다.
- 왜냐하면 두 가지 다른 타입으로 선언한 두 인스턴스가 static 메서드와 변수를 공유하기 때문이다.
- c++ Template은 이 두 인스턴스를 다른 클래스로 처리하므로 Template 타입 인자를 정적 메서드나 변수를 선언하는 데 사용할 수 있다.
Map
Collection
List
Set
HashSet
TreeSet
LinkedHashSet