Java/[도서] 자바의 정석

오버로딩(overloading)

Lea Hwang 2022. 5. 5. 00:29

 

 

자바의 정석

Chapter 소제목
6. 객체지향 프로그래밍 4. 오버로딩(overloading)

 

 

오버로딩이란?

메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 합니다.

 

그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있습니다.

이처럼 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 ‘메서드 오버로딩’ , 짧게 줄여서 오버로딩이라 합니다.

 

 

오버로딩의 조건

오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 합니다.

💡 1. 메서드 이름이 같아야 한다.
    2. 매개변수의 개수 또는 타입이 달라야 한다.

위 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시 에러 발생합니다.

 

그리고 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다는 것에 주의해야 합니다.

 

 

오버로딩의 예

[보기 1]
int add(int a, int b) { return a+b; }
int add(int x, int y) { return x+y; }

위 두 메서드는 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에 오버로딩이 성립하지 않습니다.

컴파일을 하면 ‘add(int, int) is already defined’라는 메시지가 출력됩니다.

 

[보기 2]
int add(int a, int b) { return a+b; }
long add(int a, int b) { return (long)(a+b);}

이번 경우는 리턴타입만 다른 경우로 매개변수의 타입과 개수가 일치하기 때문에 오버로딩으로 간주되지 않습니다.

 

[보기 3]
long add(int a, long b) { return a+b; }
long add{long a, int b} { return a+b; }

두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가 다른 경우입니다.

이 경우 호출 시 매개변수의 값에 의해 호출될 메서드 구분이 가능하므로 오버로딩으로 간주합니다.

 

[보기 4]
long add(int a, long b) { return a+b; }
long add{long a, int b} { return a+b; }
long add(int[] a) {
		long result = 0;
		
		for(int i=0; i<a.length; i++ {
				 result += a[i];
		}
		return result;
}

위 메서드들은 모두 바르게 오버로딩되어 있습니다. 정의된 매개변수가 서로 다른 긴 해도, 세 메서드 모두 매개변수로 넘겨받은 값을 더해서 그 결과를 돌려주는 일을 합니다.

 

같은 일을 하지만 매개변수를 달리해야 하는 경우, 이와 같이 이름은 같고 매개변수를 다르게 하여 오버로딩을 구현하여 사용합니다.

 

 

오버로딩의 장점

근본적으로 같은 기능을 하는 메서드들을 각기 다른 이름을 가져야 한다면 이름을 짓기도 어렵고 사용하는 쪽에서도 일일이 구분해서 기억해야 하기 때문에 부담이 될 수 있습니다.

 

하지만 오버로딩을 통해 메서드들이 하나의 이름으로 정의될 수 있다면, 이름이 같으니 같은 기능을 하겠구나 쉽게 예측할 수 있습니다.

 

또 하나의 장점은 메서드의 이름을 절약할 수 있다는 것입니다.