자바는 모든게 가상메서드인가?

서버란·2024년 8월 31일

자바 궁금증

목록 보기
7/35
  • 자바에서 "모든 것이 가상 메서드이다"라는 말은 약간의 오해를 일으킬 수 있지만, 기본적으로 자바에서 모든 인스턴스 메서드는 가상 메서드(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(); // 출력: Dog barks
    }
}
  • 위 예제에서 myDog.sound()를 호출할 때, 컴파일러는 myDog 변수의 타입이 Animal임을 알고 있습니다. 그러나 실제로 런타임에서는 myDog가 Dog 객체를 참조하고 있으므로, Dog 클래스의 sound() 메서드가 호출됩니다.

예외 - static, final, private 메서드:

  • static 메서드는 클래스 수준에서 동작하므로 가상 메서드가 아니며, 정적으로 바인딩됩니다.
  • final 메서드는 하위 클래스에서 재정의될 수 없으므로, 호출할 메서드가 컴파일 타임에 결정됩니다.
  • private 메서드는 해당 클래스 내에서만 호출될 수 있으므로, 역시 정적으로 바인딩됩니다.
    이- 러한 메서드들은 정적 바인딩(static binding) 또는 초기 바인딩(early binding)이라고도 하며, 런타임에 호출될 메서드가 결정되는 것이 아니라 컴파일 타임에 이미 결정됩니다.

결론

  • 자바에서 모든 인스턴스 메서드는 기본적으로 가상 메서드로 동작합니다.
  • 이는 객체의 실제 타입에 따라 런타임에 호출될 메서드가 동적으로 결정된다는 의미입니다. 다만, static, final, private 메서드는 가상 메서드가 아니며, 컴파일 타임에 호출이 결정되는 정적 바인딩 메서드입니다.
profile
백엔드에서 서버엔지니어가 된 사람

0개의 댓글