상속, 오버라이딩, 변수 숨김
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;
}
}
코드는 상속과 메서드 오버라이딩, 변수 숨김(variable hiding)을 활용하고 있습니다. 각 부분을 분석해 보겠습니다.
코드 분석
Base 클래스:
인스턴스 변수 x = 3
메서드 getX(): x * 2를 반환 (Base의 x를 사용)
- Derivate 클래스 ( Base를 상속):
인스턴스 변수 x = 7 (Base의 x를 숨김)
메서드 getX(): x * 3을 반환 (Derivate의 x를 사용)
객체 생성
Base a = new Derivate();
a는 Derivate 객체이지만, Base 타입으로 참조됩니다.
Derivate b = new Derivate();
b는 Derivate 객체이며, Derivate 타입으로 참조됩니다.
출력 구문
System.out.print(a.getX() + a.x + b.getX() + b.x);
a.getX(): Derivate의 getX()가 호출됩니다. (x * 3 = 7 * 3 = 21)
a.x: Base 타입으로 참조되므로 Base의 x가 사용됩니다. (3)
b.getX(): Derivate의 getX()가 호출됩니다. (x * 3 = 7 * 3 = 21)
b.x: Derivate 타입으로 참조되므로 Derivate의 x가 사용됩니다. (7)
출력 계산
a.getX(): 21
a.x: 3
b.getX(): 21
b.x: 7
출력은 21 + 3 + 21 + 7로 계산되며, 결과는 52입니다.
결론
출력 결과는 52입니다. 이는 상속, 메서드 오버라이딩, 변수 숨김 등의 개념이 복합적으로 작용한 결과입니다.
변수 숨김(variable hiding)
a.x가 7이 아니라 3인 이유는 변수 숨김(variable hiding)과 참조 타입의 영향 때문입니다. 이를 자세히 설명하겠습니다.
변수 숨김(Variable Hiding)
Java에서 하위 클래스(Derivate)가 상위 클래스(Base)의 인스턴스 변수와 동일한 이름의 변수를 선언하면, 하위 클래스의 변수가 상위 클래스의 변수를 숨깁니다.
Base 클래스: int x = 3;
Derivate 클래스: int x = 7; → Derivate 클래스의 x는 Base 클래스의 x를 숨깁니다.
참조 타입의 영향
Java에서 변수는 참조 타입에 따라 결정됩니다.
Base a = new Derivate(); → a는 Derivate 객체이지만, Base 타입으로 참조됩니다. → 따라서 a.x는 Base 클래스의 x를 참조합니다. (x = 3)
Derivate b = new Derivate(); → b는 Derivate 타입으로 참조됩니다. → 따라서 b.x는 Derivate 클래스의 x를 참조합니다. (x = 7)
메서드 오버라이딩과의 차이
메서드 오버라이딩은 런타임에 객체의 실제 타입에 따라 결정됩니다.
a.getX()는 Derivate 클래스의 getX()가 호출됩니다. → Derivate의 getX()는 x * 3을 반환하며, 이때 x는 Derivate 클래스의 x를 사용합니다. (x = 7) → 따라서 a.getX()는 7 * 3 = 21을 반환합니다.
반면, 변수는 컴파일 타임에 참조 타입에 따라 결정됩니다.
a.x는 Base 타입으로 참조되므로, Base 클래스의 x를 사용합니다. (x = 3)
b.x는 Derivate 타입으로 참조되므로, Derivate 클래스의 x를 사용합니다. (x = 7)
요약
a.x가 3인 이유: → a는 Base 타입으로 참조되므로, Base 클래스의 x를 참조합니다. → 변수는 참조 타입에 따라 결정됩니다.
a.getX()가 21인 이유: → a는 Derivate 객체이므로, Derivate 클래스의 getX()가 호출됩니다. → 메서드는 런타임에 객체의 실제 타입에 따라 결정됩니다.
결론
a.x가 7이 아니라 3인 이유는 변수 숨김과 참조 타입의 영향 때문입니다. 변수는 참조 타입에 따라 결정되며, 메서드는 객체의 실제 타입에 따라 결정됩니다.