package inheritance;
//학원인적자원(학생,강사,직원) 관리 프로그램
public class AcademyApp {
public static void main(String[] args) {
/*
//학생정보를 저장하기 위한 요소들이 존재하는 배열 생성
//→ 배열 참조요소에 학생정보(AcademyStudent 객체)만 저장 가능
AcademyStudent[] students=new AcademyStudent[300];
//강사정보를 저장하기 위한 요소들이 존재하는 배열 생성
//→ 배열 참조요소에 강사정보(AcademyInstructor 객체)만 저장 가능
AcademyInstructor[] instructors=new AcademyInstructor[50];
//직원정보를 저장하기 위한 요소들이 존재하는 배열 생성
//→ 배열 참조요소에 직원정보(AcademyStaff 객체)만 저장 가능
AcademyStaff[] staffs=new AcademyStaff[100];
*/
//사람정보를 저장하기 위한 요소들이 존재하는 배열 생성
//→ 배열 참조요소에 학생정보,강사정보,직원정보 저장 가능
//→ 부모클래스의 참조변수에는 자식클래스의 생성자로 객체를 만들어 저장 가능
AcademyPerson[] persons=new AcademyPerson[5];
//자식클래스의 생성자로 객체를 생성하면 부모클래스의 객체 생성 후 자식클래스의 객체 생성
//→ 배열의 참조요소는 부모클래스의 객체가 저장되어 참조되므로 부모클래스의 메소드 호출
//→ 객체 형변환을 이용하면 배열의 참조요소로 자식클래스 객체를 참조하여
자식클래스의 메소드 호출 가능
persons[0]=new AcademyStudent(1000, "홍길동", "웹개발자 과정");
persons[1]=new AcademyInstructor(2000, "임꺽정", "Java 과목");
persons[2]=new AcademyStaff(3000, "전우치", "운영관리팀");
persons[3]=new AcademyStudent(4000, "일지매", "웹디자인 과정");
persons[4]=new AcademyStaff(5000, "장길산", "경영회계팀");
for(AcademyPerson person:persons) {
//오버라이드 선언되지 않은 자식클래스의 메소드를 호출하기 위해서는 명시적 객체
//형변환을 이용하여 참조변수에 자식클래스의 객체가 일시적으로 저장하여 호출
//문제점)상속관계가 아닌 클래스로 명시적 객체 형변환 할 경우
ClassCastException 발생
//해결법)참조변수로 객체 형변환 가능한 클래스를 확인한 후 명시적 객체
형변환하여 사용
// => instanceof 연산자 사용
//형식)참조변수 instanceof 클래스명
// => 참조변수로 참조 가능한 클래스를 확인하여 거짓(false) 또는
참(true)중 하나를 제공
if(person instanceof AcademyStudent) {
System.out.println(((AcademyStudent)person).getCourse()+ "의 학생정보 >> ");
} else if(person instanceof AcademyInstructor) {
System.out.println(((AcademyInstructor)person).getSubject()+ "의 강사정보 >> ");
} else if(person instanceof AcademyStaff) {
System.out.println(((AcademyStaff)person).getDepart()+ "의 직원정보 >> ");
}
//오버라이드 선언된 메소드는 묵시적 객체 형변환에 의해 부모클래스의 메소드를
//호출하지 않고 자식클래스의 메소드 호출
//→ 묵시적 객체 형변환으로 인해 참조변수에는 일시적으로 자식클래스의 객체가
//자동 저장되어 자식클래스의 메소드 호출
//참조변수에 저장된 자식클래스의 객체에 의해 자식클래스의 메소드가 선택되어 호출
//→ 오버라이드에 의한 다형성 : 객체 형변환에 의해 참조변수에 저장된 객체에 따라
//다른 클래스의 메소드를 선택 호출
person.display();
System.out.println("==================================================");
}
}
}
package inheritance;
//학생정보(학생번호,학생이름,수강과정)를 저장하기 위한 클래스
//→ 학생번호와 학생이름 관련 속성과 행위는 AcademyPerson 클래스를 상속받아 작성
public class AcademyStudent extends AcademyPerson {
private String course;
public AcademyStudent() {
// TODO Auto-generated constructor stub
}
public AcademyStudent(int num, String name, String course) {
super(num, name);
this.course = course;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
@Override
public void display() {
System.out.println("학생번호 = "+getNum());
System.out.println("학생이름 = "+getName());
System.out.println("수강과정 = "+course);
}
}
package inheritance;
//강사정보(강사번호,강사이름,강의과목)를 저장하기 위한 클래스
//→ 강사번호와 강사이름 관련 속성과 행위는 AcademyPerson 클래스를 상속받아 작성
public class AcademyInstructor extends AcademyPerson {
private String subject;
public AcademyInstructor() {
// TODO Auto-generated constructor stub
}
public AcademyInstructor(int num, String name, String subject) {
super(num, name);
this.subject = subject;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@Override
public void display() {
System.out.println("강사번호 = "+getNum());
System.out.println("강사이름 = "+getName());
System.out.println("강의과목 = "+subject);
}
}
package inheritance;
//직원정보(직원번호,직원이름,근무부서)를 저장하기 위한 클래스
//→ 직원번호와 직원이름 관련 속성과 행위는 AcademyPerson 클래스를 상속받아 작성
public class AcademyStaff extends AcademyPerson {
private String depart;
public AcademyStaff() {
// TODO Auto-generated constructor stub
}
public AcademyStaff(int num, String name, String depart) {
super(num, name);
this.depart = depart;
}
public String getDepart() {
return depart;
}
public void setDepart(String depart) {
this.depart = depart;
}
@Override
public void display() {
System.out.println("직원번호 = "+getNum());
System.out.println("직원이름 = "+getName());
System.out.println("근무부서 = "+depart);
}
}
package inheritance;
//사람정보(번호,이름)를 저장하기 위한 클래스
//→ 학생,강사,직원에 대한 공통적인 속성과 행위를 정의하기 위한 클래스
//→ 학원인적자원 관련 클래스가 상속받아야 되는 부모클래스
//→ 코드의 중복성을 최소화하여 프로그램의 생산성 및 유지보수의 효율성 증가
public class AcademyPerson {
private int num;
private String name;
public AcademyPerson() {
// TODO Auto-generated constructor stub
}
public AcademyPerson(int num, String name) {
super();
this.num = num;
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void display() {
System.out.println("번호 = "+num);
System.out.println("이름 = "+name);
}
}