메서드를 호출할 때 컴파일러는 어떤 메서드가 호출되고 있는지
그 메서드가 메모리 상의 어떤 위치에 있는지도 정확히 알고있다.
컴파일할때 메서드를 호출하는 코드는 고정된 메서드의 주소로 번역된다.
이러한 것을 정작 바인딩 또는 초기 바인딩이라고 한다.
가상 메서드가 아닌 메서드는 이러한 정적 바인등을 하게된다.
그러나 가상 메서드가 호출될때 컴파일러는 어떤 메서드를 호출하는지 알 수 없게된다.
employee[i].payCheck() 코드가 employee, regularEmployee 중에 어떤 클래스의 payCheck 메서드를 호출하는 것인지 도무지 알 수 없다.
그것은 employee[i] 참조 배열 변수에 저장된 객체가 어떤 것인지 컴파일시에는 알 수가 없기 때문이다.
참조배열변수에 저장된 값은 실행시에 평가해야한다.
이러한 것을 동적 바인딩 또는 지연바인딩이라고 한다.
컴파일러가 컴파일 시점에서 어느버전의 메서드를 사용해야 할지 알 수 없을 때
프로그램 자체가 실행시에 메서드 호출문을 평가하여 어떤 버전의 메서드를 호출할 지를 결정해야한다.
수퍼클래스 참조변수를 통하여 가상메서드를 호출함으로써 동적바인딩을 사용하는 프로그램에서 호출되는 문장은 실행시간에 평가된다.
동적 바인딩을 사용할 떄의 이점중에 하나가 지금까지 살펴본바와 같이 각 클래스에 서로 다른 기능을 하는 메서드를
개별적으로 작성하고 이메서드를 호출할 수 있다는 것이다.
이와 함께 이미 컴파일된 코드의 기능을 자유롭게 변경할 수 있다는 점을 들 수 있다. 즉 다른 프로그래머가 작성한 클래스 라이브러리의 소스 코드를 수정하거나
다시 컴파일하지 않고도 그 기능을 얼마든지 확장시킰 있게된다.
'BackEnd FrontEnd > JAVA' 카테고리의 다른 글
jar decompile (0) | 2018.12.27 |
---|---|
다형성 (0) | 2017.10.26 |
JAVA8 (0) | 2017.10.24 |
Reflection이란 (0) | 2017.09.27 |
prepared statement /statement (0) | 2017.09.22 |