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
에서 액세스 할 수 없습니다.
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