한 클래스 안에 같은 이름의 메서드 여러 개를 정의하는 것
우리는 Hello, World!를 출력할 때 println("Hello, World!")를 사용했다
3이라는 숫자값을 출력하려면 println(3)을 사용했다
위와 같이 서로 다른 데이터타입인데 어떻게 둘다 잘 작동했을까?
-> println()이 오버로딩된 메소드이기 때문
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(int x)
...
PrintStream 클래스는 어떤 종류의 매개변수를 지정해도 출력할 수 있도록
위와 같이 오버로딩된 println메서드를 정의해놓고 있다.
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다
위의 println()만 봐도 모두 매개변수의 타입이 다른 것을 확인할 수 있다
즉 매개변수의 갯수, 타입에 따라 다른 메서드가 호출되는 것이 오버로딩이다.
같은 역할의 메서드를 같은 이름으로 쓸 수 있다(메서드 이름의 절약)
만약 이름만으로 구별했다면
printlnchar()
printlnString()
printlnInt()
위와 같이 이름이 변경되어야 할 것
기존에는 메서드의 매개변수 개수가 고정적이었으나 JDK 1.5부터 동적으로 지정 가능
public PrintStream printf(String format, Object... args){...}
printf()가 대표적인 예이다
Object... args
가 가변인자이며, 항상 마지막 매개변수이어야 한다
예시로 문자열을 결합하는 메서드를 작성한다면 아래와 같이된다
concatenate(String s1, String s2){...}
concatenate(String s1, String s2, String s3){...}
concatenate(String s1, String s2, String s3, String s4){...}
->concatenate(String...str){...}
가변인자를 이용한 메서드
단, 가변인자는 내부적으로 배열을 이용하기에 비효율적이므로
꼭 필요한 경우에만 가변인자를 사용하자