Section 47.7: 메소드 오버로딩
정의 : 복수개의 메소드를 동일한 이름으로 파라미터 종류만 다르게 선언하는 것을 메소드 오버로딩이라 칭한다. 메소드 오버로딩은 다양한 파라미터 타입에 대해 동일한 목적의 함수 기능을 작성하고자 할 때 사용된다.
영향을 끼치는 인자들:
- 파라미터의 갯수
- 파리미터들의 타입
- 반환 타입[^1]
다양한 파라미터를 인자로 받아 영역의 크기를 계산하여 반환해주는 Area
라는 이름의 메소드를 생각해보자.
예제:
public string Area(int value1)
{
return String.Format("Area of Square is {0}", value1 * value1);
}
이 메소드는 하나의 파라미터륵 받아 문자열을 반환할 것이다. 이 메소드를 5라는 정수값을 파라미터로 넘기며 호출한다면, 반환 문자열은 "Area of Square is 25" 가 될 것이다.
public double Area(double value1, double value2)
{
return value1 * value2;
}
유사하게, 두개의 double
값을 위 메소드에 넘긴다면 반환값은 두 값을 곱한 double
타입의 값이 될 것이다. 이는 직사각형의 면적을 구하는데 사용될수 있을 것이다.
public double Area(double value1)
{
return 3.14 * Math.Pow(value1,2);
}
위 메소드는 원의 면적을 구하는데 사용될 수 있으며, 반지름 double
값을 이용해 면적을 마찬가지로 double
타입으로 반환하게 된다.
위 메소드들은 서로간에 충동을 야기하지 않고 각각 호출이 가능하다 - 컴파일러는 각 메소드 호출시의 파라미터를 보고 어느 버전의 Area
메소드가 호출되어야 할 지를 결정해 준다.
string squareArea = Area(2);
double rectangleArea = Area(32.0, 17.5);
double circleArea = Area(5.0); // 모두 유효한 호출이며 컴파일에 성공할 것이다.
[^1] 유의할 점은 반환값 하나만 가지고는 두개의 메소드를 구별할 수 없다는 점이다. 예를 들어 만약 동일한 파라미터 목록을 갖는 두개의 Area
메소드를 아래와 같이 선언한 경우를 확인하여 본다:
public string Area(double width, double height) { ... }
public double Area(double width, double height) { ... }
// 이 코드는 컴파일되지 않을 것이다.
만약 사용자의 클래스가 동일한 이름을 갖되 각기 다른 타입을 반환하게 만들 필요가 있다면, 인터페이스를 구현하고 명시적으로 사용 방식을 정의함으로써 불명확성 관련 (ambiguity) 문제를 해결할 수 있다.
public interface IAreaCalculatorString {
public string Area(double width, double height);
}
public class AreaCalculator: IAreaCalculatorString {
public string IAreaCalculatorString.Area(double width, double height) {
...
}
// 이제 IAreaCalculatorString 인터페이스를 통해 불리는 경우에만
// 위 메소드가 사용됨을 명시하였으므로 불명확성 문제를 해결할 수 있다.
public double Area(double width, double height) {
...
}
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
'번역 > C# Notes for Professionals' 카테고리의 다른 글
48: 확장 (Extension) 메소드 (0) | 2022.09.21 |
---|---|
47.8: 메소드 접근 권한들 (0) | 2022.09.21 |
47.6: 파라미터 기본값 (default parameter) (0) | 2022.07.26 |
47.5: 반환 (Return) 타입 (0) | 2022.07.26 |
47.4: 매개변수 (Parameter) 와 전달 인자 (Argument) (0) | 2022.07.26 |