'call by reference'에 해당되는 글 1건

  1. 2015.01.19 C#에서 call by reference, call by value, 참조 카운터

코딩 하다보니까 조금 헷갈려서 확인차 이것 저것 해보다보니 더 헷갈렸다.

C#의 reference, value참조에 대해서 MSDN에 나와 있는 것 + 구글링 한 내용으로 정리 해 본다.

 

코드를 보는게 가장 빠르다.

 

Call By Value 

 public void CallByValue(int a)

{

a = 100;

}

 

static void main(string args[])

{

int test = 0;

CallByValue(test);

Console.WriteLine(test);

}

 

결과는 0

 

Call By Reference 

 public void CallByReference(ref int a)

{

a = 100;

}

 

static void main(string args[])

{

int test = 0;

CallByReference(test);

Console.WriteLine(test);

}

 

결과는 100

참고로 out을 써도 되는데 ref와 out에는 다음과 같은 차이가 있다.

out : 초기화 안되도 됨

ref : 초기화 되어야만 함

 

Class경우

 public class A

{

    public int m_Int = 0;

}

 

// 파라미터로 입력되는 A의 Instance에 대한 참조 카운터가 1개 증가

public Function1(A param)

{

    //참조카운터 2 상태 (main에서 사용하는 instance와 이 함수의 param)

    param.m_Int = 100;

   

    // 동일 메모리를 가리키는 하나의 포인터 제거 의미

    // 참조 카운터 1상태 (main에서 사용하는 instance는 메모리에 할당 된 A를 여전히 가리킴)

    param = null;

}

 

// 파라미터로 입력되는 A의 Instance에 대한 참조 카운터가 그대로 유지

public Function2(ref A param)

{

    //참조 카운터가 증가하지 않음

    // main의 instance를 param이라는 이름으로 바꿔 쓰는 의미

    param.m_int = 100;

   

    // param이 가리키는 메모리에 대한 참조 카운터가 0이 되어 메모리 에서 릴리즈 된다.

    // 더이상 main의 instance도 null이다.

    param = null;

 

}

 

 

static void main(string args[])

{

A instance = new A();

Function1(instance);

Console.WriteLine(instance.m_int);  //100 출력, instance는 여전히 메모리에 할당 된 영역 가리킴

 

Function2(instance);

Console.WriteLine(Instance.m_int); // Instance는 null이므로 에러가 발생한다.

 

}

 

Structure의 경우

 public structure A

{

    public int m_Int = 0;

}

 

// 구조체는 instance의 값이 param에 복사된다.

public Function1(A param)

{

    param.m_Int = 100;   

    param = null;

}

 

public Function2(ref A param)

{

    // main의 instance를 param이라는 이름으로 바꿔 쓰는 의미

    param.m_int = 100;

   

    // param이 가리키는 메모리에 대한 참조 카운터가 0이 되어 메모리 에서 릴리즈 된다.

    // main의 instance도 이제 null이다.

    param = null;

 

}

 

 

static void main(string args[])

{

A instance = new A();

Function1(instance);

Console.WriteLine(instance.m_int);  //0 출력, instance는 Function1에 값만 복사 해 줬다.

 

Function2(instance);

Console.WriteLine(Instance.m_int); // Instance의 m_int는 100이 되었다.그러나 instance가 null이 되어

                                                  // 이 문구에서 에러가 발생하게 된다. 

}

 

http://msdn.microsoft.com/en-us/library/0f66670z.aspx 

이 문서를 참조 하였다.

 

'프로그래밍 > 기타' 카테고리의 다른 글

UML-클래스다이어그램 관계 정리  (1) 2015.01.15
Posted by 굿쟌
,