Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 ref와 out의 차이점 완벽 정리

C# 프로그래밍에서 메서드에 매개변수를 전달할 때 refout 키워드를 사용하면 값이 아닌 참조로 데이터를 전달할 수 있습니다. 두 키워드는 비슷해 보이지만 동작 방식과 사용 목적에 중요한 차이가 있습니다. 이 글에서는 ref와 out의 차이점을 자세히 살펴보겠습니다.

ref 키워드란?

ref 키워드는 변수를 참조로 전달하여 호출된 메서드가 원본 값을 읽고 수정할 수 있도록 합니다.

  • 초기화 필수: ref로 매개변수를 전달하기 전에 반드시 변수를 초기화해야 합니다.
  • 반환 시 초기화 불필요: 호출된 메서드 내에서 값을 다시 할당하지 않아도 컴파일 오류가 발생하지 않습니다.
  • 양방향 데이터 전달: ref 키워드를 사용하면 데이터가 양방향으로 전달됩니다. 즉, 호출자가 전달한 값을 메서드가 읽을 수 있고, 수정된 값도 다시 호출자에게 반환됩니다.
  • 사용 사례: 호출된 메서드가 전달받은 매개변수의 기존 값을 변경해야 할 때 유용합니다.

ref 사용 예제

void Increment(ref int number)
{
    number += 1;
}

int value = 10; // 반드시 초기화 필요
Increment(ref value);
Console.WriteLine(value); // 출력: 11

out 키워드란?

out 키워드는 메서드가 여러 개의 값을 반환해야 할 때 주로 사용되며, 데이터를 메서드 바깥으로만 전달합니다.

  • 초기화 불필요: out으로 매개변수를 전달하기 전에 변수를 초기화할 필요가 없습니다.
  • 반환 시 초기화 필수: 호출된 메서드는 제어권을 호출자에게 돌려주기 전에 반드시 out 매개변수에 값을 할당해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
  • 다중 값 반환: 하나의 메서드에서 여러 값을 반환해야 할 때 out 키워드 선언이 매우 유용합니다.
  • 단방향 데이터 전달: out 키워드를 사용하면 데이터가 한 방향(메서드 → 호출자)으로만 전달됩니다.

out 사용 예제

void GetMinMax(int[] numbers, out int min, out int max)
{
    min = numbers.Min();
    max = numbers.Max();
}

int[] data = { 3, 7, 1, 9 };
GetMinMax(data, out int minValue, out int maxValue);
Console.WriteLine($"최솟값: {minValue}, 최댓값: {maxValue}");

ref와 out 핵심 차이 요약

구분refout
전달 전 초기화필수불필요
메서드 내 값 할당선택 사항필수
데이터 전달 방향양방향 (입력 + 출력)단방향 (출력 전용)
주요 용도기존 값 수정여러 값 반환

마무리

정리하면, ref는 이미 초기화된 변수의 값을 메서드 안에서 읽고 변경할 때 적합하고, out은 메서드가 새로운 값을 계산하여 여러 결과를 반환할 때 적합합니다. C# 7.0부터는 out 변수를 인라인으로 선언할 수 있어 코드가 더욱 간결해졌으며, 값 형식(struct)을 성능상 이유로 복사 없이 전달하고 싶을 때는 in 키워드도 함께 고려해 볼 수 있습니다. 상황에 맞게 올바른 키워드를 선택하면 더 안전하고 가독성 높은 코드를 작성할 수 있습니다.