메소드마다 이름을 다르게 하여 기능을 명확하게 할 수도 있지만, 프로젝트가 커질수록 메소드의 개수 또한 많아지므로 모두 기억하고 사용하기 어렵다. 이때 사용할 수 있는 게 메소드 오버로딩이다.
메소드 오버로딩은 메소드 이름을 통일하여 여러 개 정의하는 것을 의미하며, 이때 메소드의 매개변수의 개수, 순서, 또는 타입이 다르도록 하여 중복 정의가 가능하다.
동일한 이름의 메소드가 다양한 상황에서 사용되며, 메소드 호출 시 전달되는 인자의 타입이나 개수에 따라 적합한 메소드가 자동으로 선택되어 개발을 편하게 해 준다. 이러한 구현이 어렵지 않으므로 실제로 많이 사용되는 기술이기도 하다.
그럼, 메소드를 여러 개 선언해 보면서 위의 조건이 어떻게 적용되는지 알아보도록 하자!
💡메소드 오버로딩 구현 가능 조건
1. 매개변수의 개수가 달라야 한다.
2. 매개변수의 자료형이 달라야 한다.
public static void test() {}
public static void test(int n) {} // 매개변수 개수가 다르므로 가능
public static void test(int n, int m) {} // 매개변수의 개수가 다르므로 가능
public static void test(String s) {} // 매개변수의 자료형이 다르므로 가능
test();
test(10);
test("Isaac");
test(10, 20);
이름만 가지고는 식별을 못하지만, 매개변수를 가지고 식별이 가능하므로 메소드 이름을 똑같이 만들 수 있다. 또한, 매개변수의 자료형이 다르면 각각 무엇을 호출하는지 분명하기 때문에 이 역시 메소드 오버로딩이 가능하다.
💡메소드 오버로딩의 활용
public class Examples {
public static void main(String[] args) {
Example example = new Example();
print(100); // 100
print(3.14); // 3.14
print("Hello"); // Hello!
}
// 정수형 매개변수를 받는 메소드
public void print(int n) {
System.out.println(n);
}
// 실수형 매개변수를 받는 메소드
public void print(double n) {
System.out.println(n);
}
// 문자열 매개변수를 받는 메소드
public void print(string n) {
System.out.println(n);
}
}
위의 예시에서 Example 클래스에는 print라는 이름의 메소드가 세 번 정의되어 있다.
첫 번째 print() 메소드는 정수형을, 두 번째 print() 메소드는 실수형을, 세 번째 print() 메소드는 문자열 매개변수를 받는다.
이렇게 메소드 오버라이딩을 사용하여 print() 메소드만을 사용하여 정수형, 실수형, 문자열을 출력하는 것이 가능하다.
💡메소드 오버로딩 구현 불가능 조건
1. 매개변수의 개수와 자료형이 같으면 불가능하다. (매개변수의 이름만 같은 경우 불가능)
2. 반환값의 자료형이 다르더라도 불가능하다.
public static void test() {}
public static void test() {} // 매개변수의 개수가 같으므로 불가능
public static void test(int n) {}
public static void test(int m) {} // 매개변수의 개수와 자료형이 같으므로 불가능
public static int test() {} // 반환값의 자료형이 다르더라도 불가능
매개변수의 개수와 자료형이 같은 것은 이름만 다른 경우이므로 불가능하다.
메소드 오버로딩은 매개변수의 개수와 자료형에 의존한다는 점을 기억하며, 위와 같이 불가능한 조건을 알아두는 것이 좋다.