하나의 클래스에서 같은 이름의 메소드를 여러 개 정의하는 것
클래스 내에서는 변수와 마찬가지로 메소드도 구별되기 위해서 이름이 각기 달라야 한다. 그러나 자바에서는 오버로딩을 통해 같은 이름 메소드를 정의할 수 있다.
오버로딩이 성립되기 위해서는 다음의 조건을 만족해야한다.
위의 조건이 만족되지 않으면 메소드의 중복 정의로 가정되고 컴파일 에러가 발생한다.
주의해야 할 것은 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다는 것이다.
가장 많이 쓰는 메소드 중에 오버로딩이 되어있는 대표적인 것이 바로
println 메소드이다.
Oracle의 자바 공식문서에 쓰인 println 메소드이다.

메소드의 매개변수로 넘겨주는 값의 타입에 따라서 오버로딩된 메소드 중 하나가 선택되어 실행되는 것이다.
int add(int a, int b) { return a + b; }
int add(int x, int y) { return x + y; }
이런 경우는 매개변수의 이름만 다를 뿐 타입과 개수가 일치하기 때문에 오버로딩이 아니다. 수학에서 f(x) = x + 1 과 f(a) = a + 1 의 차이이다.
두 메소드의 결과는 완전히 동일하다.
int add(int a, int b) { return a + b; }
long add(int a, int b) {return (long)(a + b); }
이런 경우는 반환 타입만 다르고 매개변수의 개수와 타입은 일치하기 때문에 오버로딩이 아니다.
이렇게 반환 타입만 다르다면 add(3, 3)을 호출 시 컴파일러가 어느 메소드를 호출해야하는지 모르기 때문에 컴파일 에러가 난다.
long add(int a, long b) { return a + b; }
long add(long a, int b) { return a + b; }
이 경우에는 두 메소드 모두 int형 매개변수와 long형 매개변수가 하나씩 선언되어 있지만, 순서가 다르기 때문에 오버로딩으로 간주된다.
메소드를 호출 시 매개변수의 값에 따라 호출될 메소드를 구분할 수 있기 때문에 정상적으로 컴파일된다.
다만 주의해야할 점은 add(3, 3) 같이 호출 시에는 어느 메소드가 호출된 것인지 알 수 없기에 에러가 발생한다.
int add(int a) { return a + 10; }
int add(int a, int b) { return a + b; }
long add(long a, long b) { return a + b; }
long add(int[] a) {
long result = 0;
for(int i=0; i<a.length; i++) {
result += a[i];
}
return result;
}
위 같은 경우는 모두 정상적인 오버로딩이다.
매개변수의 개수가 다르거나 타입이 다르다.