7. 오버로딩
인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자들 중(오버로딩 된 여러 생성자들)의 하나를 선택하여 지정(호출)해줘야 함
public class PianoApp {
public static void main(String args[]) {
Piano myPiano = new Piano();
myPiano.pressKeyboard("C 샾","D 샾");
myPiano.pressKeyboard("C","D 플랫","E 플랫");
}
}class Piano {
public void pressKeyboard(String c, String d) {
System.out.println(c + d);
}
public void pressKeyboard(String c, String d, String e) {
System.out.println(c + d + e);
}
// ...
}하나의 클래스에는 여러 개의 메서드가 존재할 수 있기 때문에 메서드 역시 변수와 마찬가지로 같은 클래스 내에서는 서로 구별될 수 있어야 함
서로 구별하기 위한 가장 대표적인 방법은 메서드의 이름을 서로 다르게 하여 메서드를 작성하는 것
하지만 Java에서는 특정한 목적을 위해 하나의 클래스 내에 이미 정의된 메서드 이름과 같은 이름을 가진 메서드를 중복해서 정의할 수 있음
이러한 개념을 Method Overloading(메서드 오버로딩) 이라고 함
하지만 메서드의 이름뿐만 아니라, 매개변수의 타입이나 개수까지 모두 동일할 경우,
메서드 호출 시점에서 구분이 불가능하기 때문에 파라미터의 타입과 개수는 서로 다르도록 제한하였음
따라서 매개변수(Parameter)의 개수 또는 타입만 서로 다르면, 같은 메서드 이름을 사용해서 메서드를 중복해서 정의할 수 있음
오버로딩의 어원
Overloading의 사전적 의미는 “과적(過積)하다, 많이 싣는 것”
하나의 동일한 메서드 이름으로 여러 겹의 메서드를 구현해 내려간다는 맥락에서 붙여진 명칭
// 일반 덧셈 메서드
// 1. int a, b를 인수로 받는 메서드 add()
int add(int a, int b) { return a + b; }
// 2. int x와 y를 인수로 받는 메서드 add()
int add(int x, int y) { return x + y; }
add(2, 3);add(2, 3) 호출 시, 1번과 2번 중 실제로 호출되는 메서드는?
1-2. add(2L, 3) 호출 시, 1번과 2번 중 실제로 호출되는 메서드는?
long add(int a, long b) { return a + b; }
// 2.
long add(long a, int b) { return a + b; }
add(2L, 3);add(2L, 3)을 호출할 때 실제 호출되는 메서드는?
2. 메서드를 중복해서 정의(Overloading)하기 위한 문법 규칙
2-1. 메서드의 이름이 서로 동일해야함
// add()로 서로 동일함
add(int a);
add(int a, int b);2-2. 매개변수(Parameter)의 개수가 서로 다를 경우
// add()로 서로 동일하며, 매개변수의 개수가 서로 다름
add(int a);
add(int a, int b);2-3. 매개변수가 작성된 순서의 타입이 서로 다를 경우
// add()로 서로 동일하며, 매개변수의 타입이 서로 다름
add(int a);
add(long a);
add(int a, long b); // 첫 번째 인수로 int 타입을 받음
add(long a, int b); // 첫 번째 인수로 long 타입을 받음2-4. 반환 타입은 상관없음(같아도 되고, 서로 달라도 됨)
3. Overloading 개념이 적용된 실제 예시
Java.lang 패키지의 println() 메서드를 보면 다음과 같이 호출할 수 있음
System.out.println();
System.out.println(5); // 5
System.out.println("문자열"); // "문자열"→ 즉, System.out.println() 메서드도 오버로딩 된 것
PrintStream (Java SE 11 & JDK 11 )
오버로딩이 없을 경우, 서로 다른 이름을 가진 메서드들을 개별적으로 구현해야함
System.out.printlnWithInt(5); // 정수값 출력 메서드
System.out.printlnWithString("문자열"); // 문자열값 출력 메서드