지네릭이란 결정되지 않은 타입을 파라미터로 처리하고 실제 사용시 파라미터로 구체적인 타입으로 대체시키는 기능이다.
위의 설명은 쉽게 와닫지 않기 때문에 예시로 이해하자.
public class Box <T>{
public T content;
}
위의 Box 클래스에서 결정되지 않은 content의 타입을 T라는 파라미터로 정의했다.
<T>
는 T가 타입 파라미터라는 것을 나타내고, 타입의 자리에 T를 사용할 수 있다는 것을 의미한다. 우리는 T가 어떤 타입인지는 모르지만 객체가 생성될 때 다른 타입으로 대체된 다는 것을 알 수 있다.
만약 Box에 String을 저장하고 싶은 경우, 객체 생성시 T에 String을 넣어주면 된다.
Box<String> box = new box()<String>;
box.content = "안녕하세요";
String content = box.content;
지네릭 메서드는 타입 파라미터를 가진 메서드를 말한다. 리턴 타입 앞에 < >
를 추가햐여 타입 파라미터를 정의하고 , 리턴 타입과 매개변수 타입에서 사용한다.
public <T> Box<T> boxing(T t){......}
위의 메서드는 타입 파라미터 T가 어떤 값이냐에 따라 컴파일 과전에서 구체적인 타입이 결정된다.
1. Box<Integer> box1 = boxing(100);
2. Box<String> box2 = boxing("안녕하세요");
1.의 경우 매개변수 100이 Integer 타입이므로 T가 Integer로 대체되어 Box<Integer>
로 리턴된다. 2번의 경우는 String..
타입 파라미터를 활용할 때 Object 메소드 외에 다른 메서드가 팔요한 경우가 있다. 이 경우 구체 타입을 제한하면 제한된 타입이 가진 메서드를 사용할 수 있다.
< T extendx 상위타입>
의 방식으로 사용한다.만약 타입 파라미터를 Number
로 제한한다고 해보자
public <T extends Number> boolean compare( T t1, T t2){
double v1 = t1.doubleValue();
double v2 = t2.doubleValue();
}
타입 파라미터가 Number
로 제한하여 Number
이 가진 doubleValue()
를 사용한 것을 볼 수 있다.
지네릭에서는 ?
(와일드카드)를 활용하여 상속을 활용할 수 있다.
<? extends T>
와일드카드의 상한 제약. T와 그 자식들만 사용 가능<? extends T>
와일드카드의 하한 제한. T와 그 조상들만 사용 가능<? extends T>
제한 없이 모든 타입을 사용 가능