- 자바에서 "모든 것이 가상 메서드이다"라는 말은 약간의 오해를 일으킬 수 있지만, 기본적으로 자바에서 모든 인스턴스 메서드는 가상 메서드(virtual method)로 동작한다는 의미로 이해할 수 있습니다.
가상 메서드(Virtual Method)란?
- 가상 메서드는 런타임에 실제 호출될 메서드가 결정되는 메서드를 의미합니다.
- 즉, 객체의 실제 타입에 따라 메서드가 동적으로 바인딩됩니다. 자바에서 기본적으로 모든 인스턴스 메서드는 가상 메서드로 동작하며, 다형성(polymorphism)의 기초가 됩니다.
자바에서 가상 메서드
자바에서의 주요 특징은 다음과 같습니다:
모든 인스턴스 메서드는 가상 메서드:
-
자바에서 private, static, 또는 final로 선언되지 않은 모든 인스턴스 메서드는 가상 메서드입니다.
-
이 말은, 자바에서 메서드를 호출할 때, 그 메서드가 호출되는 객체의 실제 타입에 따라 호출되는 메서드가 결정된다는 것을 의미합니다.
-
다형성 지원:
자바는 다형성을 지원하며, 이는 가상 메서드를 통해 구현됩니다.
자바에서 메서드 호출은 런타임에 실제 객체의 타입을 기반으로 결정됩니다.
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.sound();
}
}
- 위 예제에서 myDog.sound()를 호출할 때, 컴파일러는 myDog 변수의 타입이 Animal임을 알고 있습니다. 그러나 실제로 런타임에서는 myDog가 Dog 객체를 참조하고 있으므로, Dog 클래스의 sound() 메서드가 호출됩니다.
예외 - static, final, private 메서드:
- static 메서드는 클래스 수준에서 동작하므로 가상 메서드가 아니며, 정적으로 바인딩됩니다.
- final 메서드는 하위 클래스에서 재정의될 수 없으므로, 호출할 메서드가 컴파일 타임에 결정됩니다.
- private 메서드는 해당 클래스 내에서만 호출될 수 있으므로, 역시 정적으로 바인딩됩니다.
이- 러한 메서드들은 정적 바인딩(static binding) 또는 초기 바인딩(early binding)이라고도 하며, 런타임에 호출될 메서드가 결정되는 것이 아니라 컴파일 타임에 이미 결정됩니다.
결론
- 자바에서 모든 인스턴스 메서드는 기본적으로 가상 메서드로 동작합니다.
- 이는 객체의 실제 타입에 따라 런타임에 호출될 메서드가 동적으로 결정된다는 의미입니다. 다만, static, final, private 메서드는 가상 메서드가 아니며, 컴파일 타임에 호출이 결정되는 정적 바인딩 메서드입니다.