Language/Java

[Java] 메소드 오버로딩 (Method Overloading)

arajo 2022. 8. 11. 16:51
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
========================

정리

오버로딩 성립되기 위한 조건

  • 메서드의 이름이 같아야 한다.
  • 매개변수의 개수나 타입이 달라야한다.