728x90
반응형
동적 바인딩의 핵심 개념
- 동적 바인딩(Dynamic Binding)이란 런타임에 객체의 실제 타입에 따라 메서드가 호출되는 방식입니다.
- 부모 클래스에서 메서드를 호출할 때, 객체가 자식 클래스의 인스턴스일 경우, 자식 클래스에서 오버라이딩된 메서드가 호출됩니다.
왜 부모 클래스에서 자식 클래스의 메서드가 호출되는가?
- 상속을 통해 부모와 자식 클래스가 연결됩니다.
- 자식 클래스에서 부모 클래스의 메서드를 오버라이딩하면, 자식 클래스의 메서드가 부모 클래스의 동일한 메서드를 덮어쓰게 됩니다.
- 동적 바인딩은 실제 객체의 타입에 따라 메서드를 호출하는 방식이므로, 부모 클래스의 참조 변수를 사용해 메서드를 호출하더라도, 실제 객체가 자식 클래스라면 자식 클래스의 메서드가 호출됩니다.
예제 코드와 실행 흐름
class A {
public void paint() {
System.out.print("A");
draw(); // 동적 바인딩에 의해 자식 클래스의 draw()가 호출될 수 있음
}
public void draw() {
System.out.print("B");
}
}
class B extends A {
@Override
public void draw() {
System.out.print("D");
}
}
public class Main {
public static void main(String[] args) {
A obj = new B(); // 부모 타입이지만 실제 객체는 B
obj.paint(); // 자식 클래스 B의 draw()가 호출됨
}
}
실행 흐름
- A obj = new B();
- obj는 A 타입의 참조 변수를 가지고 있지만, 실제로는 B 클래스의 객체를 가리키고 있습니다. 이게 동적 바인딩의 시작입니다.
- obj.paint(); 호출
- paint() 메서드는 A 클래스에서 정의된 메서드입니다.
- 먼저 "A"가 출력됩니다.
- draw(); 메서드 호출
- 이제 중요한 부분이 바로 여기입니다.
- draw()는 A 클래스에서 정의된 메서드이지만, 실제 객체가 B 클래스의 인스턴스이므로, 자식 클래스 B에서 오버라이딩된 draw() 메서드가 호출됩니다.
- 그래서 "D"가 출력됩니다.
출력 결과:
AD
결론: 부모 클래스에서도 자식 클래스의 메서드가 호출되는 이유
- 동적 바인딩 덕분에, 메서드가 호출될 때 실제 객체의 타입에 따라 메서드가 결정됩니다.
- 이 경우, 부모 클래스에서 메서드를 호출하더라도 실제 객체가 자식 클래스라면, 자식 클래스의 오버라이딩된 메서드가 호출됩니다.
요약
- 부모 클래스에서 draw()를 호출했는데도 자식 클래스의 draw()가 호출되는 이유는 동적 바인딩 때문입니다.
- 참조 변수의 타입이 부모 클래스여도, 실제 객체가 자식 클래스일 경우, 자식 클래스에서 오버라이딩된 메서드가 호출됩니다.
이 개념이 바로 객체지향 프로그래밍의 다형성(polymorphism)을 가능하게 하는 중요한 기초입니다.
'Category > 정보처리기사' 카테고리의 다른 글
| 리눅스(Linux)에서 파일에 권한 부여하는 방법 (0) | 2024.10.08 |
|---|---|
| 토큰과 관련된 용어들 (1) | 2024.10.08 |
| 포인터(Pointer)란? (0) | 2024.10.08 |
| 비트 이동(Shift) 연산이란? (0) | 2024.10.08 |
| 추상 팩토리(Abstract Factory) 패턴이란? (0) | 2024.10.07 |