Link Search Menu Expand Document

Generic WildCard

Table of contents

  1. WildCard
  2. WildCard Basic
    1. Example

WildCard

WildCard Basic

제네릭 타입을 매개값이나 리턴타입으로 사용할 때 구체적인 타입대신 사용

▸ 코드에서 ?를 일반적으로 와일드 카드라고 함

▸ 자바의 제네릭에서는 물음표(?) 기호를 사용하여 이러한 와일드카드를 사용할 수 있음

syntax

<?> // 타입 변수에 모든 타입을 사용

<? extends 상위타입> // 상위타입과 상위타입을 상속받는 자손 클래스 타입만을 사용 (상위타입제한)

<? super 하위타입> // 하위타입과 하위타입이 상속받은 조상 클래스 타입만을 사용 (하위타입제한)

Example

Person

public class Person {

    // 이름 필드 설정
	private String name;
	
    // 생성자
	public Person(String name) {
		this.name = name;
	}

    // Getter Setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

    // toString()
	@Override
	public String toString() {
		return name;
	}

}

Worker, Student, HighStudent extends Person

//각각 객체를 생성하면 이름을 설정할 수 있게 함
public class Worker extends Person {

	public Worker(String name) {
		super(name);
	}
}

...
    
public class Student extends Person {

	public Student(String name) {
		super(name);
	}
}

...
    
public class HighStudent extends Student {

	public HighStudent(String name) {
		super(name);
	}
}

Course

public class Course<T> {

    //강좌에는 이름과 수강인원가 배열로 들어가있어야함
	private String name;
	private T[] students;
	
	public String getName() {
		return name;
	}

	public T[] getStudents() {
		return students;
	}

    // 생성자
	public Course(String name, int capacity) {
		this.name = name;
		this.students = (T[]) new Object[capacity]; // 수강인원
	}
	
	public void add(T t) {
		for(int i=0;i<students.length;i++) {
			if(students[i] == null) {
				students[i] = t;
				break;
			}
		}
	}
}

WildCardMain : 실행부

public class WildCardMain {

	// 수강생등록 메소드
	// 1. 모두 등록가능
	public static void registerCourse(Course<?> course) {
		System.out.println(course.getName() + " 수강생 : " + 
			Arrays.toString(course.getStudents())
		);
	}
	// 2. 학생만 등록가능
	public static void registerCourseStudent(Course<? extends Student> course)  {
		System.out.println(course.getName() + " 수강생 : " + 
			Arrays.toString(course.getStudents())
		);		
	}
	// 3. 직장인만 등록가능
	public static void regusterCourseWorker(Course<? super Worker> course) {
		System.out.println(course.getName() + " 수강생 : " + 
			Arrays.toString(course.getStudents())
		);		
		
	}
	
	public static void main(String[] args) {
		
		// 1. 모두 수강등록이 가능한 코스
        // 과정을 생성 후
		Course<Person> personCourse = new Course<>("일반인과정", 4);
		//하나하나 과정에 넣어줌
        personCourse.add(new Person("일반인"));
		personCourse.add(new Worker("직장인"));
		personCourse.add(new Student("학생"));
		personCourse.add(new HighStudent("고등학생"));
		
	    // 2. 학생만 수강등록이 가능한 코스
		Course<Student> studentCourse = new Course<>("학생과정", 4);
		studentCourse.add(new Student("학생"));
		studentCourse.add(new HighStudent("고등학생"));
	
		// 3. 고등학생만 수강등록이 가능한 코스
		Course<Student> highStudentCourse = new Course<>("고등학생과정", 4);
		highStudentCourse.add(new HighStudent("고등학생"));
		
		// 4. 직장인만 수강등록이 가능한 코스
		Course<Worker> workerCourse = new Course<>("직장인과정", 4);
		workerCourse.add(new Worker("직장인"));
		
		// a. 수강등록 :  registerCourse(Course<?> course)
        // 하나하나 넣은 과정의 수강생들을 출력
		registerCourse(personCourse);
		registerCourse(studentCourse);
		registerCourse(highStudentCourse);
		registerCourse(workerCourse);
		System.out.println();
		
		// b. 수강등록 :  registerCourseStudent(Course<? extends Student> course)
		// registerCourseStudent(personCourse); (X)
		// registerCourseStudent(workerCourse); (X)
		registerCourseStudent(studentCourse);
		registerCourseStudent(highStudentCourse);
		System.out.println();
		
		// c. 수강등록 :  regusterCourseWorker(Course<? super Worker> course)
		regusterCourseWorker(personCourse);
		regusterCourseWorker(workerCourse);
		// regusterCourseWorker(studentCourse); (x)
		// regusterCourseWorker(highStudentCourse); (x)
	}

}


이 웹사이트는 jekyll로 제작되었습니다. Patrick Marsceill, Distributed by an MIT license.