본문 바로가기

Java/문법

16 -3장 제네릭 메서드

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("안녕");
	}
}