본문 바로가기

Programming/JAVA

제네릭(3) - 제네릭 메서드 2

java logo image

 

 

 

앞서서 제네릭 메서드 선언 방법에 대해서도 살펴보았습니다. 이제 이번 아티클에서는 본격적으로 제네릭 메서드를 선언하고, 실행 클래스에서 사용하는 방식에 대해서 예제를 실습해 보겠습니다. 

 

 

 


 

 

우선 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편 아티클에서 살펴본 내용을 복기해 보겠습니다. 

 

 

 

제네릭(3) - 제네릭 메서드 1

앞서 제네릭과 관련해서는 클래스의 선언, 그리고 해당 클래스의 인스턴스 생성 시점에 주로 사용되는 타입 파라미터 정의와 관련해서 제네릭 타입을 사용하는 유형을 중심으로 살펴보았습니

nozeroslope.tistory.com

 

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>의 메서드까지 호출해 결과를 얻어냈습니다.