메소드마다 이름을 다르게 하여 기능을 명확하게 할 수도 있지만, 프로젝트가 커질수록 메소드의 개수 또한 많아지므로 모두 기억하고 사용하기 어렵다. 이때 사용할 수 있는 게 메소드 오버로딩이다.
메소드 오버로딩은 메소드 이름을 통일하여 여러 개 정의하는 것을 의미하며, 이때 메소드의 매개변수의 개수, 순서, 또는 타입이 다르도록 하여 중복 정의가 가능하다.
동일한 이름의 메소드가 다양한 상황에서 사용되며, 메소드 호출 시 전달되는 인자의 타입이나 개수에 따라 적합한 메소드가 자동으로 선택되어 개발을 편하게 해 준다. 이러한 구현이 어렵지 않으므로 실제로 많이 사용되는 기술이기도 하다.
그럼, 메소드를 여러 개 선언해 보면서 위의 조건이 어떻게 적용되는지 알아보도록 하자!
💡메소드 오버로딩 구현 가능 조건
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() {} // 반환값의 자료형이 다르더라도 불가능
매개변수의 개수와 자료형이 같은 것은 이름만 다른 경우이므로 불가능하다.
메소드 오버로딩은 매개변수의 개수와 자료형에 의존한다는 점을 기억하며, 위와 같이 불가능한 조건을 알아두는 것이 좋다.
메소드마다 이름을 다르게 하여 기능을 명확하게 할 수도 있지만, 프로젝트가 커질수록 메소드의 개수 또한 많아지므로 모두 기억하고 사용하기 어렵다. 이때 사용할 수 있는 게 메소드 오버로딩이다.
메소드 오버로딩은 메소드 이름을 통일하여 여러 개 정의하는 것을 의미하며, 이때 메소드의 매개변수의 개수, 순서, 또는 타입이 다르도록 하여 중복 정의가 가능하다.
동일한 이름의 메소드가 다양한 상황에서 사용되며, 메소드 호출 시 전달되는 인자의 타입이나 개수에 따라 적합한 메소드가 자동으로 선택되어 개발을 편하게 해 준다. 이러한 구현이 어렵지 않으므로 실제로 많이 사용되는 기술이기도 하다.
그럼, 메소드를 여러 개 선언해 보면서 위의 조건이 어떻게 적용되는지 알아보도록 하자!
💡메소드 오버로딩 구현 가능 조건
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() {} // 반환값의 자료형이 다르더라도 불가능
매개변수의 개수와 자료형이 같은 것은 이름만 다른 경우이므로 불가능하다.
메소드 오버로딩은 매개변수의 개수와 자료형에 의존한다는 점을 기억하며, 위와 같이 불가능한 조건을 알아두는 것이 좋다.