본문 바로가기

Java

(상속) 메서드 오버라이딩과 동적 바인딩

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

메서드 오버 라이딩


오버 라이딩이란, 하위 클래스에서 상위 클래스의 함수를 재정의하는 것을 의미합니다.

자바에서는 함수를 식별할 때 이름과 매개변수로 식별합니다.

이름과 매개변수가 같은 함수, 즉 동일한 함수를 재정의 하는 것을 오버 라이딩이라고 합니다.

 

상속에서는 이런 오버 라이딩을 통해 다형성의 기반을 쌓는데요

오늘은 오버 라이딩에 대해서만 간단하게 알아보겠습니다.

 

아래 소스코드를 먼저 보겠습니다.

class SuperClass {
    void f() {
        System.out.println("SuperClass");
    }
}

class SubClass extends SuperClass{
    @Override
    void f() {
        System.out.println("SubClass");
    }
}

위 예시에서 SubClass는 SuperClass의 f() 함수를 오버 라이딩하고 있습니다.

완전히 동일한 함수입니다.

 

상속 관계에서는 이렇게 메서드가 오버 라이딩 되었을 때 반드시

오버라이딩 한쪽, 그러니까 하위 클래스의 메서드가 호출되게 됩니다.

 

    public static void main(String[] args) {
        SuperClass obj = new SubClass();
        obj.f();
    }

위 코드를 실행하면 SubClass가 찍히는 것을 확인할 수 있습니다.

 

그렇다면 이런 구조에서는 어떻게 될까요?

class A {

    void f() {
        System.out.println("B");
    }
}

class B extends A {

    @Override
    void f() {
        System.out.println("B");
    }
}

public class C extends B {

    @Override
    void f() {
        System.out.println("C");
    }

    public static void main(String[] args) {
        A a = new C();
        a.f();
    }
}

위에서 실행결과는 C가 나옵니다.

즉, 동적 바인딩은 런타임 시 실제로 어떤 객체인지 검사하여 해당 클래스부터 위로 찾아가는 것을 의미합니다.

위의 경우에는 실제 인스턴스가 C이기 때문에

C -> B -> A 순으로 f() 함수를 찾게 됩니다.

 

class A {

    void f() {
        System.out.println("B");
    }
}

class B extends A {

    @Override
    void f() {
        System.out.println("B");
    }
}

public class C extends B {

    public static void main(String[] args) {
        A a = new C();
        a.f();
    }
}

그러므로 위와 같은 경우에는 B가 출력되게 됩니다.

 

정리하면 메서드 오버 라이딩 시에는

실제 인스턴스 형태에 따라서 메서드가 호출되기 때문에

컴파일러에 의해 정적 바인딩되던 필드에서와는 반대로

런타임 시에 동적 바인딩이 이뤄진다.

그러므로 실제 어떤 인스턴스인지가 가장 중요하다.

정도로 정리가 되겠습니다.

 

객체지향에서 이것은 아주 강력한 힘이며

이를 기반으로 다형성을 실현하게 됩니다.

 

그러므로 위와 같은 상속 구조를 만들었다면

C c = new C(); //좋지 않은 코드
A a = new A(); //좋은 코드

위처럼 설계하는 것이 좋겠습니다.

 

오늘은 메서드 오버 라이딩에 대해서 알아보았습니다.

'Java' 카테고리의 다른 글

추상 메서드와 추상 클래스  (0) 2021.05.11
(상속) 메서드 오버라이딩과 다형성  (0) 2021.05.11
(상속) 업캐스팅과 다운캐스팅  (0) 2021.05.07
(상속) 생성자 호출  (0) 2021.05.07
(상속) 부모 클래스 접근  (0) 2021.05.07