바인딩(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 메서드를 컴파일 과정에서 구분할 수 있다. 즉, 컴파일 과정에서 어떤 메서드를 호출할 지 결정되기 때문에 오버로딩은 정적 바인딩이다.
오버라이딩은 상속 관계에 있는 클래스 간에 같은 이름을 재정의하는 기술을 의미한다.
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
키워드를 붙이면 특정 메서드를 오버라이딩이 불가능하게 만들 수 있다. 그러면 해당 메서드는 정적 바인딩으로 실행된다.
정적 바인딩 | 동적 바인딩 | |
---|---|---|
수행 속도 | 비교적 빠름 | 비교적 느림 |
메모리 공간 활용 효율 | 비교적 좋음 | 비교적 낮음 |
특징 | - | 다형성 활용 프로그래밍 가능 |