이번 포스팅에서는 비슷한듯 다르게 보이는 ref와 out차이를 알아보도록 하겠습니다.
그 전에 이를 제대로 이해하기 위해선 ref를 이용한 함수와 이용하지 않은 보통 함수에 대한 이해가 선행 되어야 합니다.
1. ref 이용한 함수 vs 보통 함수
1) 보통 함수
int num=5;
static void ChangeNum(int a)
{
a = 10;
}
ChangeNum(num);
Console.WriteLine(num);
//output: 5
최초 정의한 num =5 값이 ChangeNum함수를 통과 했음에도 불구하고 최종 num값의 변화가 없습니다.
왜냐하면 함수 바깥 scope와 함수내 scope가 엄연히 다른 공간으로 인식 하기 때문입니다.
2) ref 이용한 함수
기존 함수와 사용법에 차이가 있다면 매개변수, 인수 위치에 각각 ref를 추가해준 형태입니다.
int num=5;
static void ChangeNum(ref int a)
{
a = 10;
}
ChangeNum(ref num);
Console.WriteLine(num);
//output: 10
결과를 보면 함수 내에서 정의한 값으로 값이 변경 된 것을 알 수 있습니다.
ref를 사용했다는 이유 하나만으로 기존에 분리되어 있었던 scope가 하나로 연결이 되었기 때문입니다.
2. ref 이용한 함수 vs out을 이용한 함수
1) out 이용한 함수
우선 기본형태를 보면 ref가 사용되었던 위치가 out으로 변경 되었습니다.
해당 코드의 결과는 어떻게 나올까요?
int num = 5;
static void OutFunc(out int num)
{
num = 10;
}
OutFunc(out num);
Console.WriteLine(num);
//output: 10
output은 10으로 ref를 사용한 함수와 결과값이 같습니다.
out을 사용한 함수의 어떤 메커니즘때문에 이 둘의 결과가 같게 나오는걸까요?
ref함수는 아래와 같이 인자를 함수로 넘겨주는 형태인 반면,
out함수는 아래와 같이 함수내에서 정의한 값을 바깥으로 넘겨주는 형태입니다.
즉 방향이 반대인것이죠.
방향이 반대라고 해도 결국 num의 최종값은 10으로 동일 할수 밖에 없는 것입니다.
그렇다면 이 둘의 차이는 어디서 발생할까요?
2) out 이용한 함수 vs ref 이용한 함수 차이
결론부터 말하면, out을 이용한 함수는 함수 바깥에 있는 변수에 값을 할당 할 필요가 없습니다.
아래 코드에서 처럼 int num; 으로 값 할당없이 정의만 해도 에러가 발생하지 않습니다.
int num;
static void OutFunc(out int num)
{
num = 10;
}
OutFunc(out num);
Console.WriteLine(num);
//output: 10
왜냐하면 방향이 함수내에서 바깥으로 전달하는 방향이기 때문입니다.
반면, ref를 이용한 함수의 경우 값을 할당하지 않으면 아래와 같은 에러가 발생됩니다.
error CS0165: 할당되지 않은 'num' 지역 변수를 사용했습니다.
int num;
static void ChangeNum(ref int a)
{
a = 10;
}
ChangeNum(ref num);
Console.WriteLine(num);
output: error CS0165: 할당되지 않은 'num' 지역 변수를 사용했습니다.
왜냐하면 함수 바깥에서 값을 던져 줘야 하는데 던질 값이 없기 때문입니다.
'c#' 카테고리의 다른 글
[c# 기초] 작업중인 파일이 자동적으로 실행되게 하는 방법(Ctrl+ F5) (0) | 2022.05.04 |
---|---|
[c# 기초] 생성자(constructor)란? (0) | 2022.05.03 |
[c# 기초] 함수 앞에 붙은 void는 무엇인가? (0) | 2022.05.02 |
c# 배열 초기화/선언 하는 3가지 방법(기초) (0) | 2022.04.29 |
[c# 기초] foreach loop의 특이한 점 (0) | 2022.04.28 |
댓글