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)

토비의봄#01. Double Dispatch (tistory.com)