바인딩(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 |