JAVA

제네릭 와일드카드 타입

연93 2022. 10. 12. 12:53

코스 과정 클래스

//1) 과정이름과 수강생을 배열로 저장하는 구조
public class Course<T> {
	private String name; // 과정이름
	private T[] students; // 수강생 명단.  Person[] students
	
	public Course(String name, int capacity) {
		this.name = name;
		students = (T[])(new Object[capacity]); // Person[] (new Object[5])
	}
	
	public String getName() { return name;}
	public T[] getStudents() { return students;}  // Person[] getStudents()
	
	public void add(T t) {  // add(Person t)
		for(int i=0; i<students.length; i++) {
			if(students[i] == null) {
				students[i] = t;
				break;
			}
		}
	}
}

수강생 클래스

//2)
public class Person {
	private String name; // 수강생구분이름
	
	public Person(String name) {
		this.name = name;
	}
	
	public String getName() { return name; }
	public String toString() { return name;}
}

상속받은 클래스

public class Student extends Person {

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

}
public class Worker extends Person {

	public Worker(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
}
public class HighStudent extends Student {

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

}

실행클래스

import java.util.Arrays;

public class WildCardExample {

	// 과정에 등록한 과정명, 수강생명단출력
	// <?> 모든 클래스나 인터페이스가 사용이 가능하다. 4개 수강과정이 사용가능
	public static void registerCourse(Course<?> course) {
		System.out.println(course.getName() + " 수강생: " +
				Arrays.toString(course.getStudents()));
	}
	
	// <? extends Student> Student클래스 이거나 Student를 상속한 하위타입(자식클래스)
	public static void registerCourseStudent(Course<? extends Student> course) {
		System.out.println(course.getName() + " 수강생: " +
				Arrays.toString(course.getStudents()));
	}
	
	// <? super Worker> Worker클래스 이거나 Worker클래스를 자식클래스로 둔 상위클래스들.
	public static void registerCourseWorker(Course<? super Worker> course) {
		System.out.println(course.getName() + " 수강생: " +
				Arrays.toString(course.getStudents()));
	}
		
	public static void main(String[] args) {
		
		Course<Person> personCourse = new Course<Person>("일반인과정", 5);
		personCourse.add(new Person("일반인"));
		personCourse.add(new Worker("직장인"));
		personCourse.add(new Student("학생"));
		personCourse.add(new HighStudent("고등학생"));
		
		Course<Worker> workerCourse = new Course<Worker>("직장인과정", 5);
		workerCourse.add(new Worker("직장인"));
		
		Course<Student> studentCourse = new Course<Student>("학생과정", 5);
		studentCourse.add(new Student("학생"));
		studentCourse.add(new HighStudent("고등학생"));
		
		Course<HighStudent> highStudentCourse = new Course<HighStudent>("고등학생과정", 5);
		highStudentCourse.add(new HighStudent("고등학생"));
		
		//과정및수강생명단 등록과정.  
		// Course<?> course
		registerCourse(personCourse);
		registerCourse(workerCourse);
		registerCourse(studentCourse);
		registerCourse(highStudentCourse);
		System.out.println();
		
		// <? extends Student>
//		registerCourseStudent(personCourse); (X)
//		registerCourseStudent(workerCourse); (X)
		
		registerCourseStudent(studentCourse);
		registerCourseStudent(highStudentCourse);
		
		// <? super Worker>
		registerCourseWorker(personCourse);
		registerCourseWorker(workerCourse);
		
//		registerCourseWorker(studentCourse);  (X)
//		registerCourseWorker(highStudentCourse);  (X)
		
	}

}

'JAVA' 카테고리의 다른 글

람다식  (0) 2022.10.12
제네릭 타입의 상속과 구현  (0) 2022.10.12
제한된 타입 파라미터  (0) 2022.10.12
제네릭 메소드의 멀티 파라미터타입을 사용한 비교  (0) 2022.10.12
제네릭 메소드  (0) 2022.10.12