오버라이드(Override)와 동적 바인딩

Soobin Kim·2024년 4월 2일

Java

목록 보기
19/47

동적 바인딩

실행 시간에 메소드 호출이 발생할 때, 실제 객체의 타입에 따라 해당 메소드가 결정되는 것을 말한다.

Animal a = new Dog();
    
Dog d = new Dog();
Animal ani;
ani = d;
    
ani.eat();  // "개처럼 먹다" 
//  ani.bark(); error

Java에서는

  • 첫째, 컴파일 시간에는 변수의 타입에 따라 컴파일러가 어떤 멤버에 접근할 수 있는지 결정한다.
    • 따라서 주어진 소스코드에서 a는 컴파일 시간에 Animal 클래스의 변수이므로 bark() 메소드에 접근할 수 없다.
  • 둘째, 실행 시간에는 실제 객체의 타입에 따라 해당 멤버에 접근한다. ---> 동적 바인딩과 관련이 있다.
    • 따라서 주어진 소스코드에서 a는 실행 시간에서 실제 객체가 Dog임이 파악되었으므로 eat() 메소드는 "개처럼 먹다"를 출력한다.

오버라이드(Override)와 동적 바인딩

  • 자식 클래스가 부모 클래스의 메서드를 오버라이드하면, 변수의 타입이 부모 클래스이더라도 실행 시에는 자식 클래스가 재정의한 메서드가 호출된다.
  • 이는 컴파일 시에는 알 수 없고, JVM이 실행 시 객체의 실제 타입을 확인하여 오버라이드된 메서드를 호출한다(동적 바인딩).
  • 실행 시점에서 사용될(호출될) 메서드가 결정되므로, 프로그램 실행 속도와 관계가 있다(의미 있는 차이를 발생시키진 않겠지만 프로그램 실행 속도 저하의 원인이 될 수도 있다).

상속과 정적 멤버

  • 자식 클래스에서 부모 클래스의 정적 멤버에 접근할 수 있으며, 이는 부모 클래스명을 사용하여 접근할 수도 있고, 더 간단하게 자식 클래스명을 사용하여 접근할 수도 있다.

  • 하지만 정적(static) 멤버는 상속될 수 있지만 오버라이딩될 수는 없으므로 동적 바인딩과 관련이 없다. 자식 클래스에서 동일한 이름의 정적 멤버를 선언하더라도 부모 클래스의 정적 멤버를 오버라이딩하는 것이 아니라, 완전히 새로운 정적 멤버가 생성되는 것이다.

  • 정적(static) 멤버들은 클래스가 로드될 때 메모리에 할당되어야 하므로, 정적(static) 로딩에 의해 메모리에 올려진다. 따라서 자식 클래스를 통해 부모의 정적(static) 멤버들을 접근하게 되면, 자식 클래스의 정적 멤버들과 부모 클래스의 정적 멤버들이 모두 메모리에 로딩되며 멤버들은 모두 Method Area(메서드 영역)에 올라가게 된다.



[참고] 오버로딩과 오버라이딩

0개의 댓글