참조 형식 매개 변수 전달(C# 프로그래밍 가이드)Passing Reference-Type Parameters (C# Programming Guide)

참조 형식의 변수에는 해당 데이터가 직접 포함되지 않고 데이터에 대한 참조가 포함됩니다.A variable of a reference type does not contain its data directly; it contains a reference to its data. 참조 형식 매개 변수를 값으로 전달하는 경우 클래스 멤버 값 등 참조된 개체에 속하는 데이터를 변경할 수 있습니다.When you pass a reference-type parameter by value, it is possible to change the data belonging to the referenced object, such as the value of a class member. 하지만 참조 자체의 값은 변경할 수 없습니다. 예를 들어 동일한 참조를 사용하여 새 개체에 대한 메모리를 할당하고 메서드 외부에 유지되도록 할 수 없습니다.However, you cannot change the value of the reference itself; for example, you cannot use the same reference to allocate memory for a new object and have it persist outside the method. 이렇게 하려면 ref 또는 out 키워드를 사용하여 매개 변수를 전달합니다.To do that, pass the parameter using the ref or out keyword. 간단한 설명을 위해 다음 예제에서는 ref를 사용합니다.For simplicity, the following examples use ref.

값으로 참조 형식 전달Passing Reference Types by Value

다음 예제에서는 참조 형식 매개 변수 arrChange 메서드에 값으로 전달하는 방법을 보여 줍니다.The following example demonstrates passing a reference-type parameter, arr, by value, to a method, Change. 매개 변수가 arr에 대한 참조이므로 배열 요소의 값을 변경할 수 있습니다.Because the parameter is a reference to arr, it is possible to change the values of the array elements. 그러나 다른 메모리 위치에 매개 변수를 다시 할당하려는 시도는 메서드 내부에서만 작동하고 원래 변수 arr에는 영향을 주지 않습니다.However, the attempt to reassign the parameter to a different memory location only works inside the method and does not affect the original variable, arr.

class PassingRefByVal
{
    static void Change(int[] pArray)
    {
        pArray[0] = 888;  // This change affects the original element.
        pArray = new int[5] {-3, -1, -2, -3, -4};   // This change is local.
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main()
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);

        Change(arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);
    }
}
/* Output:
    Inside Main, before calling the method, the first element is: 1
    Inside the method, the first element is: -3
    Inside Main, after calling the method, the first element is: 888
*/

앞의 예제에서 참조 형식인 arr 배열은 ref 매개 변수 없이 메서드에 전달됩니다.In the preceding example, the array, arr, which is a reference type, is passed to the method without the ref parameter. 이 경우 arr을 가리키는 참조의 복사본이 메서드에 전달됩니다.In such a case, a copy of the reference, which points to arr, is passed to the method. 출력에서는 이 경우 메서드가 배열 요소의 내용을 1에서 888로 변경할 수 있음을 보여 줍니다.The output shows that it is possible for the method to change the contents of an array element, in this case from 1 to 888. 그러나 Change 메서드 내에서 new 연산자를 사용하여 새 메모리 부분을 할당하면 pArray 변수가 새 배열을 참조합니다.However, allocating a new portion of memory by using the new operator inside the Change method makes the variable pArray reference a new array. 따라서 그 후의 변경 내용은 Main 내에서 생성된 원래 배열 arr에 영향을 주지 않습니다.Thus, any changes after that will not affect the original array, arr, which is created inside Main. 실제로 이 예제에서는 Main 내부와 Change 메서드 내부에 각각 하나씩, 두 개의 배열이 생성됩니다.In fact, two arrays are created in this example, one inside Main and one inside the Change method.

참조로 참조 형식 전달Passing Reference Types by Reference

다음 예제는 ref 키워드가 메서드 헤더 및 호출에 추가된다는 점을 제외하고 앞의 예제와 동일합니다.The following example is the same as the previous example, except that the ref keyword is added to the method header and call. 메서드에서 발생하는 모든 변경 내용이 호출하는 프로그램의 원래 변수에 영향을 줍니다.Any changes that take place in the method affect the original variable in the calling program.

class PassingRefByRef
{
    static void Change(ref int[] pArray)
    {
        // Both of the following changes will affect the original variables:
        pArray[0] = 888;
        pArray = new int[5] {-3, -1, -2, -3, -4};
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main()
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);

        Change(ref arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr[0]);
    }
}
/* Output:
    Inside Main, before calling the method, the first element is: 1
    Inside the method, the first element is: -3
    Inside Main, after calling the method, the first element is: -3
*/

메서드 내에서 발생하는 모든 변경 내용은 Main의 원래 배열에 영향을 줍니다.All of the changes that take place inside the method affect the original array in Main. 실제로 원래 배열은 new 연산자를 사용하여 다시 할당됩니다.In fact, the original array is reallocated using the new operator. 따라서 Change 메서드를 호출한 후 arr에 대한 모든 참조는 Change 메서드에서 생성된 5개 요소의 배열을 가리킵니다.Thus, after calling the Change method, any reference to arr points to the five-element array, which is created in the Change method.

두 문자열 교환Swapping Two Strings

문자열 교환은 참조 형식 매개 변수를 참조로 전달하는 좋은 예입니다.Swapping strings is a good example of passing reference-type parameters by reference. 예제에서는 두 개의 문자열 str1str2Main에서 초기화되고 ref 키워드로 수정되는 매개 변수로 SwapStrings 메서드에 전달됩니다.In the example, two strings, str1 and str2, are initialized in Main and passed to the SwapStrings method as parameters modified by the ref keyword. 두 문자열이 메서드 및 Main 내에서 교환됩니다.The two strings are swapped inside the method and inside Main as well.

 class SwappingStrings
 {
     static void SwapStrings(ref string s1, ref string s2)
     // The string parameter is passed by reference.
     // Any changes on parameters will affect the original variables.
     {
         string temp = s1;
         s1 = s2;
         s2 = temp;
         System.Console.WriteLine("Inside the method: {0} {1}", s1, s2);
     }

     static void Main()
     {
         string str1 = "John";
         string str2 = "Smith";
         System.Console.WriteLine("Inside Main, before swapping: {0} {1}", str1, str2);

         SwapStrings(ref str1, ref str2);   // Passing strings by reference
         System.Console.WriteLine("Inside Main, after swapping: {0} {1}", str1, str2);
     }
 }
 /* Output:
     Inside Main, before swapping: John Smith
     Inside the method: Smith John
     Inside Main, after swapping: Smith John
*/

이 예제에서는 호출하는 프로그램의 변수에 영향을 주기 위해 매개 변수를 참조로 전달해야 합니다.In this example, the parameters need to be passed by reference to affect the variables in the calling program. 메서드 헤더와 메서드 호출 모두에서 ref 키워드를 제거하는 경우 호출하는 프로그램에서는 아무것도 변경되지 않습니다.If you remove the ref keyword from both the method header and the method call, no changes will take place in the calling program.

문자열에 대한 자세한 내용은 문자열을 참조하세요.For more information about strings, see string.

참고 항목See also