[C#] ref vs out

spixychz·2025년 8월 11일

기술면접

목록 보기
3/13

오늘의 질문

C#에서 ref와 out 키워드의 차이점에 대해 설명하세요.

오늘의 대답

ref와 out은 메서드 매개변수를 참조로 전달할 때 사용하는 키워드입니다.
ref는 이미 값이 초기화된 변수를 참조로 전달하고,
out은 메서드 내부에서 반드시 값을 초기화해야 하는 참조 매개변수입니다.
즉, ref는 값을 전달하고 수정 가능하게 하며, out은 값을 반환하는 목적으로 사용됩니다.


ref

초기화된 변수를 참조로 전달

  • 호출 전에 반드시 변수 초기화 필요
  • 메서드 내부에서 값 변경 가능
  • 메서드 호출 후 변경된 값이 호출자에게 반영됨

=> 값을 넘겨주면서 수정이 필요한 경우

public void AddTen(ref int number)
{
    number += 10;
}

int value = 5;
AddTen(ref value);
    // => 15

out

값 반환 목적으로 참조 전달

  • 호출 전에 변수 초기화 불필요
  • 메서드 내부에서 반드시 값 할당
  • 주로 여러 개의 값을 반환해야 할 때 사용

=> 메서드 결과를 전달할 때

public void GetCoordinates(out int x, out int y)
{
    x = 10;
    y = 20;
}

int posX, posY;
GetCoordinates(out posX, out posY);
    // => 10, 20

ref와 out의 공통점

  • 참조 전달: 값을 복사하지 않고 메모리 참조를 전달
  • 메서드 내부에서 변경된 값이 호출자에게 반영
  • 값 타입, 참조 타입 모두 사용 가능

ref와 out의 차이점

구분refout
초기화 필요 여부호출 전 반드시 초기화호출 전 초기화 불필요
메서드 내부 초기화선택 사항필수
주 용도값 전달 + 수정결과 반환
가독성넘겨받은 값 수정 가능성 명확결과를 반환하려는 의도 명확

ETC

in 키워드

읽기 전용 참조 매개변수

  • C# 7.2에서 추가
  • 매개변수를 참조로 전달하지만 메서드 내부에서 수정 불가
  • 큰 구조체 전달 시 복사 비용 절감 + 불변성 보장
  • readonly를 매개변수 수준에서 적용한 효과

=> 읽기 전용 참조 전달

public void PrintPoint(in Vector3 point)
{
    // point.x = 10; // 오류 발생
    Console.WriteLine(point);
}

ref readonly 키워드

읽기 전용 참조 반환

  • C# 7.2에서 추가
  • 값을 참조로 반환하지만 외부에서 수정 불가
  • 불필요한 값타입 복사 방지 + 데이터 안전성 확보
  • readonly ref라고도 부름 (순서만 다름)
  • 성능 + 불변성 보장

=> 주로 반환할 값이 struct이고 원본 변경을 막고 싶을 때

private BigStruct data;

public ref readonly BigStruct GetDataReadOnly() => ref data;

ref readonly BigStruct result = ref GetDataReadOnly();
// result.a = 10; // 오류 발생

결론

  • 값을 넘겨주고 수정이 필요하다면 -> ref
  • 메서드에서 결과를 생성해 반환해야 한다면 -> out
  • 참조로 전달하되 수정 금지하려면 -> in
  • 참조로 반환하되 수정 금지하려면 -> ref readonly
profile
UNITY로 게임 개발하는 사람

0개의 댓글