Notice
Recent Posts
Recent Comments
Link
관리 메뉴

nomad-programmer

[Programming/C#] 출력 전용 매개 변수 본문

Programming/C#

[Programming/C#] 출력 전용 매개 변수

scii 2020. 9. 7. 17:25

대개의 경우 메소드의 결과는 하나면 충분하다. 허나 두 개 이상의 결과를 요구하는 특별한 메소드도 있다. 이를테면 나눗셈을 구현할 때 제수와 피제수를 매개 변수로 넘겨받고 결과는 몫과 나머지 두 개로 반환할 필요가 있다.
이런 경우, ref 키워드를 이용해 메소드를 구현하면 몫과 나머지를 한 번에 반환할 수 있다. 

ref만으로도 여러 개의 결과를 메소드로부터 얻어올 수 있지만 C#은 조금 더 "안전한 방법"으로 똑같은 일을 할 수 있게 해준다. 

바로 "out" 키워드를 이용한 "출력 전용 매개 변수"가 그것이다. out 키워드의 사용법은 간단하다. 메소드의 선언부와 호출부에 ref키워드 대신 out 키워드를 사용하는 것이 전부이다. 

하지만 out은 ref에게는 없는 "안전 장치"가 있다. ref 키워드를 이용해서 매개 변수를 넘기는 경우 메소드가 해당 매개 변수에 결과를 저장하지 않아도 컴파일러는 아무런 경고를 하지 않는다. 이와는 달리, out 키워드를 이용해서 매개 변수를 넘길 때는 메소드가 해당 매개 변수에 결과를 저장하지 않으면 컴파일러가 에러 메시지를 출력한다.

한편, 메소드를 호출하는 쪽에서는 초기화를 하지 않은 지역 변수를 메소드의 out 매개 변수로 넘기는 것은 가능하다. 컴파일러가 호출당하는 메소드에서 그 지역 변수를 할당할 것을 보장하기 때문이다.

이처럼 컴파일러를 통해 결과를 할당하지 않는 버그를 만들 가능성을 제거할 수 있다면, 그 방법을 사용해야 한다. RunTime에서 발생하는 버그는 CompileTime에 발생하는 버그보다 훨씬 잡기가 어렵기 때문이다.

컴파일 에러는 어느 곳에 문제가 있는지 컴파일러가 정확하게 알려주지만, 런타임 버그는 프로그래머의 논리력으로 추적해야 한다. 같은 문제라면 기계의 도움을 받을 수 있는 쪽이 훨씬 쉽다.

출력 전용 매개 변수는 메소드를 호출하기 전에 미리 선언할 필요가 없다. 호출할 때 매개 변수 목록 안에서 즉석으로 선언하면 된다.

using System;

namespace CSharpExam
{
    class OutExample
    {
        static void Divide(int a, int b, out int quotient, out int remainder)
        {
            quotient = a / b;
            remainder = a % b;
        }

        static int Main(string[] args)
        {
            int a = 20;
            int b = 3;

            Divide(a, b, out int c, out int d);

            Console.WriteLine($"a: {a}, b: {b}, a/b: {c}, a%b: {d}");

            return 0;
        }
    }
}

/* 결과

a: 20, b: 3, a/b: 6, a%b: 2

*/
Comments