C#/클래스와 객체지향
C# 클래스와 객체지향 - 09. 값 복사와 참조 복사
tita
2024. 5. 28. 16:47
C#의 모든 자료형은 값(value) / 참조(reference) 두 가지로 나눌 수 있습니다.
지금까지 배워왔다너 int / float 등 기본 자료형은 값(value) 이고, 클래스로 만들어진 인스턴스(객체)는 참조(reference) 입니다.
다음 코드로 자세하게 살펴보겠습니다.
static void Main(string[] args)
{
int a = 10;
Random ran = new Random();
}
a는 선언과 동시에 메모리라는 영역에 4바이트의 영역을 잡고 값이 들어갑니다.
객체를 선언한 ran은 new Ranom()으로 인스턴스를 생성했기 때문에 힙(Heap) 이라는 영역에 위치를 잡습니다.
그리고 그 주소값이 ran에 들어가게 됩니다.
결국 변수 ran 은 객체의 값이 들어가는게 아니라 객체가 생성된 메모리의 위치를 참조하는 값이 들어가게 되는 것입니다.
[값 복사]
값 복사의 코드를 살펴보겠습니다.
class Program
{
static void Change(int input)
{
input = 10;
}
static void Main(string[] args)
{
int a = 10;
Change(a);
Console.WriteLine(a);
}
}
/*
[실행 결과]
10
*/
순서대로 설명해보겠습니다.
- 일단 변수 a에 10을 넣었습니다.
- 이후에 Change() 메서드를 호출하는데, 이때 10이라는 값이 그대로 복사됩니다. 결국 Main의 a = 10 이고 Change의 input = 10 이 됩니다.
- input을 20으로 바꾸면 Main의 a = 10, Change의 input = 20이 됩니다. 둘은 독립적인 변수이므로 변경해도 영향을 끼치지 않는것입니다.
[참조 복사]
참조 복사의 코드를 살펴보겠습니다.
class Program
{
class Test
{
public int value = 10;
}
// 아래의 Change는 Test를 받느냐, int 를 받느냐에 따라 달라진다
static void Change(Test input)
{
input.value = 20;
}
static void Change(int input)
{
input = 20;
}
static void Main(string[] args)
{
Test test = new Test();
test.value = 10;
Change(test);
//Change(test); 를 사용할 경우에는 참조 복사가 일어난다. 출력값은 20이 된다.
//Change(test.value); 를 사용하는 경우에는 값 복사가 일어나서 출력값이 10 이 된다.
Console.WriteLine(test.value);
}
}
/*
[실행 결과]
20
*/