자바에서 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다. 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '오버로딩(overloading)'이라 한다.
<println 메서드>
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)
오버로딩을 하기 위해서는 다음 세 조건을 만족시켜야 한다.
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 반환 타입은 관계없다.(오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로)
몇 가지의 예를 들어 오버로딩 조건을 설명해보겠다.
int add(int a, int b) { return a+b; }
int add(int x, int y) { return x+y; }
위의 예는 매개변수의 이름만 다를 뿐 타입이 같기 때문에 오버로딩이 성립되지 않는다. 오버로딩의 두번 째 조건을 어긴 예시이다. 컴파일하면, 'add(int,int) is already defined(이미 같은 메서드가 정의되었다).'라는 메시지가 나타날 것이다.
int add(int a, int b) { return a+b; }
long add(int a, int b) { return (long)(a+b); }
이번 예는 리턴타입만 다른 경우이다. 매개변수의 타입과 개수가 일치하기 때문에 add(3,3)과 같이 호출하였을 때 어떤 메서드가 호출될 것인지 결정할 수 없기 때문에 오버로딩으로 간주되지 않는다. 앞선 예시와 마찬가지로 이번 예시 또한 'add(int,int) is already defined'에러가 발생 할 것이다.
long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }
두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가 다른 경우이다. 이 경우 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 오버라이딩으로 간주한다.
출처: 자바의 정석 기초편(저자: 남궁성, 출판사:도우출판)
'java > 객체지향' 카테고리의 다른 글
[객체지향] this()와 this (0) | 2021.07.12 |
---|---|
[객체지향] 생성자 (0) | 2021.07.12 |
[객체지향] 메서드 간의 호출과 참조 (0) | 2021.07.09 |
[객체지향] static 메서드와 인스턴스 메서드 (0) | 2021.07.09 |
[객체지향] return문과 반환값 (0) | 2021.07.09 |