본문 바로가기
IT/Java

Generics

by 봉즙 2019. 7. 9.
Box<Apple> appleBox = new Box<Apple>();
Box<Apple> appleBox = new Box<>();//OK 두문장은 같은 문장이다

지네릭스

  1. 타입의 안정성을 제공한다
  2. 타입의 체크와 형변환을 생략할 수 있으므로 코드가 간결해진다.
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

댓글