
Java 상속에 대해 학습하며, 정적 바인딩과 동적 바인딩의 정의에 대해 추가적으로 공부하였습니다.
자바의 상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 사용하는 기능을 의미한다.
class Parent {
String memberVariable = "Parent 멤버 변수";
void instanceMethod() {
System.out.println("Parent 인스턴스 메서드");
}
static void staticMethod() {
System.out.println("Parent 정적 메서드");
}
}
class Child extends Parent {
String memberVariable = "Child 멤버 변수";
@Override
void instanceMethod() {
System.out.println("Child 인스턴스 메서드");
}
static void staticMethod() {
System.out.println("Child 정적 메서드");
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
System.out.println("멤버 변수: " + obj.memberVariable);
obj.instanceMethod();
obj.staticMethod();
System.out.println("실제 객체 타입: " +obj.getClass().getSimpleName());
}
}
위 코드에서 Child 클래스는 Parent 클래스를 상속받는다. Main 클래스 main 메서드의 obj는 부모 타입의 참조 변수로 자식 객체를 참조하고 있다. obj 참조 변수로 memberVariable, instanceMethod(), staticMethod() 으로 접근하면 다음과 같은 결과가 나온다.
멤버 변수: Parent 멤버 변수
Child 인스턴스 메서드
Parent 정적 메서드
실제 객체 타입: Child
여기서 주의해야 할 점은 멤버 변수와 정적 메서드에 접근했을 때는 부모 클래스의 멤버 변수와 메서드를 사용하지만, 인스턴스 메서드에 접근했을 때는 자식 클래스의 메서드를 사용한다. 이는 각각 정적 바인딩, 동적 바인딩과 관련 있다.
프로그램의 코드와 실행 중 사용되는 리소스나 메서드 호출을 연결하는 과정
컴파일 시점에 호출 대상이 결정된다. 따라서 호출 대상이 고정되어 있다.
자바에서 멤버 변수는 다형성을 지원하지 않기 때문에 부모 클래스와 자식 클래스의 멤버 변수를 런타임에 바꿔서 사용하지 않는다. 멤버 변수는 메모리에 고정된 위치를 가지며, 런타임에 동적으로 탐색하지 않는다.
정적 메서드는 클래스 수준에서 동작하기 때문에, 객체가 아닌 클래스에 직접 바인딩 된다. 객체와 무관하게 동작하며, 메모리 및 호출 효율성을 위해 컴파일 시점에 호출 대상을 결정하도록 설계되어 있다.
런타임 시점에 호출 대상이 결정된다.
자바에서 인스턴스 메서드는 객체를 기반으로 동작하므로, 실제 객체 타입에 따라 호출 대상이 결정된다. 객체가 어떤 타입인지에 따라 적절한 메서드를 호출함으로써 재사용성과 유지보수성을 높인다.