오버로딩
자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩' 이라고 한다.

같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다.
오버로딩이 성립되려면 아래와 같은 조건이 성립되어야 한다.
- 메서드 이름이 같아야한다.
- 매개변수 개수 또는 타입이 달라야 한다.
- 반환 타입은 관계없다.

이어서 아래의 코드도 오류가 난다.
<java />
public class Main {
public void test(Test t) {
Test.add(3, 3);
}
}
class Test {
static long add(int a, long b) {
System.out.println("1");
return a + b;
}
static long add(long a, int b) {
System.out.println("2");
return a + b;
}
}
메서드 이름도 같고, 타입도 다른데 왜 오류가 날까?
그 이유는 Test.add(3,3) 의 3의 타입이 어떤건지 모호하기 때문이다. (= 명확하지 않다.)
어떤 메서드를 골라야할지 컴파일을 할 수 없다.
오버로딩의 올바른 예
매개변수는 다르지만 같은 의미의 기능수행을 한다. (같은 작업)
<java />
package test;
public class Main {
public static void main(String[] args) {
Test mm = new Test();
// int result = mm.add(3,3);
// System.out.println("mm.add(3, 3) 결과:" + result);
// 그래서 먼저 메서드가 호출된다.
System.out.println("mm.add(3, 3) 결과:" + mm.add(3, 3)); // 위의 2문장을 합친 것이다.
}
}
class Test {
int add(int a, int b) {
System.out.print("int add(int a, int b) - ");
return a + b;
}
long add(long a, long b) {
System.out.print("long add(long a, long b) - ");
return a + b;
}
int add(int[] a) {
System.out.print("int add(int[] a) -");
int result = 0;
for (int i = 0; i < a.length; i++) {
result += a[i];
}
return result;
}
}
.출력 결과
<java />
int add(int a, int b) - mm.add(3, 3) 결과:6
출력결과를 보면 add메서드가 println 메서드보다 먼저 호출되는지 의아할 수 있다.
하지만 해당 코드의 위 주석 2줄을 생각하면 된다.
'Study > Java' 카테고리의 다른 글
Java. 생성자 this(), 참조변수 this (0) | 2022.04.03 |
---|---|
Java. 생성자 (constructor) (0) | 2022.04.03 |
Java. static 메서드와 인스턴스 메서드 (0) | 2022.04.02 |
Java. 기본형과 참조형 매개변수, 참조형 반환타입 (0) | 2022.04.01 |
Java. 호출 스택 (call stack) (0) | 2022.04.01 |