// Person 클래스와 상속 받을 하위 클래스들 정의
class Person {
private String name; // 공통 인스턴스 ★★★
public Person(String name) {
this.name = name;
}
public String getDescription() { // 각 클래스에서 객체의 정보를 문자열로 반환하는 메서드
return "Name: " + name;
// 각 하위 클래스에서 '오버라이딩하여 해당 클래스의 정보를 반환하도록 구현'됨
}
}
class Student extends Person {
private String major; // 개인 인스턴스
public Student(String name, String major) {
super(name); // super(name)을 사용하는 이유 : 부모 클래스의 필드인 name을 초기화하기 위함
// Student 클래스의 생성자에서 name을 초기화하면서 부모 클래스인 Person의 생성자를 호출
// if) super(name)을 빼고 name을 초기화하지 않는다?
// --> name 필드는 null 또는 초기화되지 않은 상태로 남게 될 것이며,
// 이는 예상치 못한 동작을 초래할 수 있음
this.major = major;
}
@Override
public String getDescription() {
return super.getDescription() + ", Major: " + major;
}
}
class Police extends Person {
private String rank; // 개인 인스턴스
public Police(String name, String rank) {
super(name);
this.rank = rank;
}
@Override
public String getDescription() {
return super.getDescription() + ", Rank: " + rank;
}
}
class FireMan extends Person {
private String specialization; // 개인 인스턴스
public FireMan(String name, String specialization) {
super(name);
this.specialization = specialization;
}
@Override
public String getDescription() {
return super.getDescription() + ", Specialization: " + specialization;
}
}
// Person 클래스를 상속받은 하위 클래스 객체들을 저장할 배열 생성
public class Serve_array_1 {
public static void main(String[] args) {
Person[] people = {
new Student("Alice", "Computer Science"),
new Police ("Bob", "Officer"),
new FireMan("Charlie", "Firefighter"),
new Student("David", "Mathematics"),
new FireMan("Eve", "Firefighter")
};
// 배열 요소를 반복문으로 처리
for (Person p : people) {
System.out.println(p.getDescription());
}
// person.getDescription : 문법적으로는 Person class의 것을 가져오는게 맞는데,
// 오버라이딩했으니까~~~ 각 클래스마다 오버라이딩한 getDescription을 불러오겠지!!!!
}
}
'JAVA > DAY 15 _ 23.09.06' 카테고리의 다른 글
Overiding (0) | 2023.09.13 |
---|---|
상속_array활용3 (0) | 2023.09.13 |
상속_array활용 (0) | 2023.09.12 |
Object class (0) | 2023.09.12 |
TypeCasting (0) | 2023.09.12 |