반응형
제네릭 메소드란?
제네릭 메소드는 메소드의 선언 부에 적은 제네릭으로 리턴 타입과 파라미터의 타입을 정하는 메소드입니다.
제네릭메소드의 예제 코드는 아래와 같습니다.
public class Test<T, S extends T> {
public T name(S param) {
if(param instanceof String) {
return param;
}
return null;
}
}
<T, S extends T> 부분은 어떤 generic을 쓸 지에 대한 내용입니다.
T는 임의의 class, S는 T를 extends한 class여야 함을 명시합니다.
T name(S param) 부분에서는 앞선 정의에서 S 클래스를 parameter로 받고,
T 클래스의 객체로 리턴한다는 뜻입니다.
static generic method, 제네릭 메소드 static
먼저, 결론적으로는 아래와 같이 사용하면 됩니다.
public class Test<T, S extends T> {
public static <T, S extends T> T name(S param) {
if(param instanceof String) {
return param;
}
return null;
}
}
앞선 "제네릭 메소드란?" 클래스에서 제네릭 메소드를 static로 사용하려고 아래와 같이 작성하면,
IDE에서 오류를 발생시킵니다.
public class Test<T, S extends T> {
public static T name(S param) {
if(param instanceof String) {
return param;
}
return null;
}
}
오류내용
The method name cannot be declared static;
static methods can only be declared in a static or top level type
오류가 발생하는 이유는 Test 클래스가 인스턴스가 되기 전에 static 메소드가 메모리에 올라가게 되는데,
이 때 타입 T가 어떤 타입인지 결정되지 않기 때문에 위와 같이 사용할 수 없기 때문입니다.
그러나 아래와 같이 호출 시에 <T, S extends T>와 같이 static 키워드 뒤에 타입을 지정해준다면 static으로 사용이 가능합니다.
public class Test<T, S extends T> {
public static T name(S param) {
if(param instanceof String) {
return param;
}
return null;
}
}
generic을 사용하는 class가 아니여도 아래와 같이 generic method를 사용할 수 있습니다.
(Test뒤에 가 붙지 않음)
public class Test {
public static <T, S extends T> T name(S param) {
if(param instanceof String) {
return param;
}
return null;
}
}
제네릭 메소드 사용예제
public class Test {
public static <T> T test(T t) {
return t;
}
}
public class Main {
public static void main(String[] args) {
String a = "test";
String b = Test.test(a);
}
}
static <T> void ArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
c.add(o);
}
}
728x90
반응형
댓글