반응형
(부모) 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
//직원이름 = 장길산
//근무부서 = 경영회계팀
//============================
}
}
반응형
'java > inheritance' 카테고리의 다른 글
[inheritance] 8. 제한자 (abstract, final, static) (0) | 2024.04.24 |
---|---|
[inheritance] 7. object 클래스 (0) | 2024.04.23 |
[inheritance] 5. 메소드 오버라이드(Method override) (0) | 2024.04.22 |
[inheritance] 4. super키워드의 개념 (0) | 2024.04.21 |
[inheritance] 3. 참조변수와 객체와의 관계 (0) | 2024.04.21 |