Box<Apple> appleBox = new Box<Apple>();
Box<Apple> appleBox = new Box<>();//OK 두문장은 같은 문장이다
지네릭스
- 타입의 안정성을 제공한다
- 타입의 체크와 형변환을 생략할 수 있으므로 코드가 간결해진다.
class Box<T> { //지네릭 타입 T를 선언
T item;
void setItem(T item) {this.item = item;}
T getItem(){return item;}
}
※ 기호의 종류가 달라도 임의의 참조형 타입을 의미한다는 것은 모두 같다.
지네릭스의 제약사항
1.모든 객체에 동일하게 동작해야하는 static멤버에 타입변수 T를 사용할 수 없다.
class Box<T>{
static T item; //에러
static int compare(T t1, T t2){....}//에러
...
}
2. 지네릭 배열을 생성할 수 없는 것은 new 연산자 때문이다. 컴파일 시점에 타입 T가 뭔지 정확히 알아야 한다.(생성시에 타입이 결정되어야 한다.)
class Box<T> {
T[] itemArr; //OK. T타입의 배열을 위한 참조변수
...
T[] toArray(){
T[] tmpArr = new T[itemArr.length]; //에러. 지네릭 배열 생성불가
...
return tmpArr;
}
...
}
참조변수와 생성자에 대입된 타입(매개변수화된 타입)이 일치해야 한다.
Box<Apple> appleBox = new Box<Apple>(); //OK
Box<Apple> appleBox = new Box<Grape>(); //에러
두 타입이 상속관계에 있떠라도 대입된 타입이 같아야 한다.
Box<Fruit> appleBox = new Box<Apple>();//에러. 대입된 타입이 다르다.
두 지네릭 클래스의 타입이 상속관계에 있고 대입된 타입이 같은 것은 가능.
Box<Apple> appleBox = new FruitBox<Apple>(); //OK. 다형성
JDK1.7 이후 추정 가능한 경우 타입을 생략할 수 있다.
Box<Apple> appleBox = new Box<Apple>();
Box<Apple> appleBox = new Box<>(); //OK. 두문장은 같은 문장이다
생성된 Box<T>의 객체에 void add(T item)으로 객체를 추가 할 때, 대입된 타입과 다른 객체는 추가 할 수 없다.
Box<Apple> appleBox = new Box<Apple>();
appleBox.add(new Apple()); //OK
appleBox.add(new Grape()); //에러 Box<Apple>에는 Apple객체만 추가 가능
타입 T가 Fruit인 경우 void add(Fruit item)가 되므로 Fruit의 자손들은 이 메서드의 매개 변수가 될 수 있다.
Box<Fruit> fruitBox = new Box<Fruit>();
fruitBox.add(new Fruit()); //OK
fruitBox.add(new Apple()); //OK . void add(Fruit item)
지네익 타입에 extends를 사용하면, 특정 타입의 자손들만 대입할 수 있게 제한 할 수 있다.
'IT > Java' 카테고리의 다른 글
지네릭 메서드 (0) | 2019.07.17 |
---|---|
Generic Wild Card (0) | 2019.07.14 |
Collection Framework (0) | 2019.07.04 |
Object 클래스 (0) | 2019.07.04 |
ArrayList (0) | 2019.07.03 |
댓글