내일배움캠프 TIL

내일배움캠프 16일차 TIL "ref, out"

Jooglorystar 2024. 10. 4. 21:33

 

팀프로젝트는 성공적으로 끝났지만, 아직 C#에 대해 미숙한 점이 없지는 않다.

이번 주 중에 자신의 수준이 어느정도인지 알아보는 시험이 있었는데, 그 시험에서 제대로 풀지 못한 문제가 있었다.

오늘은 남은 시간에 그 부분에 대한 개념을 다시 복습하는 시간을 가졌다.

 

우선 해당 문제는 이것이었다.

 

static void Add(int i, ref int result)
{
    result += i;
}

static void Main(string[] args)
{
    int total = 10;
    Console.WriteLine(total);
    Add(200, ref total);
    Console.WriteLine(total);
}

 

위의 코드는 실행시 10과 210을 출력한다.

이 곳에서 ref int result와 ref total 부분이 비어있고, 그 부분을 삽입하는 문제였으나, 문제를 풀 때는 해당 개념을 이용한다는 것을 몰랐어서 못 푼 문제이다.

정확한 빈칸의 위치는 정확하게 기억나지 않지만, 해당 문제는 ref의 개념을 이해하고 있는지를 물어보는 문제였다고 생각된다.

 

위의 예시에서, 값이 10인 total이 Add 메서드에서 10 += 200;이 되어 total의 값은 210이 된다. 

Add는 void 메서드라서 반환하는 것이 없지만, ref 키워드는 해당 값을 참조로 불러와 result += i 의 계산이 result에 반영이 된 것이다.

 

out 키워드는 매개변수에 값을 전달한다는 점에서는 ref와 유사하지만, 사용법과 방식은 다르다.

우선 ref는 매개변수를 수정해서 기존 값에 영향을 주는데 사용하는 키워드이고,

out은 반환 값을 매개변수로 전달하는데 사용하는 키워드이다.

 

위의 코드를 out을 이용하는 식으로 바꾼다면 밑의 코드 처럼 바꿀 수 있다.

 

static void Add(int num1, int num2, out int result)
{
    result = num1 + num2;
}

static void Main(string[] args)
{
    int num = 10;
    int result;
    Console.WriteLine(num);
    Add(200, num, out result);
    Console.WriteLine(result);
}

 

ref 예시에서는 참조로 불러온 매개변수를 직접 수정할 수 있었다.

하지만 ref 예시코드에서 ref만 out으로 바꾼다면 '할당되지 않은 result out 매개변수를 사용합니다.' 라는 컴파일러 오류가 뜨게 된다.

out 키워드를 쓰기 위해서는 위 예시 코드처럼 result = num1 + num2 처럼 해당 매개변수의 값을 직접 할당 해줘야한다.

대신 상단 예시 코드처럼 int result;와 같이 메서드를 불러오기 전에는 굳이 값을 할당하지 않아도 사용할 수 있다.

 

반대로 ref는 함수내에서 값을 변경해야하므로 당연하겠지만, 값을 할당한 변수만이 ref 키워드를 사용할 수 있다.