본문 바로가기

JAVA

메서드의 오버로딩(Overloading) (feat. 정적 바인딩)

오버로딩(Overloading)이란 같은 이름의 메서드를 클래스 내에 여러 개 정의하는 것을 말하는데, 이때 각 메서드의 매개변수 목록이 서로 달라야 한다.

public class Calculator {
    // 정수 두 개를 더하는 메서드
    public int add(int a, int b) {
        return a + b;
    }

    // 실수 두 개를 더하는 메서드
    public double add(double a, double b) {
        return a + b;
    }

    // 문자열 두 개를 연결하는 메서드
    public String add(String a, String b) {
        return a + b;
    }
}

 

 

그렇다면 어떠한 장점이 있을까?

 

1. 코드의 가독성과 재사용성 향상 :

같은 작업을 수행하지만 매개변수의 타입이나 개수가 다른 경우, 같은 이름의 메서드를 여러 번 정의함으로써 사용자가 메서드의 기능을 쉽게 이해할 수 있도록 도와준다. 이는 코드를 더 읽기 쉽게 만들고, 유지보수를 쉽게 한다.

수많은 add 메서드가 있다고 가정했을때 모든 add 메서드를 조금씩 다르게 명명하는 것도 힘들 것이고 조금씩 다르게 명명된 수많은 add 메서드를 재사용할때마다 개발자 입장에서는 헷갈리고 힘들 것이다. 이러한 점에서 오버로딩은 사용자가 각 타입마다 다른 메서드 이름을 기억할 필요가 없게 만들어, 재사용성 향상을 통해 개발의 편리성을 높여주기도 한다. 또한 통일된 하나의 이름을 사용함으로써 코드의 통일성과 가독성이 올라간다.

 

2. 타입 검사와 실행 시간의 효율성 : 컴파일 시간에 메서드 오버로딩을 통해 적절한 메서드가 선택되기 때문에, 타입 검사가 엄격해지고 실행 시간의 성능이 향상된다. 이는 메서드 호출 시 타입 변환 오버헤드를 줄일 수 있다.

 

 

2번을 자세히 설명하자면, 정적 바인딩이라는 개념이 필요하다.

정적 바인딩은 컴파일 시간에 메서드 호출이 결정되는 과정을 뜻한다.

정적 바인딩 덕분에, 컴파일러는 실행 시간에 어떤 메서드를 호출해야 할지 미리 결정할 수 있다. 이는 실행 시간에 메서드 결정 로직을 수행할 필요가 없어 실행 시간의 효율성을 증가시킨다. 오버로딩된 메서드의 경우, 컴파일 시간에 적절한 메서드가 결정되므로, 실행 시간에 추가적인 성능 비용이 발생하지 않는다.

 

 

그래서 실행 시간이 감소하는 효율적인 모습을 보여주는 건 알겠는데 대신 컴파일 시간이 증가하는 건 문제가 되지 않을까?

 

현대 컴파일러는 매우 효율적으로 설계되어 있어, 대부분의 경우, 이러한 결정 과정이 컴파일 시간을 현저하게 증가시키지는 않는다. 컴파일 시간에 미치는 영향은 있을 수 있으나, 이는 일반적으로 관리 가능한 수준이다.

따라서, 메서드 오버로딩과 같은 기능을 적절히 사용하는 것은 소프트웨어 개발에서 중요한 고려 사항이다.