뇌를 자극하는 C# 4.0 프로그래밍/ 메소드로 코드 간추리기

메소드란?

  • 메소드가 함수, 프로시져, 서브루틴 등과 다른 점은 클래스 안에 존재한다는 것.

return에 대하여

  • return문은 메소드를 종결시키고 프로그램의 흐름을 호출자에게 돌려준다.

재귀 호출(Recursive Call)

메소드가 자기 자신을 스스로 호출하는 것. 재귀 호출은 코드를 단순하게 구성할 수 있다는 장점이 있는 한편 성능에 나쁜 영향을 주기 때문에 주의해서 사용해야 한다.

매개 변수에 대하여

  • 매개 변수도 메소드 외부에서 메소드 내부로 데이터를 전달하는 매개체 역할을 할 뿐이지 근본적으로는 변수이기 때문에 한 변수를 또 다른 변수에 할당하면 그 데이터가 값형식이든 참조형식이든 상관 없이 변수가 담고 있는 데이터만 복사된다.
  • 이와 같이 메소드를 호출할 때 데이터를 복사해서 매개 변수에 넘기는 것을 “값에 의한 전달(Call by value)”라고 한다.

참조에 의한 매개 변수 전달

int x = 3;
int y = 4;
Swap(ref x, ref y);

void Swap (ref int a, ref int b)
{
    int temp = b;
    b = a;
    a = temp;
}
  • 매개 변수를 “참조에 의한 전달(Call by reference)”로 넘기면 매개 변수가 메소드에 넘겨진 원본 변수를 직접 참조하게 된다. 따라서 메소드 안에서 매개 변수를 수정하면 이 매개 변수가 참조하고 있는 원본 변수에 수정이 이루어지게 된다.
  • 참조에 의한 매개 변수 전달은 ref 키워드를 사용하면 된다.

출력 전용 매개 변수

iint a = 20;
int b = 3;
int c;
int d;
Divide(a, b, out c, out d);

void Divide (int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}
  • 결과를 2개 이상 반환하는 메소드를 만들고자 할 때 ref 키워드를 이용하면 된다. 그런데 C#에서는 out 이라는 보다 안전한 방법을 제공하고 있으므로 그것을 사용하면 좋다.
  • out 키워드를 이용해서 변수를 넘길 때는 메소드가 해댕 매개 변수에 결과를 저장하지 않으면 컴파일러가 에러를 출력한다. 또한 호출된 메소드에서는 입력된 out 매개 변수를 “읽을” 수 없고 오직 “쓰기”만 가능하다. 출력 전용 매개 변수를 다른 용도로 사용하는 것을 금지하는 것.

메소드 오버로딩

int Plus (int a, int b)
{
    return a + b;
}

double Plus (double a, double b)
{
    return a + b;
}

// 위의 매개 변수를 double로 받는 것은 일반화 프로그래밍을 하는 편이 나아 보여서 매개변수 개수와 형식이 다른 버전을 별도로 추가하였다.
int Plus (int a, long b, double c)
{
    return a + b + c;
}
  • 메소드 오버로딩이란 하나의 메소드 이름에 여러 개의 구현을 올리는 것을 의미한다.
  • 이런 식으로 오버로딩을 해 놓으면 컴파일러가 메소드 호출 코드에 사용되는 매개 변수의 수와 형식을 분석해서 –오로지 매개 변수만 분석하며 반환 형식은 따지지 않는다– 어떤 버전이 호출될 지를 찾아 준다. 실행할 메소드의 버전을 찾는 작업이 컴파일 타임에 이루어지므로 성능 저하는 없다.

가변길이 매개 변수

int total = 0;

total = Sum(1, 2);
total = Sum(1, 2, 3);
total = Sum(1, 2, 3, 4, 5, 6, 7, 8, 9);

int Sum (params int[] args)
{
    int sum = 0;

    for (int i = 0 ; i < args.Length ; i++ )
    {
        sum += args[i];
    }

    return sum;
}
  • 가변 길이 매개 변수란 개수가 유연하게 변할 수 있는 매개 변수로 이를 이용하면 모든 매개 변수의 합을 구하는 메소드를 따로 오버로딩 하여 구현하지 않아도 된다.
  • 가변길이 매개변수는 변수의 형식이 같은 경우에만 유효하므로 변수의 형식이 달라지는 경우는 오버로딩을 해야 한다.

명명된 매개 변수

PrintProfile(name: "박수영", phone: "010-1234-5678");

void PrintProfile (string name, string phone)
{
    Console.WriteLine("Name: {0}, Phone: {1}", name, phone);
}
  • C# 에서는 명명된 매개 변수(Named Parameter)를 이용해서 매개 변수에 데이터를 할당할 수 있다.
  • 명명된 매개 변수를 이용하면 코드 가독성도 좋아지며 매개 변수가 많아졌을 때 순서가 꼬여 발생할 수 있는 오류를 줄일 수 있다는 점에서 좋은 방법이라 할 수 있다.

선택적 매개 변수

MyMethod();
MyMethod(1);
MyMethod(1, 2);

void MyMethod (int a = 0, int b = 0)
{
    Console.WriteLine("{0}, {1}", a, b);
}
  • 메소드의 매개 변수는 위 코드와 같이 기본값을 가질 수 있다. 이러한 기본값을 가지는 매개 변수는 필요에 따라 데이터를 할당하거나 할당하지 않을 수 있기 때문에 “선택적 매개 변수(Optional Parameter)”라고 부른다.
  • 선택적 매개 변수는 항상 필수 매개 변수 뒤에 와야 한다.
  • 선택적 매개 변수는 편의성이 있긴 하지만 모호함도 함께 발생하므로 주의해서 사용할 필요가 있다. 사용할 때는 명명된 매개 변수와 함께 사용하면 낫다.
It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

The author

지성을 추구하는 디자이너/ suyeongpark@abyne.com

댓글 남기기