본문 바로가기



프로그래밍/JAVA

[JAVA] 상속(extends)관계에 있는 참조변수(reference variable )와 method 호출

참조변수는 상속받은 자손이 조상의 참조변수를 모두 호출 할 수 있지만, 자손의 method가 오버라이드 되어있을경우에는 자손것만 계속 호출된다. 그래서 드는 의문은 그럼 method가 다른건 호출가능한가? 왜냐하면 상속받으면 조상클래스에 있는것도 일단은 모조리 상속받기 때문에 당연히 될것이라 생각했고, 그래서 일단 만들어보기로 했다. 

package fmri.parentchild;

public class Parent {
	int parent_int=100;
	String parent_String="parent_string";

	void method() {
		System.out.println("Parent method()");
	}

}

 

package fmri.parentchild;

public class Child extends Parent {
	int child_int = 999;
	String child_String="child string";

	void method() {
		System.out.println("Child method()");
	}
}
package fmri.parentchild;

public class TestChildParent {

	public static void main(String[] args) {
		Parent p = new Parent();
		System.out.println(p.parent_String);

		Parent pc = new Child();
		System.out.println("pc.parent_int : "+ pc.parent_int);
		System.out.println("pc.parent_String: "+pc.parent_String);
		pc.method();

		//	 System.out.println(pc.Child_int);

		System.out.println();

		Child c= new Child();
		System.out.println("c.child_int : "+ c.child_int);
		System.out.println("c.child_String :" +c.child_String);
		System.out.println("c.parent_int : " + c.parent_int);
		System.out.println("c.parent_String : "+ c.parent_String);
		c.method();
	}
}

일단 기본적인 예제를 만들어서 호출해보면

parent_string
pc.parent_int : 100
pc.parent_String: parent_string
Child method()

c.child_int : 999
c.child_String :child string
c.parent_int : 100
c.parent_String : parent_string
Child method()

이렇게 호출된다. pc.method(); 로 Parent pc = new Child(); 객체를 생성후에 method를 부르면 이클립스 내에서는

Parent에 속해있는것으로 표시되지만 막상 출력하면 Child클래스에 있는 method 가 출력된다. 실제로는 Child클래스에  가면

이렇게 오버라이딩 되어있다는 표시가 있고, 호출하면 Child 클래스에 있는 method() 가  호출된다.

그래서 Parent클래스에

	void ParentDisply() {
		System.out.println("ParentDisplay()");
	}

위의  코드를 추가하고, 실행클래스TestChildParent에  각 객체마다 pc.ParentDisply(); 와 c.ParentDisply(); 를 코드추가하였다.

그래서 시험삼아 돌려보았더니, 출력 잘된다. 정리 해보자면 아래 표와 같다. 같은 이름을 가진 인스턴스는 각 클래스 호출이 되지만  같은 이름을 가진 메소드는 조상객체 특성을가진 자손객체를 생성하면 조상이 아니라 자손객체의 메소드를 호출한다.  보통 교재에서는 인스턴스를 비롯한 멤버변수가 참조 변수 타입에 따라 다른다는 점을 강조하는데 실제로 초보자들이 코딩해보면 자손으로 불렀긴하지만 조상타입이 엄연히 지정되어 있는데, 자손 타입이...? 라는 의문이 생기기 마련이다. 

이것은 해결했는데 의문점이 또 생긴다. 그럼 Parent에 속해있다고 나오는 method가 실제로는 Child클래스에 의해 오버라이딩되었을경우, 실행클래스를 통해서 볼때 Child 클래스에서 오버라이딩 되어있다고 알 수 있는 방법은 없는것인가? 라는 것이다. 왜냐하면, 실제 유지보수를 할때는 실행클래스를 먼저 볼텐데, 작성된 코드와 나오는 출력이 다를게 뻔하기 때문이다. 나중에 생각나면 더 작성해 봐야겠다.