[Java] 제네릭
제네릭
제네릭(Generic)이란 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능
public class Box<T>{
public T content;
}
만약 Box의 내용물로 String을 저장하고 싶다면 다음과 같이 Box를 생성할 때 타입 파라미터 T 대신 String으로 대체하면 된다.
Box<String> box = new Box<String>();
box.content = "안녕하세요";
String content = box.content; //강제 타입 변환 없이 "안녕하세요"를 바로 얻을 수 있음
Box<Integer> box = new Box<Integer>();
box.content = 100;
int content = box.content; //강제 타입 변환이 필요없이 100을 바로 얻을 수 있음
제한된 타입 파라미터
경우에 따라서는 타입 파라미터를 대체하는 구체적인 타입을 제한할 필요가 있다. 모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터를 제한된 타입 파라미터라고 한다.
public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) {...}
상위 타입은 클래스뿐만 아니라 인터페이스도 가능하다. 인터페이스라고 해서 implements를 사용하지는 않는다.
public <T extends Number> boolean compare(T t1, T t2){
double v1 = t1.doubleValue(); //Number의 doubleValue() 메소드 사용
double v2 = t2.doubleValue(); //Number의 doubleValue() 메소드 사용
return (v1 == v2);
}
와일드카드 타입 파라미터
제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 타입 파라미터로 ?(와일드카드)를 사용할 수 있다.
?는 범위에 있는 모든 타입으로 대체할 수 있다는 표시이다.
리턴타입 메소드명(제네릭타입<? extends Student> 변수 {...})
리턴타입 메소드명(제네릭타입<? super Worker> 변수 {...})
리턴타입 메소드명(제네릭타입<?> 변수) {...}
- 출처: 이것이 자바다
댓글남기기