NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 15-2. C# 메서드의 파라메터. (Named Parameter: 명명된 매개 변수, Optional Parameter: 선…

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 메서드의 파라메터(Parameter)에 대해서 알아보도록 하겠습니다.

     

    보통 개발자들은 파라메터를 "인자" 또는 "인수"라고 부릅니다. 하지만 이것은 명확하게 구분되는 특징이 있으며, 혼동해서 사용하면 안됩니다. 이 강좌에서 말하는 파라메터는 메서드의 "인자"를 지칭하며 인자는 메서드 원형에서 정의한 "매개 변수"입니다. 우리가 흔히 말하는 "인수"는 메서드를 호출하기 위해 넘기는 "" 또는 "맴버 변수"를 나타내며 아규먼트(Argument)라고 칭해야 맞습니다. 또한, 아규먼트는 프로그램의 진입점(Main, Init)의 시작시 넘겨주는 변수를 나타내는 용어로 사용되기도 합니다.

     

    12라인과 같이 메서드의 원형에 정의되는 변수를 파라메터(Parameter, 인자)라고 하고, 20라인과 같이 메서드를 호출할 때 사용되는 변수를 아규먼트(Argument, 인수)라고 합니다.

    1. Named Parameter (명명된 매개 변수)

    using System;namespace NamedParameter{
    class MainApp {
     /// <summary>
     /// 프로필을 콘솔에 출력합니다.
     /// </summary>
     /// <param name="name">Parameter: name</param>
     /// <param name="phone">Parameter: phone</param>
     static void PrintProfile(string name, string phone) {
      Console.WriteLine("Name:{0}, Phone:{1}", name, phone);
     }
     
     static void Main(string[] args)        {            
      // 메서드 호출시 name parameter에 "걸스데이" Argument를 넘겨줍니다.            
      PrintProfile(name: "걸스데이", phone: "011-123-1234");            
      PrintProfile(phone: "016-123-1234", name: "소녀시대");            
      PrintProfile("나인뮤지스", "018-123-1234");            
      PrintProfile("카라", phone:"019-123-1234");        
     }
    }

     

     

    Visual C# 2010에는 명명된 인수(Named Parameter) 및 선택적 인수(Optional Parameter)가 도입되어 있습니다. 위의 예제에서는 명명된 인수를 사용하는 방법에 대해 잘 설명하고 있습니다. 명명된 인수를 사용하면 매개 변수 목록에서 위치 대신 이름과 인수를 연결하여 특정 매개 변수에 대한 인수를 지정할 수 있습니다. 인수는 메서드, 인덱서, 생성자 및 대리자와 함께 사용할 수 있습니다.

    명명된 인수를 사용할 경우 인수가 계산되는 순서는 매개 변수 목록이 아닌 인수 목록에서 인수의 순서에 의해 결정됩니다. 아직 학습하지는 않았지만 명명된 인수를 사용할 경우 익명 메서드를 만들거나 익명 형식에 유용하게 사용할 수 있습니다.

     

    2. Optional Parameter (선택적 매개 변수)

    C#은 기본적으로 메소드에 선언된 매개 변수 목록을 명시적으로 사용해야만 했습니다. 하지만, VSTO와 같은 COM과의 연동 프로그램을 작성할 때 생략 가능한 매개 변수까지 모두 작성해야만 하기 때문에 Visual Basic보다 복잡한면이 있었죠. 그래서 C# 4.0부터 메서드, 생성자, 인덱서 또는 대리자(Delegate)의 정의에서 해당 매개 변수가 필수적인지 선택적인지를 지정할 수 있도록 했습니다. 호출할 경우 모든 필수적 매개 변수에 대한 인수는 항상 제공해야 하지만 선택적 매개 변수에 대한 인수는 생략할 수 있게 되었습니다.

     

    각 선택적 매개 변수에는 정의의 일부로서 기본값이 있습니다. 해당 매개 변수에 인수를 전달하지 않으면 기본값이 사용됩니다. 기본값은 다음 형식 중 하나로 상수, 값 형식 또는 열거형(enum), 구조체(struct)와 제네릭의 default로 초기화 할 수 있는 형식입니다.

    using System;
     
    namespace OptionalParameter{
     class MainApp 
     {
      static void PrintProfile(string name, string phone = "")        
      {            
       Console.WriteLine("Name:{0}, Phone:{1}", name, phone);        
      }
     
      static void Main(string[] args)        
      {            
       PrintProfile("이엑스아이디");            
       PrintProfile("파이브돌스", "019-123-1234");            
       PrintProfile(name: "크레용팝");            
       PrintProfile(name: "티아라", phone:"016-123-1234");        
      }
     }
    }

     

     

    선택적 매개 변수는 목록의 끝에 모든 필수적 매개 변수 뒤에 정의됩니다. 호출자가 첫번째 선택적 매개 변수 뒤에 인수를 제공한 경우 이 매개 변수 앞에 있는 모든 선택적 매개 변수에 대해서도 인수를 제공해야 합니다. 만약 호출자가 선택적 매개 변수를 건너뛰기 위해 쉼표와 쉼표사이에 공백만 남겨 두는 방법은 지원되지 않습니다. 따라서 선택적 매개 변수를 건너뛰기 위해서는 명명된 매개 변수를 이용해야 합니다.

     

    아래 예제의 7라인과 같이 선택적 매개 변수를 2개 지정한 경우, phone을 건너 뛰려면 16라인과 같이 명명된 매개 변수를 사용하면 됩니다.

    using System;
    namespace OptionalParameter
    {
        class MainApp
        {
            static void PrintProfile(string name, string phone = "", string address = "")
            {
                Console.WriteLine("Name:{0}, Phone:{1}, Address: {2}", name, phone, address);
            }
     
            static void Main(string[] args)
            {
                PrintProfile("이엑스아이디");
                PrintProfile("파이브돌스", "019-123-1234");
                PrintProfile(name: "크레용팝", address: "지구");
                PrintProfile(name: "티아라", phone: "016-123-1234");
            }
        }
    }

     

     

    하지만, 항상 최신의 기술이 장점만을 가지는것은 아닙니다. 위의 선택적 매개 변수(Optional Parameter)의 경우 Visual Studio에서 빌드하는 경우 문제가 발생되지 않습니다. 하지만, MSBuild를 이용한 Command작업시에 Optional Parameter의 경우에는 메서드의 시그니처에 맞지 않는다는 컴파일 에러를 발생시킬 수도 있습니다. 실제로 SonaQube에서 MSBuild Command작업시에 정상적으로 빌드가 실행되지 않는 문제가 발생합니다. 물론, 최신 버전의 경우에는 문제가 해소되었을수도 있지만, 오래된 시스템에서 새로운 소스를 추가할 때는 이러한 문제들로 인해 리소스를 낭비 할수도 있습니다.

     

    Linq의 등장으로 Named Parameter의 효용성은 많이 증가한 반면에 Optional Parameter는 가독성 및 코드 분석의 어려움으로 인해 그리 많이 사용하지는 않고 있는듯합니다. 제가 다른분들의 코드를 본적이 없기 때문인지도 모르겠으나, 저의 경우에는 사용하지 않고 있습니다. 아직까지는요^^

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.