ref(C# 참조)

ref 키워드는 인수를 참조로 전달하는 데 사용됩니다. 메서드의 모든 매개 변수 변경 사항은 호출하는 메서드로 제어가 다시 전달될 때 해당 변수에 반영됩니다.

참고

참조에 의한 전달 개념을 참조 형식 개념과 혼동하지 마십시오. 두 개념은 같지 않습니다. 값 형식이든, 참조 형식이든 관계없이 ref로 메서드 매개 변수를 수정할 수 있습니다. 참조에 의해 전달되는 경우에는 값 형식의 boxing이 없습니다.

ref 매개 변수를 사용하려면 메서드 정의와 호출하는 메서드에서 모두 ref 키워드를 명시적으로 사용해야 합니다. 예를 들면 다음과 같습니다.

    class RefExample
    {
        static void Method(ref int i)
        {
            // Rest the mouse pointer over i to verify that it is an int.
            // The following statement would cause a compiler error if i
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }

ref 매개 변수에 전달되는 인수는 먼저 초기화되어야 합니다. 이는 해당 인수를 전달하기 전에 명시적으로 초기화할 필요가 없는 out과 다른 점입니다. 자세한 내용은 out을 참조하십시오.

ref 및 out 키워드는 다른 런타임 동작을 가져오지만 컴파일 타임에 메서드 시그니처의 일부로 간주되지 않습니다. 따라서 한 메서드는 ref 인수를 사용하고 다른 메서드는 out 인수를 사용하는 것이 유일한 차이점인 경우 메서드를 오버로드할 수 없습니다. 예를 들어, 다음 코드는 컴파일되지 않습니다.

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

그러나 한 메서드가 ref 또는 out 인수를 사용하고 다른 메서드는 두 인수 중 어느 것도 사용하지 않는 경우 다음 예제에서와 같이 메서드를 오버로드할 수 있습니다.

    class RefOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(ref int i) { }
    }

속성은 변수가 아닙니다. 실제로 속성은 메서드이기 때문에 ref 매개 변수로 전달될 수 없습니다.

배열을 전달하는 방법에 대한 자세한 내용은 ref 및 out을 사용하여 배열 전달(C# 프로그래밍 가이드)을 참조하십시오.

예제

이 항목의 앞부분에서 설명하는 것과 같이 값 형식을 참조로 전달하는 방법이 유용하기는 하지만 ref를 사용하여 참조 형식을 전달하는 방법도 유용한 경우가 많습니다. 이렇게 하면 참조 자체가 참조로 전달되므로 호출된 메서드에서 참조가 가리키는 개체를 수정할 수 있습니다. 다음 샘플에서는 참조 형식이 ref 매개 변수로 전달될 때 개체 자체가 변경될 수 있음을 보여 줍니다. 자세한 내용은 참조 형식 매개 변수 전달(C# 프로그래밍 가이드)을 참조하십시오.

class RefExample2
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        Console.WriteLine(str);
    }
}
// Output: changed

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하십시오. 이 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.

참고 항목

참조

매개 변수 전달(C# 프로그래밍 가이드)

메서드 매개 변수(C# 참조)

C# 키워드

개념

C# 프로그래밍 가이드

기타 리소스

C# 참조