Post

지네릭스

지네릭스란?

image

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과 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.item과 Box.item이 다른 것이면 안됩니다.


또한, 지네릭타입의 배열을 생성하는 것도 허용되지 않습니다.

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.