`ref` 키워드의 다양한 쓰임

ref 키워드의 다양한 쓰임

C#에서 ref 키워드를 한 곳에서만 쓰지는 않아요. 위치에 따라 역할이 꽤 달라지는데, 어디에 오느냐에 따라 참조로 넘기기, 참조로 돌려주기, 참조 변수 선언 같은 일을 각각 맡게 됩니다. 하나씩 짚어볼게요.

출처: The multiple uses of the ref keyword

본문

ref 키워드는 다음과 같은 곳에서 쓰입니다.

  • 메서드 시그니처와 호출에서 — 인자를 메서드에 참조로 전달할 때 써요. 값을 복사해서 넘기는 대신 원래 변수를 그대로 가리키게 합니다.

    void Increment(ref int number)
    {
        number++;
    }
    
    int value = 41;
    Increment(ref value);
    
  • 메서드 시그니처에서 — 호출한 쪽으로 값을 참조로 반환할 때 사용합니다. 자세한 내용은 ref return 문서를 참고해요.

    private int[] numbers = { 1, 2, 3 };
    
    public ref int FindFirst()
    {
        return ref numbers[0];
    }
    
  • 지역 변수 선언에서참조 변수를 선언할 때 씁니다. 값의 복사본이 아니라 대상 값을 그대로 가리키는 변수예요.

    ref int first = ref FindFirst();
    first = 100;   // numbers[0]이 함께 바뀝니다
    
  • **조건부 ref 식**이나 **ref 할당 연산자**의 일부로도 쓰여요. 조건에 따라 서로 다른 변수를 참조로 선택하거나, ref 식끼리 할당할 때 활용합니다.

    ref int b = ref (condition ? ref x : ref y);
    
  • struct 선언에서ref struct를 선언할 때 사용해요. 힙이 아니라 스택에만 존재하는 특수한 구조체 타입으로, 자세한 내용은 ref 구조체 형식 문서를 참고하세요.

    ref struct SpanLike { }
    
  • ref struct 정의 안에서ref 필드를 선언할 때 씁니다. 해당 내용은 ref 구조체 형식 문서의 ref 필드 절에서 다뤄요.

    ref struct Container
    {
        public ref int Stored;
    }
    
  • 제네릭 타입 선언에서 — 형식 매개변수가 allows ref struct 타입을 허용하도록 지정할 때 사용해요.

    class Example<T> where T : allows ref struct
    { }
    

더 알아보기