struct는 밸류타입 class는 참조타입이라고 이전에 설명을 하였다.
http://honestgame.tistory.com/2
일반 변수의 경우,
Call by value 이냐 Call by refrence 차이는 너무나도 많은 예제와 내용이 있다
뭐 Swap함수로 함수 파라미터를 value로 전달하면 바뀌지 않고
ref로 전달하면 잘 바뀐다는 그런 예제는 많으니
여기서는 생략.
C#에서는 밸류타입이냐 참조타입이냐를 잘 구분해야는데
기본데이터타입, 열거형, 구조체를 제외한 클래스, 배열(제너릭포함), 델리게이트, 인터페이스는
참조타입이다.
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은 new로 할당한 int형 배열이기 때문에 Change함수에서 바꾸면 원본에도 영향을 준다는걸
알 수 있다.
또한 Change()안에서 다시 new로 재할당 하였기 때문에
그 이후 pArray는 메인에 있는 arr 하고도 영향이 없다는걸
알 수 있다.
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
*/
여기서는 참조로 참조형식을 전달하고 있다.
Change() 내부에서 new로 재할당을 하여도
참조로 전달하였기 때문에 메인의 arr 포인터는 pArray배열을 가리키고 있다.
따라서 원본도 바뀌게 된다.
이렇듯 new로 할당한 힙메모리에 생성된 변수는
ref 키워드를 사용하지 않아도 원본값에 영향을 줄 수 있으므로
새로운 변수에 재할당할 필요가 있음을 보여주고 있다.
끝
'프로그래밍 > C# 프로그래밍' 카테고리의 다른 글
C# String Null 문자열 (0) | 2015.11.02 |
---|---|
C# nullable 형식 - 포인터화? (0) | 2015.10.28 |
Property - Get, Set (0) | 2015.10.21 |
파티셜 클래스와 파티셜 메소드 (0) | 2015.10.18 |
IComparable, IComparer 비교정렬 (0) | 2015.10.13 |