java

정적 바인딩과 동적 바인딩에 관하여

heejunp 2025. 2. 4. 20:45

Java에서 바인딩(Binding)이란, 프로그램이 실행되기 전에(컴파일 시간) 또는 실행 중(런타임)에 메서드 호출과 해당 메서드의 실제 구현을 연결하는 과정입니다. 바인딩에는 정적 바인딩(Static Binding)동적 바인딩(Dynamic Binding) 두 가지 방식이 있으며, 이 글에서는 두 방식의 개념과 차이점, 예제 코드를 살펴보겠습니다.



 

1. 정적 바인딩 (Static Binding)

1.1 정적 바인딩이란?

정적 바인딩 (Early Binding 또는 Compile-Time Binding) 은 컴파일 시간에 어떤 메서드 또는 변수에 대한 호출이 어떤 정의와 연결될지 결정되는 방식입니다. 즉, 컴파일러가 메서드 호출을 사전에 결정하는 것을 의미합니다.

정적 바인딩은 private, static, final 메서드와 같은 객체의 실제 타입과 관계없이 결정될 수 있는 메서드에 적용됩니다.

1.2 정적 바인딩 예제

class StaticBindingExample {
    static void display() {
        System.out.println("Static Binding: This is a static method.");
    }

    public static void main(String[] args) {
        StaticBindingExample.display();
    }
}

실행 결과

Static Binding: This is a static method.
  • static 메서드는 클래스 레벨에서 실행되므로, 객체가 아닌 클래스 자체에서 호출됩니다.
  • 따라서, 컴파일 시간에 바인딩이 결정됩니다.

1.3 정적 바인딩이 적용되는 경우

  1. static 메서드
  2. final 메서드 (오버라이딩 불가)
  3. private 메서드 (상속 불가)
  4. 인스턴스 변수 접근
class Parent {
    final void show() {
        System.out.println("Final method - Static Binding");
    }
}

class Child extends Parent {
    // 컴파일 오류 발생: final 메서드는 오버라이딩 불가
    // void show() {}
}

final 메서드는 오버라이딩이 불가능하므로, 정적 바인딩이 적용됩니다.



 

2. 동적 바인딩 (Dynamic Binding)

2.1 동적 바인딩이란?

동적 바인딩(Late Binding 또는 Runtime Binding) 은 프로그램 실행 중에 메서드 호출이 어떤 정의와 연결될지 결정되는 방식입니다. 즉, 객체의 실제 타입을 기준으로 실행할 메서드를 결정하는 것을 의미합니다.

동적 바인딩은 오버라이딩된 인스턴스 메서드에서 발생합니다.

2.2 동적 바인딩 예제

class Parent {
    void show() {
        System.out.println("Parent's show method");
    }
}

class Child extends Parent {
    @Override
    void show() {
        System.out.println("Child's show method");
    }
}

public class DynamicBindingExample {
    public static void main(String[] args) {
        Parent obj = new Child(); // 부모 타입 참조, 자식 객체 생성
        obj.show(); // 실행 결과: Child's show method
    }
}

실행 결과

Child's show method
  • obj컴파일 시 타입은 Parent 이지만, 런타임에는 실제 객체 타입 (Child) 에 따라 show() 메서드가 호출됩니다.
  • 즉, 메서드 바인딩이 런타임에 결정되므로 동적 바인딩이 적용됩니다.

2.3 동적 바인딩이 적용되는 경우

  1. 오버라이딩된 인스턴스 메서드
  2. 다형성(Polymorphism) 적용
class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // 다형성 적용
        myAnimal.makeSound(); // 실행 결과: Dog barks
    }
}

실행 결과

Dog barks
  • myAnimal Animal 타입이지만, 실제로는 Dog 객체이므로 Dog makeSound() 가 호출됩니다.
  • 다형성을 적용하면 메서드 바인딩이 런타임에 결정되므로 동적 바인딩이 적용됩니다.

3. 마무리

  • 정적 바인딩은 컴파일 시간에 메서드 호출이 결정되며, static, final, private 메서드 등에 적용됩니다.
  • 동적 바인딩은 실행 시간에 메서드 호출이 결정되며, 오버라이딩된 인스턴스 메서드와 다형성 (Polymorphism) 에서 발생합니다.
  • 정적 바인딩은 속도가 빠르지만 유연성이 떨어지고, 동적 바인딩은 성능은 상대적으로 낮지만 유연성이 높습니다.
  • 다형성을 활용하려면 동적 바인딩을 이해하고 적절하게 사용하는 것이 중요합니다.