지네릭스
지네릭스란?
Box
T : 타입변수, 타입매개변수
Box : 원시 타입
지네릭스는 컴파일 시의 타입체크를 해주는 기능입니다.
객체의 타입을 컴파일 시에 체크하기 때문에 타입의 안정성을 높이고 형변환의 번거로움이 줄어듭니다.
1
2
3
4
5
6
7
class Box<T> {
T item;
void setItem(T item) { this.item = item;}
T getItem() {return item;}
}
// 지네릭 타입 T를 선언
T를 타입변수(type variable)라고 합니다.
Object타입 대신 원하는 타입을 지정하면 됩니다.
지네릭스 사용
지네릭 클래스에서 객체를 생성할 때는 참조변수와 생성자에
타입 T대신 실제타입을 지정해 주어야 합니다.
1
2
3
4
5
6
7
8
Box<String> b = new Box<String>(); // 타입 T대신, 실제타입을 지정
b.setItem(new Object()); // 에러 String이외의 타입은 지정 불가
b.setItem("ABC"); // String타입이므로 가능
String item = (String) b.getItme(); //형변환 빌요없음
이 때, Box
서로 다은 타입을 대입하여 호출한 것일 뿐 같은 클래스입니다.
지네릭스 제한
1
2
3
4
5
6
7
8
9
Box<Apple> appleBox = new Box<Apple>(); //가능
Box<Grape> grapeBox = new Box<Grape>(); //가능
Box<Apple> appleBox = new FruitBox<Apple>(); //가능
Box<Apple> appleBox = new Box<Grape>(); //불가능
객체별로 다른 타입을 지정하는 것은 적절합니다.
하지만 모든 객체에 대해 동일하게 동작해야하는
static 멤버에 타입변수 T를 사용할 수는 없습니다.
즉, Box
또한, 지네릭타입의 배열을 생성하는 것도 허용되지 않습니다.
1
2
3
4
T[] itemArr; // 가능 T타입의 배열을 위한 참조변수
new T[10] // 에러
왜냐하면 new연산자 때문입니다.
컴파일 시점에 타입 T가 무엇인지 알아야 하지만 알 수 없기 때문입니다.
마지막으로, 지네릭 타입에 extends를 사용하면 특정 타입의 자손들만 대입할 수 있게 됩니다.
This post is licensed under CC BY 4.0 by the author.