0%

Java generic method, 자바 제네릭 메소드 예제, 제네릭 메소드 static

java

제네릭 메소드란?

제네릭 메소드는 메소드의 선언 부에 적은 제네릭으로 리턴 타입과 파라미터의 타입을 정하는 메소드입니다.
제네릭메소드의 예제 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
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

먼저, 결론적으로는 아래와 같이 사용하면 됩니다.

1
2
3
4
5
6
7
8
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에서 오류를 발생시킵니다.

1
2
3
4
5
6
7
8
public class Test<T, S extends T> {
public static T name(S param) {
if(param instanceof String) {
return param;
}
return null;
}
}

오류내용

1
2
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으로 사용이 가능합니다.

1
2
3
4
5
6
7
8
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뒤에가 붙지 않음)

1
2
3
4
5
6
7
8
public class Test {
public static <T, S extends T> T name(S param) {
if(param instanceof String) {
return param;
}
return null;
}
}

제네릭 메소드 사용예제

1
2
3
4
5
6
7
8
9
10
11
12
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);
}
}
1
2
3
4
5
6
static <T> void ArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
c.add(o);
}
}