본문 바로가기

프로그래밍/Java

[Java 요약 정리] 6. 지네릭스(Generics)

6. 지네릭스(Generics)

- 컴파일시 타입을 체크해주는 기능(JDK 1.5)

- 목적: 안정성 향상(객체 타입 제한), 편의성 향상(형변환 불필요)


1) 특징

- 클래스 작성시 Object 타입 대신 T와 같은 타입변수 사용(T: 타입변수명 예시)

- 참조변수, 생성자에 타입변수 대신 실제 타입을 지정하면 형변환 생략 가능

- static멤버에는 타입 변수 사용 불가(타입변수는 인스턴스 변수로 간주)

- 지네릭 타입 배열 (ex. T[]) 생성 불가


2) 용어

- Box<T>(예시): 지네릭 클래스(T Box 혹은 T의 Box)

- T: 타입 문자/ 타입 변수, 타입 매개변수

- Box: 원시 타입(raw type)


3) 지네릭 클래스와 메소드

- 클래스: Class 클래스명<타입변수>{}

- 메소드: static <타입변수> void 메소드명();

- 클래스 타입 매개변수<T>와 메소드 타입 매개변수 <T>는 별개

- 타입변수가 적용된 객체 생성시 참조변수와 생성자에 대입된 타입이 일치해야 함


4) 와일드 카드 '?'

- 지네릭 타입에 와일드 카드 사용시 여러가지 타입을 대입 가능

- 상속 관계에서만 사용 가능

- <? extends T> : 상한 제한, T와 그 자손만 가능

- <? super T> : 하한 제한, T 와 그 조상만 가능

- <?> (<? extends Object>) : 모든 타입 가능


5) 지네릭 타입의 형변환

- 지네릭 타입과 원시 타입간의 형변환은 불가능

ex) Box box = null; Box<Object> box = null;

box = (Box)objBox; <- 경고 발생(box = 원시 타입)

objBox = (Box<Object>) box; <- 경고 발생 (미확인 타입으로 형변환)

- 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능

ex) Box<? extends Object> wBox = new Box<String>(); <- 가능

FruitBox<? extends Fruit> box = null;

FruitBox<Apple> appleBox=(FruitBox<Apple>)box; <- 경고 발생(미확인 타입으로 형변환)