Parameter와 ref, out 키워드

[C#] Parameter 란?

Parameter(매개 변수)란 함수를 호출한 곳에서 인수를 전달받아 인수의 값을 함수의 내부에서 사용할 수 있도록 도와주는 변수를 뜻합니다.

1
2
3
4
5
6
7
8
9
10
11
static void Main(string[] args){
int _num1 = 3;
int _num2 = 6;
int _sum = Method(_num1,_num2); //인수 전달

}

static public int Method(int num1, int num2) //매개 변수
{
return num1 + num2;
}

위와 같이 Method를 호출하는 Main함수에서 _num1, _num2를 인수(Argument)로 넘겨주고

호출된 Method에서 인수 값을 담고 있는 파라미터인 num1, num2를 이용하여 결과 값을 전달해주고 있습니다.

인수란 함수를 호출할 때 넘겨주는 변수 값입니다.


값 형식 전달, 참조 형식 전달

  1. 값으로 전달 : 변수의 복사본을 전달
  2. 참조로 전달 : 변수에 대한 주소를 전달
형식 값으로 전달 참조로 전달
값 형식 호출자에게 변경 내용이 반영되지 않음 호출자에게 변경 내용이 반영됨
참조 형식 호출자에게 변경 내용이 반영됨 호출자에게 변경 내용이 반영됨

Parameter 키워드

개발자는 필요함에 따라 파라미터 키워드를 사용할 수 있습니다.

그럼 파라미터 키워드에는 어떤 것들이 있을까요?


ref

일반적으로 c#의 인수는 값이 복사되어 호출된 메소드에게 전달됩니다.

이런 경우 메서드 내에서 매개변수의 값이 수정되어도 호출된 곳에서 변수의 값은 변하지 않습니다.

메소드에서 변동된 값이 호출한 곳에서도 적용이 되었으면 좋겠다면
ref 키워드를 사용하면 됩니다.

ref 키워드는 reference로 참조에 의한 인수 전달 키워드입니다.

1
2
3
public int Method(ref int num1, int num2){
return num1 + num2;
}

ref 키워드를 사용하기 위해
메소드의 매개변수 앞과, 메소드를 호출할 때 인수 앞에 ref키워드를 명시해주어야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args){
int _num1 = 3;
int _num2 = 4;
Method(ref _num1,_num2);
Console.WriteLine($"Main Start!");
Console.WriteLine($"_num1: {_num1} , _num2: {_num2}");
}

static public void Method(ref int num1, int num2){
num1 = num1 + 1;
num2 = num2 + 1;

Console.WriteLine($"Method Start!");
Console.WriteLine($"num1: {num1} , num2: {num2}");
}

[결과]

1
2
3
4
Method Start!
num1: 4 , num2: 5
Main Start!
_num1: 4 , _num2: 4

결과를 보면 메소드 내에서 num2는 증가되어 5를 가지고 있지만
main 에서 _num2는 증가되지 않는 4의 값을 가지고 있습니다.

num2와 다르게 _num1은 메소드 내에서 증가한 것이
main에서도 똑같이 증가된 것을 확인할 수 있습니다.


out

out은 ref와 비슷하게 참조에 의한 매개변수을 이용할 수 있게 도와주는 키워드입니다.

사용방식 또한 ref와 같습니다.

그럼 둘의 다른점은 무엇일까요?

ref일 경우 인수를 초기화해야하지만,

초기화가 되었기때문에 호출된 메소드 내에서 새로운 값을 반드시 할당하지 않아도 됩니다.

out일 경우 인수가 할당되지 않아도 되지만,

호출된 메소드 내에서 새로운 값을 반드시 할당해주어야 합니다.


자세한 내용은 Microsoft c# 가이드 를 참고하시면 됩니다.