ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java | Generic (2) <?> & <T extends Class> & <? super Class>
    JAVA/JAVA 2020. 2. 10. 17:14

    < ? >

    메소드 매개변수의 자료형에 사용되는 제너릭

    • < ? extends Object > 의 줄임 표현
    • 어떤 자료형의 객체도 매개변수로 받겠다는 의미
    • Unbounded WildCard라고 알려져 있음

    예제

    3개의 List 컬렉션을 생성하고 하나의 정적 메소드로 각각의 값을 출력하는 프로그램 작성
    package j200210;
    
    import java.util.*;
    
    public class WildTest {
    
        public static void main(String[] args) {
            // List는 인터페이스이기 때문에 ArrayList 생성 후 Upcasting 이용
            List<String> list = new ArrayList();
            list.add("test1");
            list.add("test2");
            list.add("test3");
    
            // Integer 자료형 list2 객체 생성
            List<Integer> list2 = new ArrayList();
            list2.add(1);
            list2.add(2);
            list2.add(new Integer(3));
    
            // Double형 list3 생성
            List<Double> list3 = new ArrayList();
            list3.add(10.1);
            list3.add(11.2);
            list3.add(12.3);
    
            // static 메소드 호출
            printData(list);
            printData(list2);
            printData(list3);
    
            /*
            test1    test2    test3
            1        2        3
            10.1    11.2    12.3
            */
    
        }
    
        // 리스트 출력 메소드
        public static void printData(List<?> list) {
            for (Object v : list) {
                System.out.println(v);
            }
        }
    
        /*
         * public static void printData2(List<Integer> list) { for (Integer v : list) {
         * System.out.println(v); } }
         * 
         * public static void printData3(List<Double> list) { for (Double v : list) {
         * System.out.println(v); } }
         */
    
    }

    < T extends 클래스 >

    상속을 이용해서 T의 자료형을 제한함

    • 클래스 선언시 사용하며 인스턴스 생성시 특정 클래스를 상속받은 클래스형만
      인스턴스 내부에서 사용할 수 있도록 함
    • 특정 인터페이스를 구현한 클래스만 사용하려는 경우에도 사용 가능

    < ? extends 클래스 >

    매개변수의 자료형을 특정 클래스를 상속받은 클래스로만 제한함


    예제

    extends의 역할은 자료형의 제한으로 동일하기 때문에
    < ? extends 클래스 >의 예제만 다룸

    package j200210;
    
    import java.util.*;
    
    // Person 상속X 클래스
    class Test {
        String name;
    
    }
    
    // Person 클래스
    class Person {
        String name;
    
    }
    
    // Person 상속 Man 클래스
    class Man extends Person {
        // 생성자
        Man(String name) {
            this.name = name;
        }
    
        // name 반환 메소드
        public String toString() {
            return name.toString();
        }
    }
    
    // Person 상속 Woman 클래스
    class Woman extends Person {
        Woman(String name) {
            this.name = name;
        }
    
        public String toString() {
            return name.toString();
        }
    }
    
    public class WildExtends {
    
        public static void main(String[] args) {
    
            // Person
            List<Person> listP = new ArrayList<Person>();
            listP.add(new Person());
            printData(listP);        // j200210.Person@15db9742
    
            // Man
            List<Man> listM = new ArrayList<Man>();
            listM.add(new Man("이순신"));
            listM.add(new Man("하현우"));
            listM.add(new Man("박효신"));
            printData(listM);    // 이순신    하현우    박효신
    
            // Woman
            List<Woman> listW = new ArrayList<Woman>();
            listW.add(new Woman("유관순"));
            listW.add(new Woman("백예린"));
            listW.add(new Woman("박정현"));
            printData(listW);    // 유관순    백예린    박정현
    
            // Test
            List<Test> listT = new ArrayList<Test>();
            listT.add(new Test());
    //      printData(listT); → Person 클래스를 상속받지 않았기 때문에 메소드 호출 불가
    
        }
    
        // Person 클래스와 그 하위 클래스로 생성된 인스턴스만 매개변수로 전달 가능
        public static void printData(List<? extends Person> list) {
            for (Person obj : list) {
                System.out.println(obj);
            }
        }
    
    }

    < ? super 클래스 >

    매개변수의 자료형을 특정 클래스와 그 클래스의 상위 클래스로만 제한함

    ※ super는 T에 사용 불가


    예제

    위의 예제와 유사하며 extends 대신 super 사용

    package j200210.super2;
    
    import java.util.*;
    
    // Person 클래스
    class Person {
        String name;
    
        // 기본 생성자
        Person() {
        }
    	
        // 생성자 오버로딩
        Person(String name) {
            this.name = name;
        }
    
        public String toString() {
            return name;
        }
    }
    
    // Person 상속 Man 클래스
    class Man extends Person {
        // 위의 예제와 동일
    }
    
    // Person 상속 Woman 클래스
    class Woman extends Person {
        // 위의 예제와 동일
    }
    
    public class WildSuper {
    
        public static void main(String[] args) {
    
            // Person
            List<Person> listP = new ArrayList<Person>();
            listP.add(new Person("사람"));
            listP.add(new Person("인간"));
            printData(listP); // 사람 인간
    
            // Man
            List<Man> listM = new ArrayList<Man>();
            listM.add(new Man("하현우"));
            listM.add(new Man("박효신"));
            printData(listM); // 하현우 박효신
    
            // Woman
            List<Woman> listW = new ArrayList<Woman>();
            listW.add(new Woman("백예린"));
            listW.add(new Woman("박정현"));
    //      printData(listW); → Man 클래스의 상위 클래스가 아니기 때문에 메소드 호출 불가
    
        }
    
        // Man 클래스와 그 상위 클래스로 생성된 인스턴스만 매개변수로 전달 가능
        public static void printData(List<? super Man> list) {
            for (Object obj : list) {
                System.out.println(obj);
            }
        }
    
    }
    

    제너릭의 <?> 사용방법과 extends, super로 <T>와 <?>의 자료형을 제한하는 방법에 대해 알아보았습니다.

    <?>는 어떤 자료형도 매개변수로 받을 수 있기 때문에 와일드카드라고도 불리며
    필요한 경우에 extends와 super를 사용해서 자료형의 범위를 제한할 수 있습니다.

    <T>의 경우에는 extends는 사용가능하지만 super는 사용할 수 없다는 점을 기억해야겠습니다.

    'JAVA > JAVA' 카테고리의 다른 글

    Java | Thread (2) Thread 생성 & Multi Thread  (0) 2020.02.10
    Java | Thread (1) 개요  (0) 2020.02.10
    Java | Generic (1) <T>  (0) 2020.02.10
    Java | Iterator & Enumeration  (0) 2020.02.08
    Java | Map_HashMap  (0) 2020.02.08

    댓글

Designed by Tistory.