제네릭 메소드

- 자료형 매개변수를 메소드의 매개변수나 반환 값으로 가지는 메소드이다.
- 자료형 매개 변수가 하나 이상인 경우도 있다.
- 제네릭 클래스가 아니어도 내부에 제네릭 메소드를 구현하여 사용할 수 있다.
public class ThreeDPrinter {
public <T> Product makeObject(T material) {
return new Product(material);
}
}
static
- 제네릭 클래스는 static 변수와 static 메소드를 가질 수 없다.
그 이유는 ThreeDPrinter 클래스의 인스턴스가 생성되기 전에 static이 붙은 변수나 메소드는 메모리의 Data 영역에 올라가는데 변수나 메소드의 T 자료형이 결정되지 않았기 때문에 가질 수 없다.
public class ThreeDPrinter<T> {
static T printerName;
public static T setPrinterName(T name) {
this.printerName = name
}
}
- 하지만, 제네릭 메소드는 static이 가능하다.
제네릭 메소드는 호출 시 매개 타입을 지정하기 때문에 static이 가능하다.
public class ThreeDPrinter<T> {
public static <T> T setPrinterName(T name) {
this.printerName = name
}
}
기억하자
- 위와 같이 클래스에도
<T>
가 붙어있고, 메소드에도 <T>
가 붙어있다. 같은 타입 변수가 붙어있어 같다고 생각하지만, 둘은 완전 별개다.
- 클래스에 표시하는
<T>
는 전역 변수처럼 사용되지만, 메소드에 표시하는 <T>
는 지역 변수처럼 메소드 안에서만 사용할 수 있다.
정리
public class ThreeDPrinter<T> {
public T getName() {return name;}
public <T> T setName(T name) {this.name = name;}
public <S> T setMaterial(S material) {this.material = material;}
public static <S> T getMaterial() {return material;}
}
- 1번 : 클래스의 제네릭 타입 T를 그대로 사용한다.
- 2번 : 클래스의 T와 2번 메소드의 T는 다르다.
- 3번 : static 메소드가 아닌 일반 메소드기 때문에 클래스의 T와 3번 메소드의 S를 같이 사용할 수 있다.
- 4번 : static 메소드기 때문에 클래스의 T와 같이 사용할 수 없어 에러가 발생한다.
참고