본문 바로가기

프로그래밍 /JAVA

[Java]Generics 제네릭스

지네릭스(Generics)란? 



(영어 - generic) 포괄적인, 일반적인


- 컴파일시 타입을 체크해 주는 기능 ( compile - time type check) - JDK5         부터

- 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌


( 하나의 컬렉션을 대부분 한 종류의 객체만 저장)


장점. 

1. 타입의 안정성을 제공

2. 타입의 체크와 형변환을 생략할 수 있으므로 코드가 간결!!


(Box<T> 의 객체 생성. 참조변수와 생성자에 대입된 타입이 일치해야 한다)



용어


Box<T> ==>지네릭 클래스 T의 box ,또는 T Box

T           ==>타입변수 또는 타입 매개변수(T는 타입 문자)

Box       ==>원시 타입( raw type) 



제한


static 멤버에는 타입변수T를 사용할수 없다, 


static T item; // 에러 

static int compare(T t1,T t2} {...} / / 에러


배열 T[ ] 를 생성하는 것은 안된다.





class Box<T>


-- T[ ] itemArr;//  T타입의 배열을 위한 참조변수는 가능


T[ ] tmpArr = new T[itemArr.length]; // 지네릭 배열을 생성은 불가 


return tmpArr;

}

...

 



제한된 지네릭 클래스


지네릭 타입에 'extends'    를 사용하면 , 특정타입의 자손들만 대입할 수 있게 제한할 수 있다.


-add()의 매개변수의 타입 T 도 Fruit 와 그 자손 타입이 될수 있다.


-인터페이스 의 경우에도 'implements' 가 아닌 'extends' 를 사용


와일드 카드 ? 

지네릭 타입에 와일드 카드를 쓰면 여러타입을 대입가능 


<? extends T>  와일드 카드의 상한제한 T 와 자손들만 가능

<? super T> 와일드 칻의 하한제한 T와 그 조상들만

<?>   제한없음 모든 타입이 가능<? extends Object>

(p.s 와일드 카드가 사용 된 지네릭 타입으로는 형변환 불가 )


왜 쓸까????



타입의 안정성과 코드 중복 제거의 문제해결을 위해서
제네릭화 하도록한다.


남궁성의 자바의 정석 참조