본문 바로가기
Java/Generic

제네릭 메소드

by Backchus 2020. 7. 2.

제네릭 메소드(<T, R> R method(T t))

제네릭 메소드는 매개 타입과 리턴타입으로 타입 파라미터를 갖는 메소드를 말한다. 제네릭 메소드를 선언하는 방법은 리턴 타입 앞에 <> 기호를 추가하고 타입 파라미터를 기술한 다음, 리턴 타입과 매개 타입으로 타입 파라미터를 사용하면 된다.

public <타입파라미터, ...> 리턴타입 메소드명(매개변수, ...) { ... }

다음 boxing() 제네릭 메소드는 <> 기호 안에 타입 파라미터 T를 기술한 뒤, 매개 변수 타입으로 T를 사용했고, 리턴 타입으로 제네릭 타입 Box를 사용했다.

public <T> Box<T> boxing(T t) { ... }

제네릭 메소드는 두 가지 방식으로 호출할 수 있다. 코드에서 타입 파라미터의 구체적인 타입을 명시적으로 지정해도 되고, 컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 할 수 도 있다.

리턴타입 변수 = <구체적타입> 메소드명(매개값);  // 명시적으로 구체적 타입을 지정
리턴타입 변수 = 메소드명(매개값);               // 매개값을 보고 구체적 타입을 추정

다음 코드는 boxing() 메소드를 호출하는 코드이다.

Box<Integer> box = <Integer>boxing(100);        // 타입 파라미터를 명시적으로 Integer로 지정
Box<Integer> box = boxing(100);                 // 타입 파라미터를 Integer로 추정

다음 예제는 Util 클래스에 정적 제네릭 메소드로 boxing()을 정의하고 BoxingMethodExample 클래스에서 호출했다.

public class Util {
    public static <T> Box<T> boxing(T t) {
        Box<T> box = new Box<T>();
        box.set(t);
        return box;
    }
}
public class BoxingMethodExample {
    public static void main(String[] args) {
        Box<Integer> box1 = Util.<Integer>boxing(100);
        int intValue = box1.get();

        Box<String> box2 = Util.boxing("홍길동");
        String strValue = box2.get();
    }
}

다음 예제는 Util 클래스에 정적 메소드로 compare()를 정의하고 CompareMethodExample 클래스에서 호출했다. 타입 파라미터는 K와 V로 선언되었는데, 제네릭 타입 Pair가 K와 V를 가지고있기 때문이다. compare() 메소드는 두 개의 Pair를 매개값으로 받아 K와 V 값이 동일한지 검사하고 boolean 값을 리턴한다.

public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        boolean keyCompare = p1.getKey().equals(p2.getKey());
        boolean valueCompare = p1.getValue.equals(p2.getValue());
        return keyCompare && valueCompare;
    }
}
public class Pair<K, V> {
    private K key;
    private V value;

    public Pair (K key, V value) {
        this.key = key;
        this.value = value;
    }

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

    public void setValue(V value) {
        this.value = value;
    }

    public K getKey() {
        return key;
    }

    public V getValue() {
        return value;
    }
}
public class CompareMethodExample {
    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);
        if(result1) {
            System.out.println("논리적으로 동등한 객체입니다.");
        } else {
            System.out.println("논리적으로 동등하지 않은 객체입니다.");
        }

        Pair<String, String> p3 = new Pair<String, String>("user1", "홍길동");
        Pair<String, String> p4 = new Pair<String, String>("user2", "홍길동");
        boolean result2 = Util.compare(p3, p4);
        if(result2) {
            System.out.println("논리적으로 동등한 객체입니다.")
        } else {
            System.out.println("논리적으로 동등하지 않는 객체입니다.");
        }
    }
}
논리적으로 동등한 객체입니다.
논리적으로 동등하지 않는 객체입니다.

참고 서적: 이것이 자바다(신용권 저)

'Java > Generic' 카테고리의 다른 글

제네릭 타입의 상속과 구현  (0) 2020.07.02
와일드카드 타입  (0) 2020.07.02
제한된 타입 파라미터  (0) 2020.07.02
제네릭 타입  (0) 2020.07.02