오늘 공부한 것은 상속관계에서의 메소드호출과 동적바인딩이다.
class A{
f1();
f2(){
f3();
}
f3();
f4(){
f5();
}
f5();
}
class B extends A{
@override
f3();
@override
f5(){
f4();
}
f6();
f7();
}
public static void main(String args[]){
A a = new B();
}
위 코드를 그림으로 표현하면 이렇다.
main에서 A(부모)자료형인 a가 자식객체를 참조하고 있다.
(자바에서 자식객체가 부모객체를 대신할 수 있다.)
이 상황에서 a.f6(); 을 호출한다면 에러가 난다.
메소드는 참조형식의 메소드 범위에서만 호출할 수 있기 때문이다.
즉, a는 밑의 노란색으로 박스친 범위의 메소드에만 접근할 수 있다.
에러를 해결하기 위한 방법으로는
a를 B로 명시적 형변환을 해주면 된다.
((B)a).f6(); <- 이렇게 말이다.(괄호 빠트리면 안됨)
바인딩에는 두 가지 방법이 있다.
첫 번째,
컴파일타임에 바인딩을 하는 -> static 바인딩두 번째,
실행할때 바인딩 -> dynamic 바인딩 (동적 바인딩)
자바는 동적(dynamic) 바인딩을 사용한다.
자바는 메소드의 위치정보를 객체가 갖게한다.
객체가 전달되었을 때 객체가 갖고있는 위치정보를 뒤져서 그에 맞는 함수를 호출한다.
그래서! 오버라이딩된 메소드가 우선순위를 가질 수 있는 것이다.
즉, 동적(dynamic)바인딩이 오버라이드 메소드의 우선순위, 다형성을 보장해준다는 것이다.
다시 위 그림으로 예를 들어보자.
a.f2();를 호출한다면? (노란화살표)
A자료형을 갖는 B객체는 B클래스에서 f2()를 찾겠지만, 없으니 A클래스의 f2()를 호츨한다.
f2()내부에서는 f3();를 호출한다. 이 때 B클래스의 오버라이딩 된 f3();이 우선순위를 가지므로 B클래스의 f3();이 실행된다.