[C#] 메소드 오버로딩, 가변길이 매개 변수, 선택적 매개 변수


1. 메소드 오버로딩


하나의 메소드 이름에 여러 개의 구현을 올리는 것.



1
2
3
4
int Plus(int a, int b)
{
    return a + b;
}
cs


int형식의 매개 변수와 반환 형식을 가진 메소드가 있다고 해보자.

그런데, double형식을 지원하는 버전도 추가해야되는 상황이 되었다.


그러면 PlusDouble()이라는 메소드를 새로 만들어줘야 할까?


아니다. 이 때 메소드 오버로딩을 사용하면 Plus()라는 이름을 그대로 사용할 수 있다.

하나의 메소드 이름에 여러 개의 구현을 올리는 메소드 오버로딩이다.



1
2
3
4
5
6
7
8
9
int Plus(int a, int b)
{
    return a + b;
}
 
double Plus(double a, double b)
{
    return a + b;
}
cs


이렇게 오버로딩 해놓으면 컴파일러가 메소드를 호출했을 때,

매개 변수의 수와 형식을 분석해서 어떤 메소드를 호출해야 되는지 찾아준다.


이렇게, 메소드 오버로딩은 이름에 대한 고민을 줄여주는 동시에 코드에 일관성을 유지해준다.



※ 유의사항

- 반환형을 다르게 한다.

- 매개변수의 자료형을 다르게 한다.

- 매개변수의 숫자를 다르게 한다.




2. 가변길이 매개 변수


그저 매개 변수의 "수"가 다르다는 이유만으로 똑같은 메소드를 여러가지 버전으로 오버로딩 해야 할 때가 있다.

이런 경우를 위해 C#은 "가변길이 매개 변수"라는 기능을 제공한다.


가변길이 매개 변수란, 그 개수가 유연하게 변할 수 있는 매개 변수를 말한다.


1
2
3
4
5
6
7
8
int result = 0;
 
result = Sum(1,2);
result = Sum(1,2,3);
result = Sum(1,2,3,4);
result = Sum(1,2,3,4,5);
 
// ...
cs


가변길이 매개 변수는 params 키워드와 배열을 이용해서 선언한다.


1
2
3
4
5
6
7
8
9
10
11
12
int Sum( params int[] array)
{
    int Sum = 0;
    int Count = array.Length;
 
    for(int i = 0; i < Count; i++)
    {
        Sum += array[i];
    }
 
    return Sum;
}
cs


"이게 있으면 메소드 오버로딩은 필요 없네?" 라고 생각할수 있을것이다.

하지만, 매개 변수의 개수가 유한하게 정해져 있다면 가변길이 매개 변수보다는 메소드 오버로딩을 사용하는 것이 적절하다.




3. 선택적 매개 변수


메소드의 매개 변수는 기본값을 가질 수 있다.

매개 변수를 특정 값으로 초기화 하듯 메소드를 선언할 수 있다는 것이다.


1
2
3
4
void MyMethod( int a = 0int b = 0)
{
    Console.WriteLine("{0}, {1}", a, b);
}
cs

결과 : 0, 0


위와같이 기본값을 가지는 매개 변수는 메소드를 호출할 때 데이터 할당을 생략할 수 있다.


1
MyMethod( 3 );
cs

결과 : 3


기본값을 가지는 매개 변수는 필요에 따라 데이터를 할당하거나 할당하지 않을 수 있기 때문에 이를

"선택적 매개 변수"라고 한다.



※ 유의사항

- 선택적 매개 변수는 항상 필수 매개 변수 뒤에 와야 한다.

- 선택적 매개 변수는 메소드 오버로딩과 함께 사용하면 혼란이 야기될수 있으므로 

함께 사용하는 것을 지양한다.


'C#' 카테고리의 다른 글

[C#] interface  (0) 2017.04.03
[C#] 참조에 의한 매개 변수 전달. ref / 출력 전용 매개 변수. out  (0) 2017.03.24
[C#] 공용 형식 시스템.  (0) 2017.03.24
[C#] var형식  (0) 2017.03.24
[C#] Object형식, 박싱과 언박싱.  (1) 2017.03.23