Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java) 정적 바인딩과 동적 바인딩 완벽 이해하기

자바 프로그래밍에서 바인딩(Binding)은 메서드 호출과 실제 실행될 코드를 서로 연결하는 과정을 의미합니다. 자바는 이 연결 작업이 수행되는 시점에 따라 정적 바인딩(Static Binding)동적 바인딩(Dynamic Binding), 두 가지 방식으로 나뉩니다.

정적 바인딩(Static Binding)이란?

정적 바인딩은 컴파일 시점에 어떤 객체와 메서드가 사용될지 이미 결정되어 있는 경우에 적용됩니다. 컴파일러가 참조 대상을 미리 알고 있기 때문에 참조를 객체에 고정적으로 연결하며, 이를 조기 바인딩(Early Binding)이라고도 부릅니다.

정적 바인딩이 적용되는 대표적인 경우는 다음과 같습니다.

  • static으로 선언된 변수와 메서드
  • private 접근 제어자가 지정된 메서드
  • final로 선언된 변수와 메서드
  • 메서드 오버로딩(Method Overloading)

동적 바인딩(Dynamic Binding)이란?

동적 바인딩은 런타임(실행) 시점에 실제 객체가 무엇인지 확인한 후 메서드를 연결하는 방식입니다. 객체의 식별이 프로그램 실행 중에 이루어져야 하므로 후기 바인딩(Late Binding)이라고도 불립니다.

대표적인 사례가 바로 메서드 오버라이딩(Method Overriding)입니다. 부모 클래스 타입의 참조 변수가 자식 클래스 객체를 가리킬 때, 어떤 메서드가 호출될지는 런타임에 실제 객체의 타입에 따라 결정됩니다.

예제 코드로 살펴보기

class Animal {
    void sound() {
        System.out.println("동물이 소리를 냅니다");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.sound(); // 출력 결과: 멍멍! → 동적 바인딩
    }
}

위 예제에서 animal.sound() 호출은 컴파일 시점에는 Animal 클래스의 메서드처럼 보이지만, 런타임에 실제 객체가 Dog이므로 Dogsound()가 실행됩니다. 이것이 동적 바인딩의 전형적인 모습입니다.

핵심 차이점 정리

  • 결정 시점: 정적 바인딩은 컴파일 시점에, 동적 바인딩은 런타임 시점에 결정됩니다.
  • 적용 대상: 정적 바인딩은 static·private·final 멤버와 오버로딩된 메서드에, 동적 바인딩은 오버라이딩된 메서드에 적용됩니다.
  • 성능과 유연성: 정적 바인딩이 상대적으로 빠르지만, 동적 바인딩은 다형성(Polymorphism)을 구현하게 해주는 자바 객체지향 프로그래밍의 핵심 요소입니다.