제네릭은 매개변수를 통해 다양한 타입에 대한 유연함을 갖게 한다
타입 매개변수는 <>로 감싸서 지정한다
타입 매개변수를 선언하는 것은 매개변수화 타입을 정의한다고 말한다
매개변수는 클래스 생성 시 생성자에서 사용하거나
함수 호출 시 인자를 받기 위해 사용한다
타입 매개변수는 말 그대로 타입을 전달하는 것이라고 생각하면 된다
List 의 선언을 보면 이해가 될거라고 한다
abstract class List<E> implements EfficientLengthIterable<E> {
...
void add(E value);
...
}
E라는 제네릭을 선언하였기 때문에 타입 매개변수를 통해 타입을 지정할 수 있다
자바에서는 E를 형식 타입 매개변수라고 한다
List<int> intList = List();
여기서 List의 형식 타입 매개변수인 E에 전달되는 값은 int
int를 실제 타입 매개변수라고 한다
제네릭의 장점은 코드의 중복을 막을 수 있다
타입만 변환하기 위해 오버로딩을 하여 새로 정의해줄 필요가 없는 것이다
제네릭을 사용할 때 매개변수화 타입을 제한할 수도 있다
타입 매개변수에 extends를 사용해서 특정 클래스를 상속받을 수 있다
그럼 지정된 부모 클래스와 자식 클래스가 실제 타입이 될 수 있다 (다형성)
class Developer<T extedns Person> {
}
이런 식으로 타입 제한을 하게되면 Developer 클래스를 통해 생성되는 객체는
Person 타입이나 Developer 타입만을 가질 수 있게 된다
제네릭은 클래스 뿐만 아니라 메소드에서도 사용 가능하다
매개변수의 타입, 리턴 타입 등을 제네릭으로 지정할 수 있다
class Person {
T returnParam<T>(T param) {
return param;
}
}
위와 같이 작성된 메소드는 제네릭을 통해 매개변수의 타입을 지정하고, 리턴 타입 또한 동일하게 지정된다