1. 제네릭 메서드의 정의와 호출
- 클래스 전체를 제네릭으로 선언하는 대신, 일반 클래스 내부의 특정 메서드만 제네릭으로 선언 가능
- 리턴타입 또는 입력매개변수의 타입을 제네릭 타입 변수로 선언
- 제네릭 메서드는 호출되는 시점에 실제 제네릭 타입 지정
cf> 제네릭 클래스는 객체를 생성하는 시점에 실제 제네릭 타입 지정
- 제네릭 메서드의 문법 구조
//제네릭 타입 변수명이 1개
접근 지정자 <T> T 메서드명(T t) {
//타입 T를 사용한 코드
}
//제네릭 타입 변수명이 2개
접근 지정자 <T,V> T 메서드명(T t, V v){
//타입 T,V를 사용한 코드
}
//매개변수에만 제네릭이 사용
접근 지정자 <T> void 메서드명(T t) {
//타입 T를 사용한 코드
}
//리턴 타입에만 제네릭이 사용
접근 지정자 <T> T 메서드명(int a) {
//타입 T를 사용한 코드
}
- 제네릭 메서드 호출의 문법 구조
-> 호출할 메서드명 앞에 <실제 제네릭 타입>을 삽입해 표현
참조 객체.<실제 제네릭 타입> 메서드명(입력매개변수);
-> 입력매개변수에 제네릭 타입 변수가 사용돼 입력매개변수의 타입만으로 실제 제네릭 타입을 예측할 수 있을 때 생략가능
public<T> method1(T t) {
return t;
}
ex) Integer타입을 대입해 메서드 호출
원칙 : 참조객체.<Integer>method1(100)
but, 100으로 제네릭 타입 변수 Integer 예측 가능
참조객체.method1(100)으로 표현 가능
- 일반 클래스의 내부에 포함되는 제네릭 메서드
-> 일반 클래스인 GenenricMethods는 3개의 제네릭 메서드를 갖고 있음
-> method1()은 호출할때 제네릭 타입을 String으로 지정
method2()은 호출할때 제네릭 타입을 Double로 지정
method3()은 호출할때 제네릭 타입을 String,Integer로 지정
package GenericMethod;
//일반 클래스 안에 제네릭 메서드
class GenericMethods {
public<T> T method1(T t) {
return t;
}
public<T> boolean method2(T t1, T t2) {
return t1.equals(t2);
}
public<K,V> void method3(K k, V v) {
System.out.println(k+":"+v);
}
}
public class GenericMethod {
public static void main(String[] args) {
GenericMethods gm = new GenericMethods();
String str1 = gm.<String>method1("안녕");
String str2 = gm.method1("HELLO");
System.out.println(str1);
System.out.println(str2);
boolean bool1 = gm.<Double>method2(2.5,2.5);
boolean bool2 = gm.method2(1.2, 1.2);
System.out.println(bool1);
System.out.println(bool2);
gm.<String,Integer>method3("국어",80);
gm.method3("수학",90);
}
}
2. 제네릭 메서드 내에서 사용할 수 있는 메서드
- 제네릭 메서드를 정의하는 시점에서는 아직 어떤 타입이 입력될지 알 수 없음
-> 특정 타입에 포함돼 있는 메서드(String 객체의 length()등)는 메서드를 정의하는 시점에 사용 불가
- 제네릭 메서드의 내부에서는 아직 확정되지 않은 제네릭 타입 객체의 멤버 중 Object에서 상속받은 메서드만 사용 가능
-> 나중에 어떤 타입이 제네릭 타입 변수로 확정되더라도 항상 사용할 수 있는 메서드만 제네릭 메서드 내부에서 사용 가능
- 제네릭 메서드 내부에서 사용할 수 있는 메서드
package GenericMethod;
class A{
public <T> void method(T t) {
//System.out.println(t.length()); //불가능 (String 메서드)
System.out.println(t.equals("안녕")); //가능 (Object 메서드)
}
}
public class GenericMethod {
public static void main(String[] args) {
A a = new A();
a.<String>method("안녕");
}
}
'Java > 문법' 카테고리의 다른 글
16 - 5장 제네릭의 상속 (0) | 2023.06.16 |
---|---|
16 - 4장 제네릭 타입 범위 제한 (0) | 2023.06.16 |
16 -2 장 제네릭의 문법 (0) | 2023.06.15 |
16 -1장 제네릭 클래스와 제네릭 인터페이스 (0) | 2023.06.15 |
15 - 5장 쓰레드의 상태 (0) | 2023.06.15 |