java/inheritance

[inheritance] 6. 학원인적자원관리 ERP프로그램 (AcademyApp)

jeri 2024. 4. 23. 16:47
반응형

 

 

(부모) inheritance > AcademyPerson.java
package inheritance;

//사람정보(번호, 이름)를 저장하기 위한 클래스 - VO클래스
//=> 학생, 강사, 직원에 대한 공통적인 속성과 행위를 정의하기 위한 클래스
//=> 학원인적자원 관련 클래스가 상속받아야 되는 클래스
//=> 코드의 중복성을 최소화하여 프로그램의 생산성 및 유지보수의 효율성 증가
public class AcademyPerson {

	//필드
	private int num;
	private String name;

	//생성자
	public AcademyPerson() {	}
	public AcademyPerson(int num, String name) {
		//super(); //생략가능
		this.num = num;
		this.name = name;
	}

	//Getter&Setter메소드
	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;}

	//display메소드
	public void display() {
		System.out.println("번호 = " + num);
		System.out.println("이름 = " + name);
	}

}

 

 

(자식1) inheritance > AcademyStudent.java
package inheritance;

//학생정보(학생번호,학생이름,수강과정)를 저장하기 위한 클래스
// => 학생번호와 학생이름 관련 속성과 행위는 AcademyPerson 클래스를 상속받아 작성
public class AcademyStudent extends AcademyPerson {

	//필드
  	private String course;

	//생성자
	public AcademyStudent() {}
	public AcademyStudent(int num, String name, String course) {
		super(num, name);
		this.course = course;
	}

  	//Getter&Setter메소드
	public String getCourse() {return course;}
	public void setCourse(String course) {this.course = course;}

	//오버라이드된 display메소드
	@Override
	public void display() {
		System.out.println("학생번호 = " +getNum());
		System.out.println("학생이름 = " +getName());
		System.out.println("수강과정 = " +course);
		//이 메소드를 호출하면 부모 메소드가 호출되므로 오버라이드 선언함
		//super.display();
	}

 

 

(자식2) inheritance > AcademyStaff.java
package inheritance;

//직원정보(직원번호,직원이름,근무부서)를 저장하기 위한 클래스
// => 직원번호와 직원이름 관련 속성과 행위는 AcademyPerson 클래스를 상속받아 작성
public class AcademyStaff extends AcademyPerson {

	//필드
	private String depart;

	//생성자
	public AcademyStaff() {	}
	public AcademyStaff(int num, String name, String depart) {
		super(num, name);
		this.depart = depart;
	}

	//Getter&Setter메소드
	public String getDepart() {return depart;}
	public void setDepart(String depart) {this.depart = depart;}

    //오버라이드된 display메소드
	@Override
	public void display() {
		System.out.println("직원번호 = " +getNum());
		System.out.println("직원이름 = " +getName());
		System.out.println("근무부서 = " +depart);
	}

 

 

(자식3) inheritance > AcademyInstructor.java
package inheritance;

//강사정보(강사번호,강사이름,강의과목)를 저장하기 위한 클래스
// => 강사번호와 강사이름 관련 속성과 행위는 AcademyPerson 클래스를 상속받아 작성
public class AcademyInstructor extends AcademyPerson {

	//필드
	private String subject;

	//생성자
	public AcademyInstructor() {	}
	public AcademyInstructor(int num, String name, String subject) {
		super(num, name);
		this.subject = subject;
	}

	//Getter&Setter메소드
	public String getSubject() {return subject;}
	public void setSubject(String subject) {this.subject = subject;}

	//오버라이드된 display메소드
	@Override
	public void display() {
		System.out.println("강사번호 = " +getNum());
		System.out.println("강사이름 = " +getName());
		System.out.println("강의과목 = " +subject);
	}

}

 

 

(프로그램) inheritance > AcademyApp.java
package inheritance;

//학원인적자원(학생,강사,직원) 관리 프로그램
public class AcademyApp {
	public static void main(String[] args) {

		//🧸[문제점] 개선이 필요한 객체생성방법 - 각각 따로 생성
		/*
		//1.
    	//학생정보를 저장하기 위한 요소들이 존재하는 배열 생성
		// => 배열 참조요소에 학생정보(AcademyStudent 객체)만 저장 가능
		AcademyStudent[] students=new AcademyStudent[300];

		//2.
    	//강사정보를 저장하기 위한 요소들이 존재하는 배열 생성
		// => 배열 참조요소에 강사정보(AcademyInstructor 객체)만 저장 가능
		AcademyInstructor[] instructors=new AcademyInstructor[50];

		//3.
    	//직원정보를 저장하기 위한 요소들이 존재하는 배열 생성
		// => 배열 참조요소에 직원정보(AcademyStaff 객체)만 저장 가능
		AcademyStaff[] staffs=new AcademyStaff[100];
		*/

		//🧸[해결책] 개선한 객체생성방법 - 배열 객체로 해결

		//사람정보를 저장하기 위한 요소들이 존재하는 배열 생성
		// => 배열 참조요소에 학생정보,강사정보,직원정보 저장 가능
		// => 부모클래스의 참조변수에는 자식클래스의 생성자로 객체를 만들어 저장 가능
    	// => [heap에 생성된 배열참조요소 5개] : null
  		// => 학생정보(AcademyStudent), 강사정보(AcademyInstructor), 직원정보(AcademyStaff 저장할 것
		AcademyPerson[] persons=new AcademyPerson[5];

		//[자식클래스의 생성자]로 객체를 생성하면 [부모클래스의 객체 생성] 후 [자식클래스의 객체] 생성
		// => 배열의 참조요소(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문 - 일괄처리
		for(AcademyPerson person:persons) {
			//오버라이드 선언되지 않은 자식클래스의 메소드를 호출하기 위해서는 명시적 객체 형변환을 이용하여 참조변수에 자식클래스의 객체가 일시적으로 저장하여 호출            
			// => 🎭문제점) 상속관계가 아닌 클래스로 명시적 객체 형변환 할 경우 lassCastException 발생
			// => 🎭해결법) 참조변수로 객체 형변환 가능한 클래스를 확인한 후 명시적 객체 형변환하여 사용 - [🎭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("==================================");
		}

    	//웹개발자 과정의 학생정보 >>
		//학생번호 = 1000
		//학생이름 = 홍길동
		//수강과정 = 웹개발자 과정
		//============================
		//자바 과목의 강사정보 >>
		//강사번호 = 2000
		//강사이름 = 임꺽정
		//강의과목 = 자바 과목
		//============================
		//운영관리팀의 강사정보 >>
		//직원번호 = 3000
		//직원이름 = 전우치
		//근무부서 = 운영관리팀
		//============================
		//웹디자인과정의 학생정보 >>
		//학생번호 = 4000
		//학생이름 = 을지매
		//수강과정 = 웹디자인과정
		//============================
		//경영회계팀의 강사정보 >>
		//직원번호 = 5000
		//직원이름 = 장길산
		//근무부서 = 경영회계팀
		//============================

	}
}
반응형