[C#] 참조에 의한 매개 변수 전달. ref / 출력 전용 매개 변수. out


이런 코드가 있다고 하자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
 
namespace SwapByValue
{
    class MainApp
    {
        public static void Swap(int a, int b)
        {
            int temp = b;
            b = a;
            a = temp;
        }
 
        static void Main(string[] args)
        {
            int x = 3;
            int y = 4;
 
            Console.WriteLine("x:{0}, y:{1}",x,y);
            // 결과 : x:3,y:4
            Swap(x,y);
            
            Console.WriteLine("x:{0}, y:{1}",x,y);
            // 결과 : x:3,y:4
        }
    }
}
cs


우리는 Swap메소드를 사용하므로써 x와 y의 값이 교환 되는 결과를 바라고 있었을 것이다.

그런데 위의 코드에서는 값이 교환되지 않았다.


그럼 x랑 y값에 변환를 주기 위해선 어떻게 해야할까?

바로 ref키워드를 사용하면 된다.

ref키워드를 매개 변수 앞에 붙여주면 된다.




1. 참조에 의한 매개변수 전달.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
 
namespace SwapByValue
{
    class MainApp
    {
        public static void Swap(ref int a, ref int b)
        {
            int temp = b;
            b = a;
            a = temp;
        }
 
        static void Main(string[] args)
        {
            int x = 3;
            int y = 4;
 
            Console.WriteLine("x:{0}, y:{1}",x,y);
            // 결과 : x:3,y:4
            Swap(ref x, ref y);
            
            Console.WriteLine("x:{0}, y:{1}",x,y);
            // 결과 : x:4,y:3
        }
    }
}
cs


우리가 원하는 결과 값이 나왔다는 것을 알 수 있다.


대개의 경우 메소드의 결과값은 하나면 충분하다.

"대개의 경우"에 속하지 않는, 두 개 이상의 결과를 요구하는 메소드는 어떻게 해야할까?


바로 참조에 의한 매개변수 전달을 사용하면 된다.



다음은 나눗셈과 그 나머지를 구하는 코드다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
 
namespace SwapByValue
{
    class MainApp
    {
        public static void Divide(int a, int b, ref int quotient, ref int remainder)
        {
            quotient = a / b;
            remainder = a % b;
        }
 
        static void Main(string[] args)
        {
            int a = 20;
            int b = 3;
            int c = 0;
            int d = 0;
 
            Divide(a, b, ref c, ref d);
 
            Console.WriteLine("a:{0}, b:{1}:, a/b:{2}, a%b:{3}", a,b,c,d);
            // 결과 a:20, b:3, a/b:6, a%b:2
        }
    }
}
cs




2. 출력 전용 매개 변수.


ref을 이용하여 메소드로 부터 여러개의 결과를 얻어올 수 있지만,

C#은 조금 더 안전한 방법으로 똑같은 일을 할수 있게 했다.


out 키워드를 사용한 것이다.


위의 예제 코드에서 ref키워드를 out키워드로 바꿔 사용하면 똑같은 결과를 도출할 수 있다.

그럼 똑같은거 아닌가? 라고 생각할 수 있지만, 그렇지 않다.


out은 ref에게는 없는 안전장치가 있다.


예를들어 ref키워드를 이용해 매개 변수를 넘기는 경우 메소드가 해당 매개 변수에 결과를 저장하지 않아도

컴파일은 아무런 경고를 하지 않는다.


out키워드는 메소드가 해당 매개변수에 결과를 저장하지 않으면 에러 메세지를 출력한다.


물론 초기화 되지 않은 매개변수를 넘기는 것은 가능하다.

왜냐하면 컴파일러가 호출당하는 메소드에서 그 지역 변수에 할당할 것을 보장하기 때문이다.


이렇게 버그를 만들 가능성을 제거할 수 있다면 우리는 그 방법을 사용해야 한다.


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

[C#] interface  (0) 2017.04.03
[C#] 메소드 오버로딩, 가변길이 매개 변수, 선택적 매개 변수  (0) 2017.03.25
[C#] 공용 형식 시스템.  (0) 2017.03.24
[C#] var형식  (0) 2017.03.24
[C#] Object형식, 박싱과 언박싱.  (1) 2017.03.23