JAVA
오버로딩과 오버라이딩은 왜 어떤 바인딩인가?
se0nghyun2
2023. 5. 16. 16:17
바인딩이란 프로그램에서 사용된 구성요소의 실제값 또는 프로퍼티를 결정짓는 행위를 의미한다.
바인딩 시점에 따라 정적바인딩,동적 바인딩으로 구분한다.
- 정적바인딩
컴파일 시점에 결정
오버로딩
private final static붙은 키워드
- 동적바인딩
런타임 시점에 결정
오버라이딩
다형성 및 상속이 가능한 이유
오버로딩
오버로딩은 동일한 메서드명을 가지지만 매개변수 타입,개수가 다른 메소드를 정의하는 것
class Test{
void hello(String a){
System.out.println("String : " +a);
}
void hello(int a){
System.out.println("int: "+ a);
}
void hello(String a,int b){
System.out.print("String : "+ a +"," );
System.out.print("int : "+ b );
}
}
오버로딩은 정적바인딩이다. 왜일까?
new Test().hello("s");
new Test().hello(1);
new Test().hello("s",1);
정적바인딩이려면 컴파일 시점에 바인딩되어야 하는데
오버로딩의 경우 위와같이 메소드명만 동일할 뿐 매개변수 관련 정보들은 서로 상이하다. 메소드 내 파라미터 정보들을 보고도 구별이 가능하다는 뜻이다.
따라서 컴파일 시점에 구분이 가능하므로 어떤 메소드가 호출될지 알 수 있으므로 정적 바인딩입니다.
오버라이딩
오버라이딩이란 동일한 메소드를 하위클래스에서 재정의하는 것
public class A {
void hello(){
System.out.println("A 안녕");
}
}
public class B extends A{
void hello(){
System.out.println("B 안녕"); //오버라이딩
}
}
오버라이딩은 동적바인딩이다. 왜일까?
다형성을 위하여 아래와 같이 선언 후 출력한다고 가정한다.
A t =new A();
t.hello();
참고로 자바는 컴파일 시 객체 타입에 대해서만 인지하고 있고, 런타임 시 객체를 생성한다.
그렇기에 컴파일 과정에서 A클래스의 hello()인지, B클래스의 hello() 호출인지 판단이 불가하다.
따라서, 컴파일 시점이 아닌 런타임 시 객체가 생성되고 나서야 어떤 메소드가 호출되어야 할지 결정된다.
참고)
[JAVA] 정적 바인딩(Static Binding) vs 동적 바인딩(Dynamic Binding) (tistory.com)