Backend Roadmap/Java

정적 바인딩과 동적 바인딩

jungeun919 2024. 6. 25. 14:02

바인딩(Binding)은 함수 호출 시, 호출된 부분을 해당 함수의 정의와 연결짓는 것을 뜻한다. 메모리 관점에서 함수의 정의가 위치한 메모리 주소로 연결되는 것이다. 바인딩이 되는 시점에 따라 정적 바인딩과 동적 바인딩으로 구분할 수 있다.

정적 바인딩

  • 컴파일 시간에 성격이 결정된다.
  • 오버로딩
  • private, final, static 이 붙은 메서드

오버로딩은 같은 메서드를 매개변수의 타입과 개수를 다르게 정의하여 다양한 메서드를 구현하는 것을 의미한다.

class Student {
	String name;
    int age;
    
    public void printInfo(String name) {
    	System.out.println("[Student] name: " + name);
    }
        
	public void printInfo(String name, int age) {
    	System.out.println("[Student] name: " + name + " age: " + age);
    }
}
Student student = new Student();
student.printInfo("jungeun");
student.printInfo("jungeun", 23);

Student 객체를 생성하여 메서드를 호출했다. 컴파일러가 매개변수 종류와 개수가 다르기 때문에 두 개의 printInfo 메서드를 컴파일 과정에서 구분할 수 있다. 즉, 컴파일 과정에서 어떤 메서드를 호출할 지 결정되기 때문에 오버로딩은 정적 바인딩이다.

동적 바인딩

  • 실행 시간(Runtime)에 성격이 결정된다.
  • 늦은 바인딩(Late Binding)이라고도 부른다.
  • 오버라이딩
  • Java의 다형성, 상속이 가능한 이유

오버라이딩은 상속 관계에 있는 클래스 간에 같은 이름을 재정의하는 기술을 의미한다.

class Person {
String name;
    int age;
    
    public Person(String name, int age) {
     this.name = name;
        this.age = age;
    }
    
    public void printInfo() {
     System.out.println("[Student] name: " + name + " age: " + age);
    }
}

class Student extends Person {
String school;
    
    public Student(String name, int age, String school) {
     super(name, age);
        this.school = school;
    }
    
    public void printInfo() {
     System.out.println("[Student] name: " + name + " age: " + age + " school: " + school);
    }
}

 

super 키워드는 부모 클래스로부터 상속받은 필드나 메서드를 자식 클래스에서 참조하는 데 사용하는 참조 변수다.

Person person = new Student("jungeun", 23, "syu");
person.printInfo();

 

컴파일 과정에서 person 객체가 호출한 printInfo 메서드가 Person 클래스의 메서드인지 Student 클래스의 메서드인지 판단할 수 없다. 왜냐하면 person 객체가 Stundent 객체가 될 수도 있기 때문에 타입을 확정지을 수 없기 때문이다. 컴파일러는 person 객체의 타입 오류를 확인할 뿐이다.

실행 시간에 객체의 타입이 확정되면서 Person의 printInfo 메서드를 호출하는 것이다. 따라서 실행 시간에 어떤 메서드를 호출할 지 정해지기 때문에 오버라이딩은 동적 바인딩이다.

private, final, static 키워드를 붙이면 특정 메서드를 오버라이딩이 불가능하게 만들 수 있다. 그러면 해당 메서드는 정적 바인딩으로 실행된다.

 

정리

  정적 바인딩 동적 바인딩
수행 속도 비교적 빠름 비교적  느림
메모리 공간 활용 효율 비교적 좋음 비교적 낮음
특징 - 다형성 활용 프로그래밍 가능

 

Reference

'Backend Roadmap > Java' 카테고리의 다른 글

[Java] final 키워드  (0) 2024.09.03
가비지 컬렉션(Garbage Collection)  (0) 2024.06.25
오토 박싱과 오토 언박싱  (0) 2024.06.25
스트림(Stream)  (0) 2024.06.25
자바 타입 제네릭(Generic)  (0) 2024.06.25