앞서서 제네릭 메서드 선언 방법에 대해서도 살펴보았습니다. 이제 이번 아티클에서는 본격적으로 제네릭 메서드를 선언하고, 실행 클래스에서 사용하는 방식에 대해서 예제를 실습해 보겠습니다.
우선 Box<T>라는 클래스가 정의되었다고 가정합시다. 앞서 살펴본 패턴이기는 하지만, 다시 한번 잘 살펴보도록 합시다. getter와 setter를 가지고 있는 제네렉 타입(클래스)입니다.
public class Box<T> {
private T t;
public T get() {
return t;
}
public void set(T t) {
this.t = t;
}
}
/* 다시 설명하자면, 위와 같은 제네릭 타입 클래스는
캐스팅 없이 사용할 수 있도록 일반적으로
Box<String> box = new Box<String>();
형태로 선언해 사용한다.
*/
이번에는 Util이라는 클래스를 하나 선언하고, 여기에 static 메서드를 하나 선언하겠습니다. 앞서 배웠던 제네릭 메서드의 정의에서 처럼, boxing이라는 메서드는 파라미터 타입과 리턴 타입으로 타입 파라미터를 갖습니다.
public class Util {
public static <T> Box<T> boxing(T t){
Box<T> box = new Box<T>();
box.set(t);
return box;
}
}
잠시 헷갈릴 수 있으니, Util 클래스를 꼼꼼하게 살펴보겠습니다. 우선 boxing()이라는 메서드의 구성과 특징을 하나씩 살펴보겠습니다. boxing()메서드는 우선 T타입의 파라미터 t를 갖고 있습니다. 그리고, 해당 boxing() 메서드의 결과로 리턴되는 데이터는 Box<T> 타입입니다.
자, 그렇다면 타입 파라미터 T의 타입을 결정하는 시점은 언제일까요? 앞서 배운 제네릭 메서드 1편 아티클에서 살펴본 내용을 복기해 보겠습니다.
Box<Integer> box = <Integer>boxing(99);
Box<Integer> box = boxing(99);
위의 예제처럼 boxing()메서드를 실행하면서 파라미터에 인자 값을 넣어주고, 메서드명 바로 앞에 타입 파라미터의 정확한 타입을 명시적으로 선언해 줍니다. 물론, 암묵적으로도 가능하겠죠. 그리고 해당 boxing() 메서드는 리턴 타입이 Box<T>라고 했습니다. 그렇다면 당연히 리턴 타입도 타입 파라미터의 정의에 따라 달라지겠죠? 바로 위의 예제에서는 Integer로 선언되어 있는 상태이니 리턴 타입도 Box<Integer>가 됩니다.
이제 실행 클래스로 들어가 보겠습니다.
public class ExampleMain {
public static void main(String[] args) {
Box<Integer> box1 = Util.<Integer>boxing(100);
int intValue = box1.get();
Box<String> box2 = Util.<String>boxing("TEST");
String strValue = box2.get();
System.out.println(intValue);
System.out.println(strValue);
}
}
/* 출력
100
TEST
*/
boxing() 메서드를 이용해, 바로 간단하게 Box<T> 타입이 정해진 객체를 생성하고 이를 이용해 Box<T>의 메서드까지 호출해 결과를 얻어냈습니다.
'Programming > JAVA' 카테고리의 다른 글
제네릭(4) - 제한된 타입 파라미터 선언 (0) | 2023.05.03 |
---|---|
제네릭(3) - 제네릭 메서드 3 (0) | 2023.05.02 |
제네릭(3) - 제네릭 메서드 1 (0) | 2023.04.27 |
제네릭(2) - 멀티타입 파라미터 (0) | 2023.04.26 |
제네릭(1) - 제네릭 타입 2 (0) | 2023.04.25 |