반응형
다음과 같은 소스코드가 있다고 가정하자.
class Exam {
public void total() {
return kor + eng + math;
}
}
class NewExam extends Exam {
public void total() {
return super.total() + com;
}
public static void print(Exam exam) {
int total = exam.total();
System.out.println(total);
}
public static void main(String args[]) {
print(new Exam(1, 1, 1));
print(new NewExam(1, 1, 1, 1));
}
}
print 메서드에서 exam.total을 호출하면 Exam, NewExam 클래스 중 어떤 클래스의 total 메서드가 호출될까?
print 메서드의 매개변수에 어떤 클래스가 전달되냐에 따라 달라진다.
Exam 객체가 전달되면 Exam의 total 메서드가 실행되고 NewExam 객체가 전달되면 NewExam의 total 메서드가 실행된다. 만약 NewExam 클래스에서 total 메서드를 오버라이드 하지 않았다면 Exam 클래스의 total 메서드가 실행될 것이다.
이렇게 메서드의 매개변수에 따라(객체가 무엇이냐에 따라) 호출되는 메서드가 달라지는 것을 메서드 동적 바인딩이라고 한다.
C++의 경우는 컴파일러가 exam.total() 부분을 컴파일 시점에 결정을 하여 참조 형식에 의한 결정(정적 바인딩)을 해버린다. 정적 바인딩은 컴파일을 하고 난 이후에는 절대 바뀌지 않는다.
하지만, 자바는 컴파일러가 이러한 행위를 결정하지 않는 특징이 있다. 자바는 객체가 무엇이냐에 따라서 바인딩 되는 주소가 달라지기 때문에 실행해봐야 안다. 그래서 실행 중에 메서드 위치가 결정되는 것을 동적 바인딩이라고 한다.
반응형
'Programming > Java' 카테고리의 다른 글
[Java] String / StringBuilder / StringBuffer의 차이점은 무엇일까? (0) | 2020.09.27 |
---|---|
[Java] Enum 클래스에 대해 알아보자 (0) | 2020.09.14 |
[Java] 참조형식과 호출되는 메서드의 관계 (0) | 2020.07.04 |
[Java] Log4j에 대해 알아보자 (0) | 2019.11.11 |
[JAVA] 날짜와 시간 다루기(java.time) (0) | 2019.11.09 |