C#에서 참조로 개체 전달

Muhammad Maisam Abbas 2024년2월16일
  1. 값으로 변수를 C#의 함수에 전달
  2. C#의 함수에 대한 참조로 변수 전달
  3. C#의 함수에 대한 참조로 개체 전달
C#에서 참조로 개체 전달

이 자습서에서는 C#의 함수에 개체를 전달하는 방법에 대해 설명합니다.

값으로 변수를 C#의 함수에 전달

모든 값 형식 변수는 기본적으로 C#에서 값으로 전달됩니다. 값으로 변수를 함수에 전달하고 함수에서 해당 변수를 수정한다고 가정합니다. 이 경우 함수의 인수에 전달 된 변수의 값에는 영향이 없습니다. 여기서 일어나는 일은 전달 된 변수의 별도 사본이 메모리에 생성되고 모든 작업이 해당 특정 사본에서 수행된다는 것입니다. 다음 코드 예제는 C#에서 값으로 값 형식 변수를 전달하는 방법을 보여줍니다.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

출력:

New value = something
Original Value = Nothing

위의 코드에서 문자열 변수valueType을 값으로 전달 된 변수에 새 값을 할당하는method1()함수에 전달했습니다. valueType변수를method1()함수에 값별로 전달할 때 동일한 값을 갖는 두 개의 서로 다른 변수 사본이 메모리에 생성됩니다. 그런 다음 변수의 두 번째 복사본이something값으로 수정됩니다. 이 두 번째 복사본은method1()함수 내에서만 액세스 할 수 있습니다. 이 두 번째 값을 변경해도 원래 변수valueType은 변경되지 않습니다.

C#의 함수에 대한 참조로 변수 전달

C#에서ref키워드를 사용하여 참조로 값 유형 변수를 전달할 수도 있습니다. ref키워드는 값이 함수에 참조로 전달되도록 지정합니다. 이 접근 방식을 사용하면 메모리에 변수의 복사본이 하나만 존재하고 변수 값을 가리키는 함수에 별도의 포인터가 전달됩니다. 다음 코드 예제는 C#에서ref키워드를 사용하여 참조로 값 유형 변수를 전달하는 방법을 보여줍니다.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(ref string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(ref valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

출력:

New value = something
Original Value = something

위 코드에서 우리는 C#에서ref키워드를 사용하여method1()함수를 참조하여 값 유형 변수valueType을 전달했습니다. method1()함수는valueType변수에 대한 참조를 인수로 취하고valueType변수의 값을something으로 수정합니다. 이번에는 원래 값이 수정됩니다.

C#의 함수에 대한 참조로 개체 전달

기본적으로 클래스 인스턴스, 구조체 인스턴스 등과 같은 모든 참조 유형 변수는 C#의 함수에 참조로 전달됩니다. 여기서 일어나는 일은 원래 객체가 매개 변수로 함수에 전달되지 않는다는 것입니다. 객체에 대한 새 참조는 함수에 대한 인수로 값에 의해 전달됩니다. 따라서 동일한 메모리 위치를 가리키는 포인터 사본이 두 개 있습니다. 해당 포인터의 값을 수정하면 원래 객체의 값도 수정됩니다. 다음 코드 예제는 C#의 함수에 대한 참조로 개체를 전달하는 방법을 보여줍니다.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      obj.s = "something";
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine(sam.s);
    }
  }
}

출력:

something

위의 코드에서sam객체 내부의s속성을 수정하는dosomething()함수를 참조하여sam객체를 전달했습니다. 원래sam개체의 값을 변경하고sam.s속성에something을 할당합니다. 이것이 참조로 객체를 전달하는 기본 방법이지만이 방법에는 한 가지 예외가 있습니다. new키워드와 클래스 생성자를 사용하여 전달 된 객체를 초기화하면 객체의 별도 사본이 메모리 내에 생성됩니다. 해당 개체의 값을 변경해도 매개 변수로 전달 된 원래 개체는 변경되지 않습니다. 다음 코드 예제에서는이 개체가 값으로 C#의 함수에 전달되는 시나리오를 보여줍니다.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      Console.WriteLine("Initial passed value = {0}", obj.s);
      obj = new Sample();
      obj.s = "something";
      Console.WriteLine("New value = {0}", obj.s);
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine("Original Value = {0}", sam.s);
    }
  }
}

출력:

Initial passed value = Nothing
New value = something
Original Value = Nothing

위 코드에서 객체sam을 값으로 C#의dosomething()함수에 전달했습니다. dosomething()함수는 인수를 받아 초기 값을 인쇄하고 값을 수정하고 수정 된 값을 인쇄합니다. 이 새 값은 새 메모리 위치에 할당되며 원래 개체sam에서 액세스 할 수 없습니다.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

관련 문장 - Csharp Class