본문 바로가기

라이브러리 활용 - 제네릭

와일드카드 타입 파라미터

와일드카드 타입 파라미터

  • 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 범위에 있는 모든 타입으로 대체할 수 있는 타입 파라미터. ?로 표시


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch13.sec05;

//일반인
public class Person {

}

//직장인
class Worker extends Person {

}

//학생
class Student extends Person {

}

//고등학생
class HighStudent extends Student {

}

//중학생
class MiddleStudent extends Student {

}

package ch13.sec05;

//수강생, 응모자

public class Applicant<T> {
    public T kind;

    public Applicant(T kind) {
        this.kind = kind;
    }
}

package ch13.sec05;

//학원의 과정

public class Course {

    //모든 사람이면 등록 가능.
    public static void registerCourse1(Applicant<?> applicant) {
        System.out.println(applicant.kind.getClass().getSimpleName() +
                "이(가) course1을 등록함");
    }

    //학생만 등록 가능
    public static void registerCourse2(Applicant<? extends Student> applicant) {
        System.out.println(applicant.kind.getClass().getSimpleName() +
                "이(가) course2를 등록함");
    }

    //직장인 및 일반인만 등록 가능
    public static void registerCourse3(Applicant<? super Worker> applicant) {
        System.out.println(applicant.kind.getClass().getSimpleName() +
                "이(가) course3을 등록함");
    }
}

package ch13.sec05;

//수강 신청 프로그램.

public class GenericExample {

    public static void main(String[] args) {
        //모든 사람이 신청 가능 -> registerCourse1(Applicant<?> applicant)을 참조함
        Course.registerCourse1(new Applicant<Person>(new Person())); //일반인
        Course.registerCourse1(new Applicant<Worker>(new Worker())); //직장인
        Course.registerCourse1(new Applicant<Student>(new Student())); //학생
        Course.registerCourse1(new Applicant<HighStudent>(new HighStudent())); //고등학생
        Course.registerCourse1(new Applicant<MiddleStudent>(new MiddleStudent())); //중학생
        System.out.println();

        //학생만 신청 가능 -> registerCourse2(Applicant<? extends Student> applicant)을 참조함
//        Course.registerCourse2(new Applicant<Person>(new Person())); 
//        Course.registerCourse2(new Applicant<Worker>(new Worker()));
        Course.registerCourse2(new Applicant<Student>(new Student()));
        Course.registerCourse2(new Applicant<HighStudent>(new HighStudent()));
        Course.registerCourse2(new Applicant<MiddleStudent>(new MiddleStudent()));
        System.out.println();

        //직장인 및 일반인만 신청 가능 -> registerCourse3(Applicant<? super Worker> applicant)을 참조함
        Course.registerCourse3(new Applicant<Person>(new Person()));
        Course.registerCourse3(new Applicant<Worker>(new Worker()));
//        Course.registerCourse3(new Applicant<Student>(new Student()));
//        Course.registerCourse3(new Applicant<HighStudent>(new HighStudent()));
//        Course.registerCourse3(new Applicant<MiddleStudent>(new MiddleStudent()));
    }
}

'라이브러리 활용 - 제네릭' 카테고리의 다른 글

제한된 타입 파라미터  (0) 2023.02.02
제네릭 메소드  (0) 2023.02.02
제네릭 타입  (0) 2023.02.02
제네릭이란?  (0) 2023.02.02