3-3(2) 와일드카드(2)

zhyun·2020년 9월 20일
0

HighJava

목록 보기
18/67
package kr.or.dit.basic;

import java.util.Arrays;

public class T07_WildCardTest {
	//main에서 접근할 메서드정리 (static)
	/**
	 * 모든 과정 등록
	 */
//	public static <T> void registorCourse(Course<?> course) { => 요것은 제너릭 메서드 형식
	public static void registorCourse(Course<?> course) { // <T> => 타입이 Person, Worker, Student, HighStudent타입중 <?>
		System.out.println(course.getName()+"수강생 :"+Arrays.toString(course.getStudents()));
	}
	/**
	 * 학생 과정 등록
	 * 파라미터에 올 수 있는 것이 제한되어있다. Student, (Student 상속 받은) HighStudent타입 올 수 있음.
	 */
//	public static <T extends Student>void registorCourseStudent(Course<T> course){
	public static void registorCourseStudent(Course<? extends Student> course) { 
		System.out.println(course.getName()+"수강생 :"+Arrays.toString(course.getStudents()));
	}
	/**
	 * 직장인 과정
	 * @param course
	 */
	public static void registerCourseWorker(Course<? super Worker> course) {// 하한 제한=> Worker와 부모(Person) Type까지 가능
		System.out.println(course.getName()+"수강생 :"+Arrays.toString(course.getStudents()));
	}
	
	public static void main(String[] args) {
		//일반인 과정
		Course<Person> personCourse = new Course<>("일반인 과정",5);
		personCourse.add(new Person("일반인1"));
		personCourse.add(new Worker("직장인1"));
		personCourse.add(new Student("학생1"));		
		personCourse.add(new HighStudent("고등학생1"));
		
		//직장인 과정
		Course<Worker> workerCourse = new Course("직장인과정", 5);
		workerCourse.add(new Worker("직장인1"));
		
		//학생 과정
		Course<Student> studentCourse = new Course("학생과정",5);
		studentCourse.add(new Student("학생1"));		
		studentCourse.add(new HighStudent("고등학생1"));
		
		Course<HighStudent> highstudentcourse = new Course<>("고등학생과정",5);
		highstudentcourse.add(new HighStudent("고등학생1"));
		
		//일반과정 (모두 다)
		registorCourse(personCourse);
		registorCourse(workerCourse);
		registorCourse(studentCourse);
		registorCourse(highstudentcourse);
		System.out.println("--------------------------------------------------");
		
		//학생 과정 (Student와 그 자손 Highstudent)
//		registorCourseStudent(personCourse); // 오류
//		registorCourseStudent(workerCourse); // 오류
		registorCourseStudent(studentCourse);
		registorCourseStudent(highstudentcourse);
		System.out.println("--------------------------------------------------");
		
		//직장인 과정 (Worker와 그 부모 Person)
		registerCourseWorker(personCourse);
		registerCourseWorker(workerCourse);
//		registerCourseWorker(studentCourse); //오류
//		registerCourseWorker(highstudentcourse); //오류
		System.out.println("--------------------------------------------------");
		
	}
}

//일반인
class Person{
	String name;//이름

	public Person(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}
}

//근로자
class Worker extends Person{

	public Worker(String name) {
		super(name);
	}
}
//학생
class Student extends Person{

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

//고등학생
class HighStudent extends Student{

	public HighStudent(String name) {
		super(name);
	}
	
}
//수강코스
class Course<T> {
	private String name;//코스명
	private T[] students;//수강생
	
	public Course(String name, int capacity) { //capacity : 용량
		this.name = name;
		
		//타입 파라미터로 배열을 생성시 오브젝트 배열을 생성 후, 타입파라미터 배열로 캐스팅 해야함.
		students =(T[])(new Object[capacity]);
	}

	//수강생 조회
	public T[] getStudents() {
		return students;
	}
	
	//코스명 조회
	public String getName() {
		return name;
	}
	
	//수강생 등록
	public void add(T t) {
		for(int i=0; i<students.length; i++) { // 아직 등록되지 않은 빈자리가 있는 경우
			if(students[i] == null) {
				students[i]=t;
				break;
			}
		}
	}
}
profile
HI :)

0개의 댓글