본문 바로가기

Java/객체지향프로그래밍

[Java] 오버로딩(overloading) - 코딩밥상

오버로딩이란?

 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.

이처럼, 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 '오버로딩(overloading)'이라 한다.

 

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.

이를 보면 알겠지만, 컴파일러는 매개변수로 오버로딩을 구별한다. 즉, 오버로딩된 매서드들은 매개변수에 의해서만 구별될 수 있으므로 반환타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다. 

오버로딩의 장점

 근본적으로 같은 기능을 하는 메서드들이 있다고 할 때, 서로 다른 이름을 가져야 한다면 작성시 이름을 짓기도 어렵고, 사용시 메서드들의 이름을 일일이 구분해서 기억해야하기에 부담이 된다.

하지만 오버로딩을 통해 여러 메서드들이 하나의 이름으로 정의될 수 있다면, 작성시와 사용시 모두 위와 같은 부담을 줄일 수 있다.

 

 또 하나의 장점은 메서드의 이름을 절약할 수 있다는 것이다. 하나의 이름으로 여러개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되었어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.

오버로딩의 가장 대표적인 예로 println() 메서드를 생각하면 이러한 장점들을 직접 느낄 수 있다.


가변인자(varargs)와 오버로딩

 메서드의 매개변수를 동적으로 지정해 줄 수 있는데, 이 기능을 '가변인자(variable arguments)'라고 한다.

가변인자는 '타입... 변수명'과 같은 형식으로 선언하며, PrintStream클래스의 printf()가 대표적인 예이다.

public PrintStream printf(String format, Object... args){//생략}

위와 같이 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다. 그렇지 않으면, 컴파일 에러가 발생하는데 가변인자인지 아닌지 구별할 방법이 없기 때문에 허용하지 않는 것이다.

 

가변인자는 '내부적으로' 배열을 이용한다. 그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다. 따라서 편리하지만, 이러한 비효율이 숨어있으므로 꼭 필요한 경우에만 사용하자.

 

주의할 점으로 가변인자를 선언한 메서드를 오버로딩하면, 변수의 타입이 겹치면 메서드를 호출했을 때 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야 한다. 가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.