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/

반응형

+ Recent posts