본문 바로가기

Language/C#

강한참조 / 약한참조(WeakReference)

강한참조


일반적으로 new 할당 후 새로운 객체를 만들어 해당객체를 참조하는방식이다.

할당된 객체를 해지하기 위해 null값을 넣어도 새로운 객체가 참조를 하고 있어

GC가 수집해 가지 않는다.



약한참조


WeakReference를 이용하여 new할당된 객체를 참조하는 방식이다.

할당된 객체를 해지하기 위해 null값을 넣으면 WeakReference객체가 참조를 하고 있어도

약한 참조를 하고 있기 때문에 GC가 수집해가서 할당된 객체는 사라지고

 weakreference 객체는 null값을 가지게 된다.



    
//new 할당할 객체 2개
stock phone;
stock notebook;

//각각 강한참조객체와 약한참조 객체
stock stock1;
WeakReference stock2;

public void Test( )
{
        //2개의 객체를 할당하여 각각 Phone, NoteBook이라는 이름을 가지게 한다.
        phone = new stock("Phone");
        notebook = new stock("NoteBook");
          
        
        stock1 = phone; //강한참조
        stock2 = new WeakReference(notebook); // 약한참조

        Console.WriteLine(stock1 == null ? "null" : stock1.name); // Phone 출력
        Console.WriteLine(stock2 == null ? "null" : stock2.name); // NoteBook 출력

        //할당을 해지하기 위해 해당객체에 null값 대입
        phone = null;
        notebook = null;

        //GC 강제 수행
        System.GC.Collect(0, GCCollectionMode.Forced);
        System.GC.WaitForFullGCComplete();

        //stock1의 경우 강한참조라 원본에 null을 넣어도 stock1이 참조하고 있으므로 객체해지가 안되었다.
        //stock2의 경우 약한참조라 원본에 null값을 넣으면 stock2가 참조하고있어도 객체해지가 되어 null값이 되었다.
        Console.WriteLine(stock1 == null ? "null" : stock1.name); // Phone 출력
        Console.WriteLine(stock2 == null ? "null" : stock2.name); // null 출력
}





주의해야할점


WeakReference.Target의 값을 보관하는순간 강한참조가 일어나 GC가 회수해 가지 않는다!









메인 오브젝트 관리 매니저에서 생성된 오브젝트들을 한번에 관리하다가

다른 매니저(객체 충돌관리 매니저 등)들이 해당객체를 컨테이너에 보관해서 관리하거나 해야한다면

weakreference를 이용하여 참조하는것이 좋을듯하다.

그래야 메인 오브젝트 관리 매니저에서 특정 객체를 삭제했을때 다른 매니저가 참조를 하고 있어도

삭제가 되기 때문이다.


대신 null값 체크를 꼼꼼히 해야할듯 하다.





참고

http://kookiandkiki.blogspot.com/2014/01/c-weakreference-idisosalbe.html

https://mirwebma.tistory.com/142?category=686846

'Language > C#' 카테고리의 다른 글

.NET Reflection  (0) 2019.03.08
Generalization  (0) 2019.03.06
Boxing / UnBoxing  (0) 2019.03.06
Collection의 성능문제 / Generic Collection  (0) 2019.03.06
C# 제네릭  (0) 2019.03.06