선생님, 계속되는 상속 질문입니다.
11.18 Given the following code, find the compile error?
```
public class Test {
public static void main(String[] args) {
m(new GraduateStudent());
m(new Student());
m(new Person());
m(new Object());
}
public static void m(Student x) {
System.out.println(x.toString());
}
}
class GraduateStudent extends Student {
}
class Student extends Person {
public String toString() {
return "Student";
}
}
class Person extends Object {
public String toString() {
return "Person";
}
}
```
A. m(new GraduateStudent()) causes an error
B. m(new Student()) causes an error
**C. m(new Person()) causes an error
**D. m(new Object()) causes an error**
답은 C,D 라는 데요.
GraduateStudent -> Student -> Person -> Object 순으로 상속을 하는데 왜 오류가 생성되는 지를 모르겠습니다. ;;
sehongpark님의 답변
# 타입 캐스팅
## 요약
학생은 사람입니다. 그러나 사람이라고해서 반드시 학생인 것은 아닙니다.
## 설명
메인메소드를 보면 m() 메소드에 입력값을 졸업생, 학생, 개인, 객체 순으로 입력하고 있습니다.
```
public static void main(String[] args) {
m(new GraduateStudent());
m(new Student());
m(new Person());
m(new Object());
}
```
이렇게 입력값으로 전달된 객체들은 m()메소드의 파라미터로 대입이 됩니다. 예를들면 아래와 같이 말이죠.
```
Student x = new GraduateStudent(); // 1
Student x = new Student(); // 2
Student x = new Person(); // 3
Student x = new Object(); // 4
```
그런데 위코드는 3, 4번 라인에서 문제가 생깁니다. 왜냐하면 Person 객체와 Object 객체를 Student 타입으로 대입하고 있기 때문입니다. 학생은 사람입니다. 그러나 사람이라고 해서 반드시 학생인 것은 아닙니다. 클래스의 상속관계에서 자식클래스는 조상 클래스의 타입으로 캐스팅이 가능하지만, 역은 성립하지 않습니다.