한 클래스 안에 같은 이름의 메서드 여러개 정의하는 것
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)
- 메서드 이름이 같아야한다
- 매개변수의 개수 또는 타입이 달라야 한다
- 반환 타입은 영향없다
//에러! 메서드 중복정의 (1번만 충족하기 때문에 오버로딩이 아니다)
int add(int a, int b){ return a+b;}
int add(int x, int y){ return x+y;}
//에러! 메서드 중복정의 (2번을 충족하지 않는다 / 반환 타입은 영향 없다)
int add(int a, int b){ return a+b;}
long add(int a, int b){ return (long)a+b;}
//오버로딩 충족한다
// 하지만 add(3, 3)을 호출한다면
//컴퓨터가 둘 중 어느걸 사용하려고 했는지 알 수 없어서 에러!! - 모호하다고 뜬다
//(메서드 두개가 ambiguous 하다고 뜬다)
long add(int a, long b){ return (long)a+b;}
long add(long a, int b){ return (long)a+b;}
📌오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능 수행 (하는 작업이 같다)
class MyClass{
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("int 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;
}
}
✔ 자바는 메서드 오버로딩밖에 없지만, c++에 연산자 오버로딩도 있다. 자바에도 연산자 오버로딩을 +로 예를들어보면 세가지 기능을 한다
1. 부호
2. 덧셈
3. 문자열 결합