한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩'이라고 한다.
같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다.
오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
가변인자는 '타입... 변수명'과 같은 형식으로 선언하며, PrintStreadm클래스의 printf()가 대표적인 예다.
public PrintStream printf(String format, Object... args)
{
...
}
위와 같이 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다. 그렇지 않으면, 컴파일 에러가 발생한다. 가변인지 아닌지를 구별할 방법이 없기 떄문에 허용하지 않는 것이다.
//컴파일 에러 발생 - 가변인자는 항상 마지막 매개변수여야 한다.
public PrintStream printf(Object... args, String format)
{
...
}
만일 여러 문자열을 하나로 결합하여 반환하는 concatenate메서드를 작성한다면, 아래와같이 매개변수의 개수를 다르게 해서 여러 개의 메서드를 작성해야할 것이다.
String concatenate(String s1){...}
String concatenate(String s1, String s2){...}
String concatenate(String s1, String s2, String s3){...}
이럴 때, 가변인자를 사용하면 메서드 하나로 간단하게 대체할 수 있다.
String concatenate(String... str){...}
System.out.println(concatenate(new String[] {"A", "B"}));
//배열도 가능
- 가변인자는 배열을 이용하는 것이다. 그래서 가변인자가 선언된 메서드를 호출할 때 마다 배열이 새로 생성된다. 이처럼 비효율이 숨어있으므로 꼭 필요한 경우에만 가변인자를 사용해야 된다.
- 가변인자를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 구별되지 못하는 경우가 발생하기 쉽다.
따라서, 가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.