class Box<T> {
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
class BoxFactory {
public static <T> Box<T> makeBox(T o) { // 제네릭 메서드의 정의
Box<T> box = new Box<T>(); // 상자를 생성하고,
box.set(o); // 전달된 인스턴스를 상자에 담아서,
return box; // 이 상자를 반환한다.
}
}
class GenericMethodBoxMaker {
public static void main(String[] args) {
Box<String> sBox = BoxFactory.makeBox("Sweet");
System.out.println(sBox.get());
Box<Double> dBox = BoxFactory.makeBox(7.59);
System.out.println(dBox.get());
}
}
제네릭 메서드 정의 부분을 보자.
public static <T> Box<T> makeBox(T o) { // 제네릭 메서드의 정의
static과 Box<T> 사이에 위치한 <T>는 T가 타입 매개변수임을 알리는 표시다.
그리고 위의 함수는 반환형이 Box<T>임을 알 수 있다.
또한 main 함수 부분을 보면 makeBox 제네릭 메서드는 다음과 같이 호출을 한다.
제네릭 메서드는 호출 시에 자료형이 결정된다.
Box<String> sBox = BoxFactory.makeBox("Sweet");
Box<Double> dBox = BoxFactory.makeBox(7.59);
Box<Double> dBox = BoxFactory.makeBox(7.59); 코드를 보면 makeBox 제네릭 메서드의 인자로 double형 함수가 왔다. double형 숫자 7.59에 대해서 Double로 오토 박싱을 해준다.
그리고 원래는
Box<String> sBox = BoxFactory.<String>makeBox("Sweet");
Box<Double> dBox = BoxFactory.<Double>makeBox(7.59);
이지만 우변의 T에 대한 타입 인자 정보가 생략되었던 것이다.
우변의 T에 대한 타입 인자 정보를 생략해도 컴파일러는 makeBox에 전달되는 인자를 보고 T를 유추하고 Double로 결정된 건에 대해서는 오토 박싱까지 감안하여 진행되었다.
class Box<T> {
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
class Unboxer {
public static <T> T openBox(Box<T> box) {
return box.get();
}
}
class GenericMethodBoxMaker2 {
public static void main(String[] args) {
Box<String> box = new Box<>();
box.set("My Generic Method");
String str = Unboxer.<String>openBox(box);
System.out.println(str);
}
}
정의된 제네릭 메서드는 인자로 전달된 상자에서 내용물을 꺼내 반환하는 메서드
메서드의 정의를 보면
public static <T> T openBox(Box<T> box) {
return box.get();
}
반환형이 T이고 전달인자의 자료형이 Box<T>인 경우다.
위의 메서드 호출에서는 T가 String이어야 하므로 타입 인자가 <String>으로 결정되었다.
물론 다음과 같이 생략해서 쓸 수 있다.
String str = Unboxer.openBox(box);
ch24) 컬렉션 기반 알고리즘 ①,② (1) | 2022.12.31 |
---|---|
[Java] HashMap<K,V> (0) | 2022.12.23 |
[Java] 제네릭 예제 틀린 거 분석 (0) | 2022.12.22 |
[Java] Set<E> 클래스 (0) | 2022.12.20 |
배열 기반 리스트, 연결 기반 리스트 마무리 (0) | 2022.12.20 |
댓글 영역