참조변수와 인스턴스의 연결

mingseok·2022년 5월 14일
0

객체 지향 1

목록 보기
7/10

멤버변수는 인스턴스변수와 static변수를 모두 통칭하는 말이다.

조상 클래스에 선언된 멤버변수와 같은 이름의 인스턴스변수를 자손 클래스에 중복으로 정의 했을때,
조상타입의 참조변수로 자손 인스턴스를 참조하는 경우와 자손타입의 참조변수로 자손 인스턴스를 참조하는 경우는 서로 다른 결과를 얻는다.

	Parent p = new Child();
	Child c = new Child();

메서드의 경우.

조상 클래스의 메서드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 타입에
관계없이 항상 실제(자식) 인스턴스의 메서드가 호출되지만, 멤버변수의 경우 참조변수의
타입에 따라 달라진다.


멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우

조상타입의 참조변수를 사용했을 때는 조상 클래스에 선언된 멤버변수가 사용되고,
자손타입의 참조변수를 사용했을 때는 자손 클래스에 선언된 멤버변수가 사용 된다.


중복 정의되지 않은 경우

차이는 없다.
중복된 경우는 참조변수의 타입에 따라 달라지지만, 중복되지 않은 경우
하나뿐이므로 선택의 여지가 없기 때문이다.


예제 1.

메서드 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


예제 2.

  • 단순히 조상으로 부터 멤버들을 상속 받는다.
  • 그렇기 때문에 참조변수의 타입에 관계없이 조상의 멤버들을 사용하게 된다.
  • 자손 클래스에서 조상 클래스의 멤버를 중복으로 정의하지 않았을 때는 참조변수의
    타입에 따른 변화는 없다.

선택의 여지가 없기 때문이다.
참조변수의 타입에 따라 결과가 달라지는 경우는 조상 클래스의 멤버변수와 같은 이름의
멤버변수로 자손 클래스에 중복해서 정의한 경우뿐이다.

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


예제 3.

상속받은 인스턴스변수 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
남궁 성 지음, 『자바의 정석』, 도우출판.

profile
블로그 이사 했습니다.

0개의 댓글