코스 과정 클래스
//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 |