[JAVA] 상속에서의 함수호출과 동적바인딩

정연진·2021년 4월 2일
0

오늘 공부한 것은 상속관계에서의 메소드호출과 동적바인딩이다.

상속과 메소드 접근 범위

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(); <- 이렇게 말이다.(괄호 빠트리면 안됨)

자바의 동적(dynamic)바인딩

바인딩에는 두 가지 방법이 있다.

첫 번째,
컴파일타임에 바인딩을 하는 -> static 바인딩

두 번째,
실행할때 바인딩 -> dynamic 바인딩 (동적 바인딩)

자바는 동적(dynamic) 바인딩을 사용한다.

자바는 메소드의 위치정보를 객체가 갖게한다.
객체가 전달되었을 때 객체가 갖고있는 위치정보를 뒤져서 그에 맞는 함수를 호출한다.

그래서! 오버라이딩된 메소드가 우선순위를 가질 수 있는 것이다.
즉, 동적(dynamic)바인딩이 오버라이드 메소드의 우선순위, 다형성을 보장해준다는 것이다.

다시 위 그림으로 예를 들어보자.

a.f2();를 호출한다면? (노란화살표)

A자료형을 갖는 B객체는 B클래스에서 f2()를 찾겠지만, 없으니 A클래스의 f2()를 호츨한다.
f2()내부에서는 f3();를 호출한다. 이 때 B클래스의 오버라이딩 된 f3();이 우선순위를 가지므로 B클래스의 f3();이 실행된다.

profile
열공해욧

0개의 댓글