포스트

정적 바인딩과 동적 바인딩

정적 바인딩과 동적 바인딩

정적 바인딩과 동적 바인딩

자바에서 정적 바인딩과 동적 바인딩 개념이 있다. 이 개념은 메서드 호출을 결정하는 방법을 설명한다.

정적 바인딩(Static Binding)

  • 컴파일 타임에 결정 즉, 컴파일 타임 타입(=선언된 참조 변수 타입)을 기반으로 메서드 호출이 이뤄진다.
  • 정적 메서드, private, final 메서드

동적 바인딩(Dynamic Binding)

  • 런타임에 결정 즉, 런타임에 실제 참조 하고 있는 타입 기반으로 메서드 호출이 이뤄진다.
  • 오버라이딩된 메서드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Parent {
    void memberMethod() {
        System.out.println("Parent의 member 메서드 호출입니다.");
    }
    static void staticMethod() {
        System.out.println("Parent의 static 메서드 호출입니다.");
    }
}

public class Child extends Parent {
    void memberMethod() {
        System.out.println("Child의 member 메서드 호출입니다.");
    }
    static void staticMethod() {
        System.out.println("Child의 static 메서드 호출입니다.");
    }
}

Child가 Parent에 선언된 정적 메서드 staticMethod()를 선언하면 부모의 메서드를 숨기고(은닉, Hiding) 새로운 정적 staticMethod()선언 한다.

1
2
3
4
5
void main() {
    Parent parent = new Child();
    /* ① */ parent.staticMethod();
    /* ② */ parent.memberMethod();
}
결과 ① : Parent의 static 메서드 호출입니다.
② : Child의 member 메서드 호출입니다.

자바는 정적 메서드 호출 시 선언된 참조 변수의 타입(complie-time type)으로 어느 클래스의 메서드를 사용할지 결정 한다. 즉, 인스턴스 타입은 무시한다. 따라서 parent.staticMethod()를 호출할때 정적 바인딩이 발생하여 Parent 의 정적 메서드 호출된다.


문제

1
2
3
4
5
6
7
void main() {
    Child child = new Child();
    /* ① */ child.staticMethod();
    /* ② */ ((Parent)child).staticMethod();
    /* ③ */ child.memberMethod();
    /* ④ */ ((Parent)child).memberMethod();
}
결과 ① : Child의 static 메서드 호출입니다.
② : Parent의 static 메서드 호출입니다.
③ : Child의 member 메서드 호출입니다.
④ : Child의 member 메서드 호출입니다.

컴파일 타임에 호출될 메서드가 결정되는 방식을 정적 바인딩, 런타임에 호출될 메서드가 결정되는 방식을 동적 바인딩이라 말하고 동적바인딩은 다형성의 핵심이라 볼 수 있다!


응용 문제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Child extends Parent {
    void memberMethod() {
        System.out.println("Child의 member 메서드 호출입니다.");
    }
    /*
    동일한 상속 관계에서 정적 메서드만 주석처리
    static void staticMethod() {
        System.out.println("Child의 static 메서드 호출입니다.");
    }
    */
}

void main() {
    Child child = new Child();
    /* ① */ child.staticMethod();
}
결과 ① : Parent의 static 메서드 호출입니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.