NGMsoftware

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

    학습


    C# 15-6. 메서드의 매개 변수 한정자 out 키워드

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 이제 메서드에서 사용하는 매개 변수 한정자에 대한 내용이 거의 끝나갑니다. 아직 확장 메서드와 익명 메서드 등등... 안한것들이 있지만, 앞의 것들은 기본 개념과는 다른 성격의 것들입니다. 해야할 내용이 많기도 해서 별도의 강좌로 따로 진행할 예정입니다.

     

    오늘 진행할 out 키워드는 이전 강좌인 ref 키워드처럼 인수를 참조로 전달하는데 사용합니다. C#에서는 인수를 참조로 전달하기 위한 키워드를 ref와 out 두개만 제공하고 있습니다. out 키워드가 하는일은 ref와 비슷하지만 ref의 경우 변수를 전달하기 전에 초기화해야 한다는 점에서 차이가 있습니다. out 매개 변수를 사용하려면 메서드 정의와 호출하는 메서드에서 모두 out키워드를 명시적으로 사용해야 합니다.

    using System;
    namespace UsingOut
    {
        class MainApp
        {
            static void Divide(int a, int b, out int quotient, out int remainder)
            {
                quotient = a / b;
                remainder = a % b;
            }
     
            static void Main(string[] args)
            {
                int a = 20;
                int b = 3;
                int c;
                int d;
                Divide(a, b, out c, out d);
                Console.WriteLine("a:{0}, b:{1}:, a/b:{2}, a%b:{3}", a, b, c, d);
            }
        }
    }

     

     

    결과는 몫이 6, 나머지가 2입니다.

    AUCFLT8.png

     

     

    out인수로 전달되는 변수는 이를 전달하기 전에 초기화할 필요가 없지만 호출되는 메서드는 반환 이전에 값을 할당하여 초기화 해야 합니다. ref 및 out키워드는 다른 런타임 동작을 가져오지만 컴파일 타임에 메서드 시그니처의 일부로 간주되지 않습니다. 따라서 한 메서드는 ref인수를 사용하고 다른 메서드는 out인수를 사용하는 것이 유일한 차이점인 경우 메서드를 오버로드할 수 없습니다. 아래와 같은 경우에는 컴파일 에러를 발생시킵니다.

    class CS0663_Example
    {
        // 오버로드된 메서드 'SampleMethod'은(는) ref 및 out만 
        // 다른 메서드와 다르므로 해당 메서드를 정의할 수 없습니다.    
        public void SampleMethod(out int i)
        {
            i = 0;
        }
     
        public void SampleMethod(ref int i)
        {
     
        }
    }
    

     

     

    하지만, 한 메서드가 ref 또는 out 인수를 사용하고 다른 메서드는 두 인수 중 어느 것도 사용하지 않는 경우 다음과 같이 오버로드할 수 있습니다.

    class OutOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(out int i)
        {
            i = 5;
        }
    }

     

     

    속성은 변수가 아니므로 out 매개 변수로 전달할 수 없습니다. 또한 ref와 마찬가지로 다음의 경우 사용할 수 없습니다. 비동기 한정자를 사용하여 정의된 비동기 메서드와 yield return, yield break문이 포함되어 있는 반복 메서드는 out 매개 변수 한정자를 사용할 수 없습니다.

     

    보통 out키워드를 사용하는 경우는 메서드에서 값을 여러 개 반환해야 하는 경우 out메서드를 선언하는 것이 좋습니다. 다음 예제에서는 out을 사용하여 한번의 메서드 호출로 변수 3개를 반환합니다. 3번째 인수에는 null이 할당됩니다. 이렇게 하면 메서드에서 값을 선택적으로 반환할 수 있습니다.

    class OutReturnExample
    {
        static void Method(out int i, out string s1, out string s2)
        {
            i = 44;
            s1 = "I've been returned";
            s2 = null;
        }
     
        static void Main()
        {
            int value;
            string str1, str2;
            Method(out value, out str1, out str2);
        }
    }

     

     

    다음은 메서드의 마지막 강좌인 params에 대해서 알아보도록 하겠습니다.

     

    다음 시간에...

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

    댓글목록

    등록된 댓글이 없습니다.