5. 메소드 오버로딩
오버로딩(Overloading)이란, “과적하다”라는 뜻을 갖고 있습니다. 과적이란 트럭 따위에 원래의 탑재량을 넘겨싣는 것을 말하기도 한다. 메소드 오버로딩은 하나의 메소드 이름에 여러개의 구현을 올리는 것을 뜻한다. 이해를 돕기위해 예를 들어보도록 하겠습니다.
1 2 3 4 | int Plus(int a, int b) { return a+b; } |
현재는 int 형식의 매개변수와 반환형식을 갖고있는 Plus() 메소드만 있지만, double형식을 지원하는 버전을 추가해야 된다고 생각해보자. 이미 Plus()라는 메서드가 있으니 다른이름으로 재정의해야할까? 답은 아니다.
추메서드를 오버로딩하여 사용하면 Plus()라는 이름을 그대로 사용할 수 있다. 아래의 예제를 보자
ex)
1 2 3 4 5 6 7 8 | int Plus(int a, int b) { return a+b; } double Plus(double a, double b) { return a+b; } |
이런식으로 오버로딩을 해놓으면 컴파일러가 메소드를 호출코드에 사용되는 매개변수의 수와 형식을 분석해서 어떠한 종류의 메소드가 호출되는지를 찾아준다.
다음은 오버로딩된 Plus() 메소드를 호출하는 예제입니다.
1 2 | int result1 = Plus(1,2); double result2 = Plus(3.1,2.4); |
메소드 오버로딩은 이름에 대한 고민을 줄여 주는 동시에, 코드를 일관성 있게 유지해 줍니다. 일관성 있는 코드는 메소드의 작성자에게도 도움을 주지만, 메소드의 사용자에게도 높은 생산성을 제공합니다. 예를 들어 System.Console 클래스에서 WriteLine() 메소드는 모두 19개 버전을 오버로딩하고 있지만, 우리는 버전을 의식하지 않고 자유롭게 이를 사용해 왔습니다. 만약 오버로딩이 없었다면 WriteLine()메소드는 각 구현에 따라 19개의 이름으로 나뉘었을겁니다.
6. 가변길이 매개 변수
프로그래밍을 하다 보면 그저 매개변수의 “수”가 다르다는 이유만으로 똑같은 메소드를 여러 가지 버전으로 오버로딩을 하고 싶을 때가 있습니다. 이런 경우를 위해 C#은 “가변길이 매개 변수”라는 기능을 제공해준다.
가변길이 매개변수란, 그 개수가 유연하게 변할 수 있는 매개 변수를 말합니다. 이것을 이용하면 다음과 같이 입력되는 모든 매개 변수의 합을 구하는 Sum() 메소드를 오버로딩하지 않고도 구현할 수 있습니다.
1 2 3 4 5 6 7 | ex) int total = 0; total = Sum(1, 2); total = Sum(1, 2, 3); total = Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); //.... |
가변길이 매개변수는 params 키워드와 배열을 이용해서 선언합니다. 다음은 가변길이 매개 변수를 이용해서 모든 매개 변수의 합을 구해 반환하는 Sum() 메소드의 구현이다. 이렇게 구현한 메소드는 앞에서 본 코드에서처럼 매개 변수를 달리해서 호출할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 | int Sum(params int[] args) { int sum = 0; for(int i=0; i<args.Length; I++) { sum += args[i]; } return sum; } |
이런식으로 구현을하면 메소드 오버로딩은 필요 없다고 생각하게 될 수도 있지만 큰 오산이다. 메소드 오버로딩은 매개 변수의 수뿐 아니라 형식이 다른 경우에 사용할 수 있다 또한 매개 변수의 개수가 유한하게 정해져 있다면 가변길이 매개 변수보다는 메소드 오버로딩을 사용하는 것이 적합하다. 가변길이 매개 변수는 형식은 같으나 매개 변수의 개수만 유연하게 달라질 수 있는 경우에 적합하다.
7. 명명된 매개 변수
메소드를 호출할 때 매개 변수 목록 중 어느 매개 변수에 데이터를 할당할 것인지를 지정하는 것은 “순서”이다. 가령 void MyMethod(int a, int b, int c)와 같이 선언된 메소드를 MyMethod(1, 2, 3)이라고 호출하면 매개 변수의 순서에 따라 a에는 1, b에는 2, 그리고 c에는 3이 할당된다.
대개의 경우 순서에 근거해서 매개변수에 데이터를 할당하는 스타일을 사용하지만, C#은 또 다른 스타일도 지원한다. 바로 명명된 매개 변수(Named Parameter)라는 건데, 말 그대로 메소드를 호출할 때 매개 변수의 이름에 근거해서 데이터를 할당할 수 있는 기능이다. 명명된 매개 변수를 사용하기 위해 메소드 선언에 손댈 일은 전혀 없다. 메소드를 호출할 때에만 매개 변수의 이름 뒤에 콜론(:)을 붙인 뒤 그 뒤에 할당할 데이터를 넣어 주면 된다. 다음은 명명된 매개 변수의 예제이다.
1 2 3 4 5 6 7 8 | static void PrintProfile(string name, string phone) { Console.WriteLine("Name : {0}, Phone : {1}",name, phone); } static void Main(string[] args) { PrintProfile(name : “박찬호”, phone : "010-123-1234") } |
얼핏 보기에는 명명된 매개 변수가 더 많은 코드를 타이핑하도록 만들므로 생산성을 떨어트리는 것 같지만 일단 명명된 매개 변수를 이용해서 코드를 작성해 놓고 나면 코드가 훨씬 읽기 좋아진다. 매번 명명된 매개 변수를 사용하는 것은 어렵겠지만, 매개 변수가 너무 많아 어느 매개 변수에 어느 데이터를 할당하고 있는지 분간이 어려운 경우에는 명명된 매개 변수가 분명히 도움이 될 것이다.
8. 선택적 매개 변수
메소드의 매개 변수는 기본값을 가질 수 있습니다. 그러니까 다음과 같이 매개 변수를 특정 값으로 초기화하듯 메소드를 선언할 수 있다는 겁니다.
1 2 3 4 | void MyMethod(int a = 0, int b = 0) { Console.WriteLine("{0}, {1}", a, b); } |
위와 같이 기본값을 가지는 매개 변수는 메소드를 호출할 때 데이터 할당을 생략할 수 있습니다.
MyMethod(3);
물론 필요한 경우에는 데이터 할등을 할 수도 있습니다. 기본값을 가지는 매개 변수는 필요에 따라 데이터를 할당하거나 할당하지 않을 수 있기 때문에 이를 “선택적 매개변수”라고 부른다.
MyMethod(3,4);
선택적 매개 변수는 항상 필수 매개 변수 뒤에 와야 합니다. 물론 핈구 매개 변수가 하나도 없는 경우에는 이 규칙에 신경 쓰지 않아도 된다. 다음은 선택적 매개 변수의 선언 예이다.
ex)
1 2 3 4 5 6 7 8 9 10 11 12 | void MyMethod_0(int a = 0) { Console.WriteLine("{0}", a); } void MyMethod_1(int a, int b = 0) { Console.WriteLine("{0}, {1}", a, b); } void MyMethod_0(int a, int b, int c = 10, int d = 20) { Console.WriteLine("{0}, {1}, {2}, {3}", a, b, c, d); } |
선택적 매개 변수는 메소드의 사용자에게 사용하지 않는 매개 변수를 염두에 두지 않도록 편의를 제공하지만, 또 한편으로는 모호함이라는 스트레스도 같이 줍니다. 코드를 작성할 때는 인텔리센스의 도움을 받아 내가 어느 매개 변수에 데이터를 할당하지는 파악할 수 있지만, 작성한 지 한참이 지난 코드를 다시 들여다 보면 내가 어느 코드에 데이터를 할당했는지 분간이 잘 안 될 때도 있습니다. 매개 변수의 수가 많고 여기에 선택적 매개 변수도 여럿 포함되면 문제는 더 심각해집니다. 이런 경우에는 명명된 매개 변수의 도움을 받으면 쉽게 문제를 풀 수 있습니다.
'IT > C#' 카테고리의 다른 글
[C#]클래스의 이해 3-2 (0) | 2014.05.27 |
---|---|
[C#]클래스의 이해3-1 (0) | 2014.05.16 |
[C#]메소드와 매개변수 (0) | 2014.05.13 |