멤버변수는 인스턴스변수와 static변수를 모두 통칭하는 말이다.
조상 클래스에 선언된 멤버변수와 같은 이름의 인스턴스변수를 자손 클래스에 중복으로 정의 했을때,
조상타입의 참조변수로 자손 인스턴스를 참조하는 경우와 자손타입의 참조변수로 자손 인스턴스를 참조하는 경우는 서로 다른 결과를 얻는다.
Parent p = new Child();
Child c = new Child();
조상 클래스의 메서드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 타입에
관계없이 항상 실제(자식) 인스턴스의 메서드가 호출되지만, 멤버변수의 경우 참조변수의
타입에 따라 달라진다.
조상타입의 참조변수를 사용했을 때는 조상 클래스에 선언된 멤버변수가 사용되고,
자손타입의 참조변수를 사용했을 때는 자손 클래스에 선언된 멤버변수가 사용 된다.
차이는 없다.
중복된 경우는 참조변수의 타입에 따라 달라지지만, 중복되지 않은 경우
하나뿐이므로 선택의 여지가 없기 때문이다.
메서드 method( ) 인 경우 참조변수의 타입에 관계없이
항상 실제 인스턴스의 타입인 Child클래스(자식)에 정의된 메서드가 호출되지만,
인스턴스변수인 x는 참조변수의 타입에 따라서 달라진다.
package test;
class Parent {
int x = 100;
void method() {
System.out.println("Parent Method");
}
}
class Child extends Parent {
int x = 200;
void method() {
System.out.println("Child Method");
}
}
class Test1 {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("P.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
}
}
출력값.
P.x = 100
Child Method
c.x = 200
Child Method
선택의 여지가 없기 때문이다.
참조변수의 타입에 따라 결과가 달라지는 경우는 조상 클래스의 멤버변수와 같은 이름의
멤버변수로 자손 클래스에 중복해서 정의한 경우뿐이다.
package test;
class Parent {
int x = 100;
void method() {
System.out.println("Parent Method");
}
}
class Child extends Parent { }
class Test1 {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("P.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
}
}
출력값.
P.x = 100
Parent Method
c.x = 100
Parent Method
상속받은 인스턴스변수 x를 구분하는데 참조변수 super와 this가 사용된다.
private으로 접근을 제한하고, 외부에서는 메서드를 통해서만 멤버변수에 접근할 수 있도록 하지,
다른 외부 클래스에서 참조변수를 통해 직접적으로 인스턴스변수에 접근할 수 있게 하지 않는다.
인스턴스변수에 직접 접근하면, 참조변수의 타입에 따라 사용되는 인스턴스변수가 달라질 수 있으므로 주의해야 한다.
package test;
class Parent {
int x = 100;
void method() {
System.out.println("Parent Method");
}
}
class Child extends Parent {
int x = 200;
void method() {
System.out.println("x=" + x); // this.x와 같다.
System.out.println("super.x" + super.x);
System.out.println("this.x=" + this.x);
}
}
class Test1 {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("P.x = " + p.x);
p.method();
System.out.println();
System.out.println("c.x = " + c.x);
c.method();
}
}
출력값.
P.x = 100
x=200
super.x100
this.x=200
c.x = 200
x=200
super.x100
this.x=200
Reference
남궁 성 지음, 『자바의 정석』, 도우출판.