ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 제네릭(generic) - 제네릭 메소드
    CSE/Java 2015. 9. 20. 10:42


    제네릭은 여러 절로 구성되어 있습니다.


    Intro

    제네릭 타입

    멀티 타입 파라미터

    제네릭 메소드

    제한된 타입 파라미터 & 와일드카드 타입

    제네릭 타입의 상속과 구현





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

     제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말합니다.


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



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




     다음 boxing() 제네릭 메소드는 <> 기호 안에 타입 파라미터 T를 기술한 뒤, 매개 변수 타입을 명시적으로 지정해도 되고, 컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 할 수도 있습니다.




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




     제네릭 메소드는 두 가지 방식으로 호출할 수 있습니다. 


     코드에서 타입 파라미터의 구체적인 타입을 명시적으로 지정해도 되고, 컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 할 수 있습니다.



    1
    2
    리턴타입 변수 = <구체적타입> 메소드명(매개 값);
    리턴타입 변수 = 메소드명(매개값);
    cs




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



    1
    2
    3
    Box<Integer> box = <Integer> boxing(100);
    Box<Integer> box = boxing(100);
     
    cs





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



     * Util.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    package generic;
     
    public class Util {
        public static <T> Box<T> boxing(T t)
     
        {
            Box<T> box = new Box<T>();
     
            box.set(t);
     
            return box;
        }
    }
     
    cs





     * BoxingMethodExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package generic;
     
    public class BoxingMethodExam {
        Box<Integer> box1 = Util.<Integer> boxing(100);
        int intValue = box1.get();
     
        Box<String> box2 = Util.<String> boxing("ABC");
        String strValue = box2.get();
    }
     
    cs




     


     다음 예제는 Util 클래스에 정적 제네릭 메소드로 compare()를 정의하고 CompareMethodExam 클래스를 호출했습니다.


     타입 파라미터는 K와 V로 선언되었는데, 제네릭 타입 Pair가 K와 V를 가지고 있기 때문입니다.


     compare() 메소드는 두 개의 Pair를 매개값으로 받아 K와 V 값이 동일한지 검사하고 boolean 값을 리턴합니다.










      * Util.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    package generic;
     
    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;
        }
    }
     
    cs





     * Pair.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    package generic;
     
    public class Pair<K, V> {
        private K key;
        private V value;
     
        public Pair(K key, V value) {
            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;
        }
     
    }
     
    cs





     * CompareMethodExam.java



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    package generic;
     
    public class CompareMethodExam {
     
        public static void main(String[] args) {
            Pair<Integer, String> p1 = new Pair<>(1"사과");
            Pair<Integer, String> p2 = new Pair<>(1"사과");
     
            boolean result = Util.<Integer, String> compare(p1, p2);
     
            if (result) {
                System.out.println("논리적으로 동등한 객체입니다.");
            } else {
                System.out.println("논리적으로 동등하지 않은 객체입니다.");
            }
     
            Pair<StringString> p3 = new Pair<>("user1""Jarc");
            Pair<StringString> p4 = new Pair<>("user2""Jarc");
     
            boolean result2 = Util.compare(p3, p4);
     
            if (result2) {
                System.out.println("논리적으로 동등한 객체입니다.");
            } else {
                System.out.println("논리적으로 동등하지 않은 객체입니다.");
            }
        }
     
    }
     
    cs











     * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.

    댓글

Designed by Tistory.