ref와 out키워드는 함수에 변수를 값(복사본)이 아닌 원본자체를 참조(메모리 주소)로 전달하여 함수 내부에서 원본 변수의 값을 변경하고 그 결과를 함수 외부에서도 사용하게 해주는 기능이다. 반드시 값을 초기화해야 한다.값을 초기화할 필요가 없다 (초기화되어 있어도 상관없음)반드시 값을 할당해야 한다.ref는 호출 전 필수 초기화, out은 호출 전 필요하지 않음 (호출 후엔 필수)ref는 기존 값을 수정하기 위함, out은 값의 생성 및 반환을 위해 사용한다.static void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 3, b = 7;
Swap(ref a, ref b);
Console.WriteLine($"{a}, {b}"); // 7, 3
}
ref 를 붙이고 매개변수를 넘기게 되면 값이 정상적으로 교체되는걸 볼수 있는데 ref를 붙이지 않고 넘기게 되면 기존의 원본값을 교체하지 않고 복사된 값을 교체하려고 하기 때문에 7, 3 이 출력되는게 아니라 그대로 3, 7이 출력 되는걸 확인할 수 있다.static void Divide(int a, int b, out int result1, out int result2)
{
result1 = a / b;
result2 = a % b;
}
static void Main(string[] args)
{
int num1 = 10;
int num2 = 3;
int result1;
int result2;
Divide(num1, num2, out result1, out result2);
Console.WriteLine(result1);
Console.WriteLine(result2);
}
위 예제는 a와 b 의 값의 나눈값과 나눈 나머지 값을 만드는 함수 예제이다.
해당 Divide 함수를 실행하면 3, 1이 정상적으로 출력되는걸 볼수 있다. 여기서 out 키워드를 입력하지 않으면 문법 오류가 발생하고 result1, result2 의 경우에는 out을 포함하지 않으면 초기화를 꼭 해줘야 하고 초기화를 하면 복사값으로 변하기 때문에 원하는 결과가 나오지 않는다.
ref를 사용할 수도 있다 대신 ref 사용시 Main 함수안의 result1, result2 의 값을 0으로 초기화 시키고 사용해야 한다.