728x90
오버로딩(Overloading)
자바에서 한 클래스 내에서 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것을 "메소드 오버로딩(Method Overloading)" 또는 간단히 "오버로딩(Overloading)"이라 한다.
메소드 오버로딩 구분 요건은 아래와 같다.
- 메소드 이름이 같아야 한다.
- 매개변수의 개수, 타입 또는 순서가 달라야 한다.
- 반환 타입은 관계 없다.
위의 조건을 만족시키지 못하는 메소드는 중복 정의로 간주되어 컴파일시에 에러가 발생한다. 그리고 오버로딩된 메소드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
사용 예
// 매개변수 개수가 다른 경우의 메소드 오버로딩
class Mt01 {
void p(int a, int b) {
System.out.println(a + "\t" + b);
}
void p(int a) {
System.out.println(a);
} // 전달인자 개수를 다르게 한 메소드 오버로딩
}
public static void main(String[] args) {
Mt01 m = new Mt01();
m.p(100);
m.p(100, 200);
}
// 메소드이름이 같아도 인자의 개수가 다르기 때문에 알아서 인식된다.
// 매개변수 타입이 다른 경우의 메소드 오버로딩
class Mt02 {
int abs(int a) {
if(a < 0) {
a = -a;
}
return a;
}
double abs(double a) {
if(a < 0) {
a = -a;
}
return a;
}
} // 매개 변수 자료형 타입이 다르다.
public static void main(String[] args) {
Mt02 m = new Mt02();
System.out.println("-10의 절대값 = " + m.abs(-10));
System.out.println("-10.3의 절대값 = " + m.abs(-10.3));
// 메소드이름이 같아도 인자의 자료형 타입이 다르기 때문에 알아서 인식된다.
// 매개변수 순서가 다른 경우의 메소드 오버로딩
class Mt03 {
long add(int a, long b) {
return a+b;
}
long add(long a, int b) {
return a+b;
}
} // 매개변수 순서를 다르게 한 메소드 오버로딩
public static void main(String[] args) {
Mt03 mt = new Mt03();
System.out.println(mt.add(1, 2L));
System.out.println(mt.add(2L, 1));
}
// 메소드 이름이 같아도 인자의 순서가 다르기 때문에 알아서 인식된다
컴파일 에러 예
// 반환타입은 오버로딩 구현하는데 아무런 영향을 주지 않아 컴파일 에러가 발생한다.
class Mt04 {
void z(int a) {
System.out.println(a);
}
int z(int a) {
return a;
} // 메소드 명 앞에 리턴타입을 다르게 한 오버로딩 문법은 적용 안된다.
}
// 리턴타입을 다르게 한 오버로딩 문법은 적용 안된다.
자바 가변인자(Varargs, Variable Argument List)
자바 1.5에서 추가 된 가변인자 문법이다. "자료형타입...배열명" 형식으로 이 문법은 매개변수 개수가 다른 메소드가 오버로딩 된 경우 그 인자 개수만큼 가변인자로 받아서 배열로 처리하면 한 개의 메소드만 정의하면 된다.
가변인자 문법을 사용하지 않으면 인자개수만큼 중복 메소드명을 오버로딩 시켜야한다. 그만큼 불필요한 코드라인이 늘어나므로, 가변인자를 이용해 한 개의 메소드만 정의하면 코드줄 수가 줄어든다.
void z(int ... arr) { // 가변인자를 이용해 메소드를 생성.
System.out.println("인자 개수 = " + arr.length);
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println("\n========================");
}
public static void main(String[] args) {
Mt05 m = new Mt05();
m.z(10);
m.z(10, 20);
m.z(10, 20, 30);
} // 메인 메소드에서 z메소드 호출.
// 출력 결과
인자 개수 = 1
10
========================
인자 개수 = 2
10 20
========================
인자 개수 = 3
10 20 30
========================
정리
오버로딩 성립되기 위한 조건
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수나 타입이 달라야한다.
'Language > Java' 카테고리의 다른 글
[Java] 실습 (Overriding Overloading) (0) | 2022.08.12 |
---|---|
araFarm (0) | 2022.08.11 |
[Java] extends, implements의 차이 (0) | 2022.08.11 |
[Java] 다차원 배열 (multi-dimensional array) (0) | 2022.08.11 |
[Java] 해시테이블 (Hashtable) (0) | 2022.08.11 |