'타입변환(Casting)'은 상속개념을 바탕으로 하여 해당 계층의 클래스를 다른 계층의 클래스로 전환하기 위한 작업을 의미합니다.현 단계까지 학습하신 분들은 어디선가 익숙한 내용이실 겁니다. 저는 강제 형변환이 생각나는데 여러분은 어떠실지 잘 모르겠습니다.(●'◡'●)
class Human {}
class Doctor extends Human{}
class Student extends Human{}
먼저 항상 이루어질 수 있는 '업캐스팅'에 대해 설명드리겠습니다.위에서 언급드린것 처럼 학생과 의사는 모두 사람입니다. 이것이 업캐스팅이라고 할 수 있습니다.
반면에 '다운캐스팅'은 모든사람이 의사이거나 학생이어야 합니다.하지만 누군가는 학생일 수 있지만 누군가는 아닐 수도 있고 누군가는 의사이지만 누군가는 아닐 수도 있기 때문에 다운캐스팅은 항상 가능하지 않은 것이죠.
public class Human {
private String name;
private int age;
// 상속을 위한 생성자 작성
Human(String name, int age) {
this.name = name;
this.age = age;
}
// 상속을 확인하기 위한 메서드 작성
public void introduce() {
System.out.printf("%s의 나이는 %d세입니다.\n", name, age);
}
}
public class Doctor extends Human {
// 객체 생성을 위해서는 부모 클래스(Human)의 생성자필요
Doctor(String name, int age) {
super(name, age);
}
@Override // 어노테이션을 통해 오버라이딩 되었음을 주석으로 확인 및 문법 검사 진행
public void introduce() {
// Doctor 클래스 만의 내용을 가지고 있는 출력문 작성
System.out.printf("%s의 나이는 %d세이며 직업은 의사입니다.\n", getName(), getAge());
}
// 의사 클래스에서만 사용가능한 heal메서드 작성
public void heal() {
System.out.printf("%s가 환자를 치료합니다.\n", getName());
}
}
public class Student extends Human {
// 객체 생성을 위해서는 부모 클래스(Human)의 생성자필요
Student(String name, int age) {
super(name, age);
}
@Override // 어노테이션을 통해 오버라이딩 되었음을 주석으로 확인 및 문법 검사 진행
public void introduce() {
// Student 클래스에서만 출력가능한 문구 작성
System.out.printf("%s의 나이는 %d세이며 직업은 학생입니다.\n", getName(), getAge());
}
}
public class Velog {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String doc; // 의사의 이름을 입력받을 doc 변수 선언
int d_age; // 의사의 나이 입력받을 변수 d_age 선언
String stu; // 치료 가능여부 비교를 위한 학생의 이름을 입력받을 stu 변수 선언
int s_age; // 학생의 나이 입력 s_age 선언
System.out.print("의사 이름 입력 : ");
doc = sc.nextLine();
System.out.print("의사의 나이 입력 : ");
d_age = Integer.parseInt(sc.nextLine());
System.out.print("학생 이름 입력 : ");
stu = sc.nextLine();
System.out.print("학생의 나이 입력 : ");
s_age = Integer.parseInt(sc.nextLine());
Human doctor = new Doctor(doc, d_age); // 상속해준 의사 클래스를 객체로 선언
Human student = new Student(stu, s_age); // 상속해준 학생 클래스를 객체로 선언
doctor.introduce();
student.introduce();
// 다운 캐스팅 작동여부를 확인
doctor.heal();
sc.close();
}
}
<※ 결과는 다음과 같습니다.>