제너릭Generics
제너릭은 JDK 1.5버전에서 처음 도입 되었다. 제너릭은 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스의 타입을 컴파일 과정에서 체크(compile time type check)해주는 기능을 한다. 객체 타입을 컴파일 시에 체크하기 때문에 객체 타입 안정성이 높아지고 형변환의 불편함이 줄어든다.
"제너릭은 다루게 될 객체의 타입을 미리 명시함으로써 번거러운 형변환을 줄이는 기능을 한다."
제너릭 클래스
제너릭 클래스 선언
제너릭은 클래스와 메서드에 모두 선언할 수 있다. 클래스에 제너릭을 선언하기 위해선 클래스 옆에 괄호와 타입변수를 선언 해 주면 된다.
class GenericsClass { // 제너릭 타입 T를 선언함
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
T는 타입변수(Type variable)라고 하며 꼭 T가아닌 다른 것을 사용해도 된다. 타입 변수가 여러개인 경우에는 Map
▼ 타입 매개변수 표기
| 표기 | 의미 |
|---|---|
| E | Element |
| K | Key |
| N | Number |
| T | Type |
| V | Value |
| S, U, V | 순서 2, 3, 4 |
이들 기호는 기호의 종류만 다를 뿐 임의의 참조형 타입을 의미한다는 것은 모두 같다.
지네릭 클래스가 된 클래스의 객체를 생성할 때는 참조변수와 생성자에 타입 T대신 사용될 실제 타입을 지정해주어야 한다.
GenericsClass gc = new GenericsClass(); // 타입 T대신 실제 사용할 타입을 지정함
gc.setItem(new Object()); // 컴파일 에러, String 이외 타입은 지정불가함
gc.setItem("ABC"); // String타입이므로 가능함
String item = (String)gc.getItem(); // (String)형변환 필요없음
제너릭 클래스 인스턴스 생성
Box appleBox = new Box();
T를 Apple로 결정하고 Box의 인스턴스를 생성하고 이를 참조할 수 있는 참조변수를 선언해서 참조 값을 저장했다.
Box appleBox = new Box(); // 컴파일에러.
참조변수와 생성자에 대입된 타입(매개변수화된 타입)이 일치해야 한다.
// Apple이 Fruit의 자손일 때
Box appleBox = new Box();
두 타입이 상속관계에 있어도 대입 된 타입이 일치해야 한다.
// FruitBox는 Box의 자손일 때
Box appleBox = new FruitBox();
두 제너릭클래스의 타입이 상속관계에 있고 대입된 타입이 같은 것은 괜찮다.
Box appleBox = new Box();
Box appleBox = new Box<>(); // 생략가능
참조변수의 타입을 추정 가능한 경우 생략이 가능하다.