본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 13. ref 와 out


함수는

return 을 만나면 종료하기 때문에

일반적으로 복수개의 값들을 리턴할수가 없다.


함수를 호출한 곳에 두개 이상의 값을 넘겨주고 싶을때는 어떻게 할까?



1. ref

using System;

namespace ConsoleApp1
{
class Program
{
static void Test(ref int x, ref int y)
{
x = 10;
y = 20;
}
static void Main(string[] args)
{
int x = 0, y = 0;
Test(ref x, ref y);
Console.WriteLine("{0},{1}", x, y);

}
}
}


다음과 같이 ref키워드를 통하여 해당 변수에 값을 대입하면 결국 해당함수를 사용한 곳에서는

x,y 두개의 값을 받았다고 볼수있다.

이렇게 ref타입을 이용하여 값을 넘겨줄수있다.


그런데 여기서 x,y가 미리 0으로 초기화 된것을 볼수있다.

만약 0으로 초기화 하지 않으면


using System;

namespace ConsoleApp1
{
class Program
{
static void Test(ref int x, ref int y)
{
x = 10;
y = 20;
}
static void Main(string[] args)
{
int x, y;
Test(ref x, ref y);
Console.WriteLine("{0},{1}", x, y);

}
}
}

라는 오류를 띄우게된다.


이유는 ref키워드는 해당 변수를 참조형식으로 사용한다는 키워드기 때문에 참조할 대상이 있어야한다.

참조할 대상이 없다면 애초에 사용하지 못하게 하는것이다.




2. out

만약에 오직 값을 넘겨주기 위하여 존재하는 파라미터들이라면

이를 위하여 굳이 넘겨주는 파라미터들을 초기화 하고 사용해야한다.

그 키워드가 out키워드이다


using System;

namespace ConsoleApp1
{
class Program
{
static void Test(out int x, out int y)
{
x = 10;
y = 20;
}
static void Main(string[] args)
{
int x, y;
Test(out x, out y);
Console.WriteLine("{0},{1}", x, y);

}
}
}

ref대신에 out 키워드를 사용하면 x,y를 할당하지 않고도 사용가능하다

그러나 out키워드로 넘어온 변수는 기본적으로 "할당되지 않았다" 라고 가정하기 때문에

함수내에서 할당하기 전에는 사용이 불가능하다.

728x90