제네릭이란?
•
컴파일시 타입을 체크해주는 기능
•
객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌
제네릭 클래스의 선언
•
Object타입 대신 T와 같은 타입변수를 사용
•
참조변수, 생성자에 T 대신 실제 타입을 지정하면 형변환 생략 가능
// 제네릭 이전의 코드
class Box {
Object obj;
public void set(Object obj) { this.obj = obj; }
public Object get() { return obj;}
}
public class GenericTest {
public static void main(String[] args) {
Box1 aBox = new Box1();
Box1 oBox = new Box1();
aBox.set(new Apple());
oBox.set(new Orange());
// aBox.set("apple"); // 컴파일이 잡아내지 못하는 에러 발생
Apple ap = (Apple)aBox.get(); // 형변환 과정이 반드시 필요함
Orange og = (Orange)oBox.get(); // 형변환 과정이 반드시 필요함
}
}
Java
복사
// 제네릭 사용 코드
class Box<T> {
private T obj;
public void set(T obj) { this.obj = obj; }
public T get() { return obj; }
}
public class GenericTest {
public static void main(String[] args) {
Box<Apple> aBox = new Box<Apple>();
Box<Orange> oBox = new Box<Orange>();
aBox.set(new Apple());
oBox.set(new Orange());
// aBox.set("Apple"); // 이제는 컴파일 에러가 남
Apple ap = aBox.get(); // 형변환 생략 가능
Orange og = oBox.get(); // 형변환 생략 가능
}
}
Java
복사
제네릭의 용어
class Box<T> { }
Java
복사
자주 사용하는 타입 매개변수
제네릭 클래스의 제한
class Box<T extends Number> { ... }
Java
복사
→ 제네릭 타입에 extends를 사용하면 특정 타입의 자손들만 대입할 수 있게 제한할 수 있음
interface Box { }
class AppleBox<T extends Box> { ... }
Java
복사
→ 인터페이스의 경우에도 extends 사용