오버로딩(Overloading)
한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것
오버로딩의 조건
1. 메소드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
오버로딩의 예
•
println() : 같은 println 메소드로 보일지라도,
실제 매개변수로 지정하는 값의 타입에 따라 호출되는 println 메소드는 달라짐.
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)
Java
// 같은 메소드의 경우 : 매개변수의 이름만 다르고 타입이 같을 때
int add (int a, int b) { return a+b; }
int add (int x, int y) { return x+y; }
// 같은 메소드의 경우 : 리턴타입만 다를 때
int add (int a, int b) { return a+b; }
long add (int a, int b) { return (long) (a+b); }
// 오버로딩이 성립하는 경우 : 매개 변수의 타입(순서)이 다른 경우
long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }
// 오버로딩이 성립하는 경우 : 매개 변수의 타입이 완전 다른 경우
int add(int a, int b) { return a+b; }
long add(long a, long b) { return a+b; }
long add(int[] a) {
long result = 0;
for (int i=0; i < a.length; i++) {
result += a[i];
}
return result;
}
Java
오버로딩의 장점
•
메소드 네이밍에 있어서 수고로움이 없다.
◦
println()과 같이 단순 출력 메소드인데
매개변수 타입에 따라 전부 이름을 달리 지어야 한다 생각하면 끔찍..
◦
간단한 이름은 기능 파악, 효율면 등에서 장점이 크다!
OverloadingTest.java
가변 인자(varargs)와 오버로딩
•
가변 인자(Variable Arguments) : 매개 변수의 개수를 동적으로 지정가능한 기능
•
타입... 변수명 형식으로 선언
가변 인자 외에 매개 변수가 더 있다면, 가변 인자를 제일 마지막으로 선언
public PrintStream printf(String format, Object... args) { ... }
Java
•
여러 문자열을 하나로 반환하는 concatenate 메소드에 가변 인자를 사용
String concatenate(String... str) { ... }
// 동적으로 인자의 개수 설정 가능
System.out.println(concatenate());
System.out.println(concatenate("a"));
System.out.println(concatenate("a", "b"));
System.out.println(concatenate(new String[]{"A", "B"})); // 배열도 가능
Java
•
내부적으로 배열을 사용하기 때문에 동적인 인자 개수 설정이 가능한 것
→ 비효율적이긴 한 거라 꼭 필요한 곳에서만 사용
•
매개 변수를 배열로 지정할 때와 차이점? → 인자를 꼭 지정해줄 필요가 없다!
VarArgsEx.java