문제 11번. 출력 결과
public class Main{
public static void main(String[] args){
Base a = new Derivate();
Derivate b = new Derivate();
System.out.print(a.getX() + a.x + b.getX() + b.x);
}
}
class Base{
int x = 3;
int getX(){
return x * 2;
}
}
class Derivate extends Base{
int x = 7;
int getX(){
return x * 3;
}
}
더보기
더보기
[ 답 ]
52
[ 풀이 ]
System.out.print(a.getX() + a.x + b.getX() + b.x);
이 부분을 하나씩 살펴보면
a.getX()
- a의 실제 타입은 Derivate → 오버라이딩된 Derivate.getX() 호출됨
- Derivate.getX()는 return x * 3;
- 근데 여기서 x는 Derivate 클래스의 필드 (int x = 7)
- 따라서: 7 * 3 = 21
a.x
- a의 컴파일 타입은 Base
- 필드는 오버라이딩되지 않음 (오버라이딩은 메서드에만 적용됨)
- 따라서 Base의 x 필드를 참조 → 3
b.getX()
- b는 Derivate 타입 → Derivate.getX() 호출됨
- x = 7, 결과는 7 * 3 = 21
b.x
- b는 Derivate 타입 → Derivate의 x는 7
요약
Base a = new Derivate(); | 업캐스팅 (타입은 Base, 객체는 Derivate) |
getX() | 오버라이딩 → 실제 객체 기준 실행 |
x 필드 | 오버라이딩 되지 않음 → 참조 변수 타입 기준으로 결정 |
a.x | Base의 x 참조 (=3) |
b.x | Derivate의 x 참조 (=7) |
반응형