C#에서의 reference를 알아보기 위해 약간의 테스트를 하였다.
C#에서도 Java에서와 마찬가지로 모든 값들을 reference로 유지 하고 있었다.
의문점은 과연 이 reference가 언제까지 유지가 되며 언제 바뀌는지가 궁금하여 테스트를 해보았다.
결과는 다음과 같았다.
Class C1 { public Test test = new Test(); }
Class C2 { public Test test = new Test(); }
Class Test { public string str = "Test"; }
C1 c1 = new C1(); C2 c2 = new C2();
c2.test = c1.test;
c1과 c2가 생성이 되면 안에 있는 test가 생성이 되면서 test는 각각의 Test instance를 reference로 만든다.
그리고 c2.test = c1.test가 되는 순간에 c2의 test는 기존에 가지고 있던 Test instance를 버리고 c1이 reference하고 있는 Test instance로 reference를 옮긴다.
그래서 이 시점에 c1.test와 c2.test가 같은 Test instance를 reference하고 있는 것이다.
하지만 이것이
Test newTest = new Test(); c1.test = newTest;
를 하게 되면 c1과 c2가 함께 reference하고 있던 Test instance를 c1 --> newTest
c2 --> 예전 Test instance
를 reference 하게 된다.
하지만, c1.test = newTest를 하기전에 c1.test.str = "New Test";
를 하게 되면 이것은 c1.test가 가리키고 있는 Test instance를 직접 호출 하여 값을 바꾸는 것이 되기 때문에
c1.test와 c2.test가 함께 바뀌는 결과를 낳게 되는 것이다.
이 사실은 basic data type에도 같이 적용이 된다.
예를 들어 c1.int = 3;
은 c1.int를 직접 호출하여 값을 바꾸는 것이지만, int x = 4; c1.int = x;
를 하게 되면 c1.int의 reference 값을 바꾸에 되어 c1.int와 c2.int의 값이 달라지게 된다.
위 사실만 주지 하고 있으면, C#에서의 reference는 마스터를 할 수 있다고 볼 수 있다.