C#고급 주제

ref와 out 매개변수

함수가 호출자 변수를 직접 수정하거나 추가 결과를 돌려줄 때 쓰는 `ref`, `out` 매개변수 차이를 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

csharp
void Increment(ref int value) => value++;

bool TryDivide(int left, int right, out int result)
{
    if (right == 0)
    {
        result = 0;
        return false;
    }

    result = left / right;
    return true;
}

설명

  • ref는 호출 전에 이미 값이 있어야 하고, 메서드 안에서 같은 변수를 직접 수정합니다.
  • out은 호출 전에 초기화되지 않아도 되지만, 메서드 안에서 반드시 값을 할당해야 합니다.
  • 여러 결과를 빠르게 돌려주거나 성공 여부와 결과를 함께 반환할 때 out이 자주 쓰입니다.
  • 현대 C#에서는 튜플이나 레코드로 반환하는 대안도 많으므로, ref/out은 꼭 필요한 상황에서만 쓰는 편이 읽기 좋습니다.

짧은 예제

csharp
int score = 10;
Increment(ref score);

if (TryDivide(20, 4, out int value))
{
    Console.WriteLine($"{score}, {value}");
}

빠른 정리

항목설명
ref기존 변수를 참조로 넘겨 직접 수정
out결과 값을 메서드 밖으로 전달
호출 전 초기화ref는 필요, out은 불필요
메서드 내부 할당out은 반드시 필요
대안튜플, 레코드 반환 등도 고려 가능

주의할 점

ref/out이 많아지면 함수 계약이 읽기 어려워질 수 있습니다. 인자 목록만 보고도 부수 효과가 예상되도록 정말 필요한 곳에만 쓰는 편이 좋습니다.