무효 클릭 IP 추적 중...
c#

[c# 기초] ref vs out 차이

꼬예 2022. 5. 3.

이번 포스팅에서는 비슷한듯 다르게 보이는 refout차이를 알아보도록 하겠습니다.

 

 

그 전에 이를 제대로 이해하기 위해선 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' 지역 변수를 사용했습니다.

왜냐하면 함수 바깥에서 값을 던져 줘야 하는데 던질 값이 없기 때문입니다.

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글