데이터 타입을 추후에 지정할 수 있도록 일반화하여
클래스 혹은 메서드에 사용할 데이터 타입이 특정 데이터 타입에 얽매이지 않도록 해둔 것
class Box {
String item;
...
}
위 클래스는 String 타입의 item만 쓸 수 있음
인스턴스 변수 item이 다른 타입도 가지고 싶다면 그에 따라 여러 클래스를 아래와 같이 정의해야 함.
class StringBox { String item ... };
class IntBox { int item ... };
class BooleanBox { boolean item ... };
...
하나의 클래스를 작성하고 그때 그때 원하는 타입의 데이터를 저장하는 인스턴스를 만들고 싶다.
그래서 사용하는 것이 제네릭
class Box<T> {
T item;
Box(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
위 클래스를 정의함으로 하나의 클래스로 원하는 데이터 타입의 인스턴스 변수를 가지는 인스턴스를 생성할 수 있다.
위에서 정의한 클래스가 제네릭 클래스이다.
클래스에 사용된 T
는 타입 매개변수
<T>
를 클래스이름 옆에 적어서 클래스에서 사용할 타입 매개변수를 선언
여러 타입 매개변수가 필요하면 <K, V>
처럼 여러 개도 사용할 수 있음.
- T -> Type,
- K -> Key,
- V -> Value,
- E -> Element,
- N -> Number,
- R -> Result
요런 의미를 가짐
Box<Integer> intBox = new Box<>();
이렇게 인스턴스를 생성
<Integer>
는 앞으로 클래스 내에 있는 T를 Integer 로 바꾼다.
원시타입은 안되고 래퍼클래스를 활용해야 함.
Integer는 래퍼클래스이다. 다음에 공부해보자
제네릭 클래스에서 클래스 변수에는 타입 매개변수 사용할 수 없음.
인스턴스마다 원하는 데이터 타입을 가지는 인스턴스를 가지고 싶어서 씀.
But 클래스 변수는 모든 인스턴스가 공유함.
제네릭 클래스도 다형성 적용 가능