Java

정적 바인딩 & 동적 바인딩

뽀루피 2024. 7. 17. 17:33

바인딩이란?

프로그램의 변수나 함수 호출이 실제 메모리 주소와 연결되는 과정을 말한다.

 

 

정적(static) vs 동적(dynamic)

정적(static)이란 한번 정해놓으면 변하지 않고 계속해서 유지되는 성질을 말하며,
동적(dynamic)이란 상황에 따라서 실시간으로 변하는 성질을 말한다.

 

이러한 정의는 정적 바인딩과 동적 바인딩의 역할을 함축적으로 나타낸다.

정적 바인딩, 동적 바인딩은 값이 확정되는 시점에 따라 나뉜다.

 

컴파일 시점에 바인딩이 일어나면 정적 바인딩,
런타임 시점에 바인딩이 일어나면 동적 바인딩이다.

 

컴파일과 런타임에 대해서 간단하게 알아보고 가자.

  • 컴파일 : Java의 소스코드를 바이트코드로 변환하는 과정
  • 런타임 : 프로그램이 실행되는 동안의 상태

 

Java의 JVM은 바이트코드를 읽어들여 파일을 실행한다. 그러니까 순서로 따지면 컴파일이 일어난 후에 런타임이 실행되는 것이다.

 

 

자바에서 정적 바인딩은 주로 메서드 오버로딩, 정적 메서드 호출 등에 적용된다.

반면 동적 바인딩은 대부분의 인스턴스 메서드 호출에 적용된다.

 

 

예시를 보자.

class Animal {
    public void makeSound() {
        System.out.println("Animal sound");
    }
}

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

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.makeSound();  // "Dog barks" 출력
    }
}

 

Main 함수 부에서 animal은 Animal로 선언되었다.(정적 바인딩)

Animal 타입의 animal은 new 키워드를 통해 Dog 인스턴스를 할당받았다. (동적 바인딩)

최종적으로 animal은 Dog 인스턴스를 참조하고 있기 때문에 makeSound() 메소드를 실행해보면 "Dog barks"를 출력한다.

 

 

 

일부 언어나 특정 상황(예: C++의 정적 메서드)에서는 포인터나 참조 변수의 선언 타입을 기준으로 메서드 호출이 결정될 수 있다. 하지만 자바에서는 대부분의 경우 이렇게 동작하지 않는다.

인스턴스 메서드 호출 시, 컴파일러는 선언된 타입을 기반으로 메서드의 존재 여부만 확인하고, 실제 어떤 메서드가 호출될지는 런타임에 결정되며, 이는 객체의 실제 타입에 따라 달라진다.

'Java' 카테고리의 다른 글

Intellij 인텔리제이 live template 만들기  (0) 2024.08.07
인텔리제이 단축키(Java)  (1) 2024.07.23
다중 상속  (1) 2024.07.17
default 메소드  (0) 2024.07.17
static 메소드 vs 인스턴스 메소드  (0) 2024.07.17