[Java10-2 AcademyApp] - 상속 관련

임승현·2022년 10월 16일

Java

목록 보기
34/126
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);
	}
}

0개의 댓글