[Java] 자바에서 오버라이딩 메서드가 실행되는 원리

Woomin Wang ·2025년 3월 21일

[Java]

목록 보기
4/10
post-thumbnail

오버라이딩 시 자식 메서드가 무조건 실행되는 이유?

자바에서 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 기능입니다. 그런데 오버라이딩된 메서드는 무조건 자식 클래스의 메서드가 실행되는데, 그 이유는 동적 바인딩(Dynamic Binding) 때문입니다.

동적 바인딩(Dynamic Binding)이란?

동적 바인딩이컴파일 시점이 아니라 실행 시점에 실제 호출된 메서드가 결정되는 것을 말합니다. 즉, 어떤 메서드가 실행될지는 프로그램이 실제로 실행되는 동안, 참조 변수의 실제 인스턴스 타입에 따라 결정된다는 것입니다.

컴파일 시점 vs 실행 시점

자바는 컴파일 시점실행 시점을 명확히 구분합니다. 각 시점에는 수행되는 작업은 다음과 같습니다.

  • 컴파일 시점: 참조 타입을 기준으로 호출할 수 있는 메서드를 결정합니다. 이 시점에서는 참조 변수의 타입에 따라서 호출할 수 있는 메서드가 제한됩니다.
  • 실행 시점: 실제 인스턴스 타입을 기준으로 실행할 메서드가 결정됩니다. 즉, 프로그램이 실행될 때, 참조 변수에 실제 할당된 객체(인스턴스)의 타입에 따라 메서드가 호출됩니다.

즉, 컴파일 시점에서는 어떤 메서드를 호출할 수 있는지 제한되지만, 실제 메서드 실행은 인스턴스 타입에 따라 결정됩니다.

동적 바인딩이 발생하지 않는 경우

Child chile = new Child();와 같은 경우, 참조 타입과 인스턴스 타입이 동일하기 때문에 동적 바인딩이 발생하지 않습니다. 이 경우, 실행 시점에 호출된 메서드는 이미 컴파일 시점에 결정됩니다.

Parent parent1 = new Child(); 에서 메서드 호출 과정 정리

1. 컴파일 시점

  • parent1.메서드()를 호출하면, 참조 타입(Parent)을 기준으로 해당 메서드가 Parent 클래스에 존재하는지 확인합니다.
  • 만약, Parent에 해당 메서드가 없다면, 컴파일 오류가 발생합니다.
  • 하지만 Parent 클래스에 해당 메서드가 있다면, 컴파일 문제없이 실행됩니다.

2. 실행 시점

  • 프로그램 실행 시, parent1의 인스턴스 타입은 Child입니다.
  • Child 클래스에서 오버라이딩된 메서드가 존재한다면, Parent의 메서드가 아닌 Child의 메서드가 실행됩니다.
  • 이 과정을 동적 바인딩이라고 합니다. 즉, 실제 실행되는 메서드는 참조 변수의 실제 인스턴스 타입에 따라 결정됩니다.
class Parent {
	void show() {
		System.out.println("Parent의 show()");
	}
}

class Child extends Parent {
	@Override
	void show() {
		System.out.printn("Child의 show()");
	}
}

public class Main {
	public static void main(String[] args) {
		Parent parent1 = new Child(); //업캐스팅 (참조 타입: Parent, 인스턴스 타입: Child)
		parent1.show();/ //실행 결과: "Child의 show()"
	}
}
  1. 컴파일 시점
  • parent1의 참조 타입Parent입니다.
  • show() 메서드가 Parent 클래스에 존재하므로 컴파일 시 오류가 발생하지 않습니다.
  1. 실행 시점
  • 실제 객체(parent1)의 인스턴스 타입Child입니다.
  • Child 클래스에서 오버라이딩된 show() 메서드가 실행됩니다.

결론

컴파일 시점에서는 참조 타입에 따라 메서드를 호출할 수 있습니다.

실행 시점에서는 실제 인스턴스 타입에 따라 오버라이딩된 메서드가 실행됩니다.

동적 바인딩(Dynamic Binding) 덕분에, 자식 클래스의 메서드는 무조건 실행됩니다.

Parent 클래스에만 있는 메서드는 컴파일 시점에 호출되지만, 자식 클래스에서 오버라이딩한 메서드는 실행 시점에 결정되어 실행됩니다.

동적 바인딩이 발생하지 않는 경우, 참조 타입과 인스턴스 타입이 동일하면 실행 시점에 호출되는 메서드가 이미 컴파일 시점에 결정됩니다.

profile
Backend Developer

0개의 댓글