3-3(2) Generic 메서드 선언

zhyun·2020년 9월 17일
0

HighJava

목록 보기
13/67
post-custom-banner

Generic 메서드 선언 방법

  • 메서드에만 적용
  • 제너릭 메서드<T,R>R method(T t)
  • 파라미터 타입과 리턴타입으로 타입 파라미터를 가지는 메서드
  • 선언 방법 : 리턴타입 앞에 <> 기호를 추가하고 타입 파라미터를 기술 후 사용함.

일반클래스에서 'Generic 메서드' 만들기

class Util{//일반클래스지만 '제너릭메서드'만들기
	public static <K,V> boolean compare(Pair<K, V> p1, Pair<K, V> p2){
		//리턴타입 (boolean)앞에 <>
		//아직 제너릭 타입은 모르는 상태 <K,V> -> 사용할 시점에 정해주면 된다
		boolean keyCompare = p1.getKey().equals(p2.getKey());
        	//p1의 key값과 p2의 key값을 비교
        
		boolean valueCompare = p1.getValue().equals(p2.getValue());
		//p1의 value값과 p1의 value값을 비교
        
		return keyCompare&& valueCompare; // key와 value가 동시에 true면 true
	}
}
  • 멀티타입<K,V>을 가지는 제너릭 클래스
  • 키와 값 출력하는 제너릭 메서드 포함
/**
 * 멀티타입<K,V>을 가지는 제너릭 클래스
 * @param <K>
 * @param <V>
 */
class Pair<K,V> {
	private K key;
	private V value;
	
	public Pair(K key, V value) {
		super();
		this.key = key;
		this.value = value;
	}

	public K getKey() {
		return key;
	}

	public void setKey(K key) {
		this.key = key;
	}

	public V getValue() {
		return value;
	}

	public void setValue(V value) {
		this.value = value;
	}
	
	//키와 값 출력하는 제너릭 메서드 
	public <K, V> void displayAll(K key, V value) { 
    	// 위에 선언된 private K,V와 다른 K,V
		System.out.println(key.toString()+":"+value);
	}
}
  • Pair<K,V> 멀티타입 => 구체적 타입 지정
public class T03_GenericMethodTest {
	public static void main(String[] args) {
	Pair<Integer, String> p1 = new Pair<Integer, String>(1, "홍길동");
	Pair<Integer, String> p2 = new Pair<Integer, String>(1, "홍길동");

	//구체적 타입을 명시적으로 지정(생략가능)
//	boolean result1 = Util.<Integer, String>compare(p1,p2);    
	boolean result1 = Util.compare(p1, p2);
	System.out.println(result1); //true
	
    //논리적(의미)으로 동일한 객체임 출력
	if(result1) {
		System.out.println("논리적(의미)으로 동일한 객체임");
	}else {
		System.out.println("논리적(의미)으로 동일한 객체 아님.");
	}
	System.out.println("-----------------------------------------------");
	
    Pair<String, String> p3 = new Pair<String, String>("001","홍길동");
	Pair<String, String> p4 = new Pair<String, String>("002","홍길동");

	boolean result2 = Util.compare(p3, p4);
    	System.out.println(result2); // false

	if(result2) {
		System.out.println("논리적(의미)으로 동일한 객체임");
	}else {
		System.out.println("논리적(의미)으로 동일한 객체 아님.");
	}
	System.out.println("-----------------------------------------------");

	// 제너릭 메서드 호출
    	p1.<String, Integer>displayAll("키값", 1234);
	p1.displayAll("키값", 1234); // <String, Integer>생략가능
	
	//p1은 <Integer, String> 지만 위에 일반 제너릭 메서드로 인하여
    	//String,value을 넣기가 가능하다.
	}
}
profile
HI :)
post-custom-banner

0개의 댓글