정적 바인딩과 동적 바인딩
정적 바인딩과 동적 바인딩
정적 바인딩과 동적 바인딩
자바에서 정적 바인딩과 동적 바인딩 개념이 있다. 이 개념은 메서드 호출을 결정하는 방법을 설명한다.
정적 바인딩(Static Binding)
- 컴파일 타임에 결정 즉, 컴파일 타임 타입(=선언된 참조 변수 타입)을 기반으로 메서드 호출이 이뤄진다.
- 정적 메서드, private, final 메서드
동적 바인딩(Dynamic Binding)
- 런타임에 결정 즉, 런타임에 실제 참조 하고 있는 타입 기반으로 메서드 호출이 이뤄진다.
- 오버라이딩된 메서드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Parent {
void memberMethod() {
System.out.println("Parent의 member 메서드 호출입니다.");
}
static void staticMethod() {
System.out.println("Parent의 static 메서드 호출입니다.");
}
}
public class Child extends Parent {
void memberMethod() {
System.out.println("Child의 member 메서드 호출입니다.");
}
static void staticMethod() {
System.out.println("Child의 static 메서드 호출입니다.");
}
}
Child가 Parent에 선언된 정적 메서드 staticMethod()를 선언하면 부모의 메서드를 숨기고(은닉, Hiding) 새로운 정적 staticMethod()선언 한다.
1
2
3
4
5
void main() {
Parent parent = new Child();
/* ① */ parent.staticMethod();
/* ② */ parent.memberMethod();
}
결과
① : Parent의 static 메서드 호출입니다.② : Child의 member 메서드 호출입니다.
자바는 정적 메서드 호출 시 선언된 참조 변수의 타입(complie-time type)으로 어느 클래스의 메서드를 사용할지 결정 한다. 즉, 인스턴스 타입은 무시한다. 따라서 parent.staticMethod()를 호출할때 정적 바인딩이 발생하여 Parent 의 정적 메서드 호출된다.
문제
1
2
3
4
5
6
7
void main() {
Child child = new Child();
/* ① */ child.staticMethod();
/* ② */ ((Parent)child).staticMethod();
/* ③ */ child.memberMethod();
/* ④ */ ((Parent)child).memberMethod();
}
결과
① : Child의 static 메서드 호출입니다.② : Parent의 static 메서드 호출입니다.
③ : Child의 member 메서드 호출입니다.
④ : Child의 member 메서드 호출입니다.
컴파일 타임에 호출될 메서드가 결정되는 방식을 정적 바인딩, 런타임에 호출될 메서드가 결정되는 방식을 동적 바인딩이라 말하고 동적바인딩은 다형성의 핵심이라 볼 수 있다!
응용 문제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Child extends Parent {
void memberMethod() {
System.out.println("Child의 member 메서드 호출입니다.");
}
/*
동일한 상속 관계에서 정적 메서드만 주석처리
static void staticMethod() {
System.out.println("Child의 static 메서드 호출입니다.");
}
*/
}
void main() {
Child child = new Child();
/* ① */ child.staticMethod();
}
결과
① : Parent의 static 메서드 호출입니다. 이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.