WeakReference란
 가비지 컬렉션이 메모리를 회수하는 것을 허락하면서 레퍼런스를 참조하고 있는 클래스
    => 약한 참조


문제점


SampleClass a = new SampleClass();
SampleClass b = a;
a = null;
GC.Collect();

 다음과 같은 코드에서 SampleClass 객체는 회수되지 않는다
    => 메모리 누수



예시

1. 게임플레이에 사용되는 미사일들을 관리하는 미사일오브젝트풀러를 만들고 미사일들을 생성


2. 싱글턴으로 제작된 업적매니저가 업적클리어 결과 출력을 위해 미사일매니저의 미사일 하나를 참조(실제로 구현은 이렇게 안함.. 예시를 위해)


3. 게임플레이가 종료되어 업적을 출력한 후 미사일오브젝트풀러를 제거


4. 가비지컬렉션이 레퍼런스를 잃은 미사일들 수거

5. 업적매니저가 참조하고 있는 미사일은 레퍼런스를 잃지 않아서 수거되지 않음




사용법

SampleClass sampleClass = new SampleClass();
WeakReference weakRef = new WeakReference(sampleClass);

if (weakRef.IsAlive)
{
    Console.WriteLine(weakRef.Target);
}

sampleClass = null;
GC.Collect(0, GCCollectionMode.Forced);

if (weakRef.IsAlive)
{
    Console.WriteLine(weakRef.Target);
}




주의사항
Target을 외부에서 참조하지 말 것


Posted by @히테
,

.Net Framework


- 마이크로소프트에서 지원하는 윈도우 프로그램 개발 및 런타임 실행 환경

- 메모리 관리, 유형 및 메모리 안전성, 보안, 네트워킹, 응용 프로그램 배포 등 서비스 제공

- C#, F#, Visual Basic 등의 언어로 사용 가능


cf) .Net Core를 사용하여 Window, MacOS 및 Linux에서 앱 실행 가능






.Net Framework 구조



출처 : https://ko.wikipedia.org/wiki/%EB%8B%B7%EB%84%B7_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC#/media/File:Overview_of_the_Common_Language_Infrastructure.svg



1) CLR : 공통 언어 기반


- 마이크로 소프트가 구현한 CLI(Common Language Infrastructure)

- Common Language Runtime의 약자

- 언어에 종속적이지 않은 플랫폼을 제공


구성요소

- CTS (공통 타입 시스템) : .Net Framwork에서 사용되는 데이터 형식

- CLS (공통 언어 스펙) : .Net 프로그래밍 언어가 갖는 공통 언어 규약, 이를 만족해야 Managaed Code의 자격이 됨

- JIT (just-in-time compilation) : 동적 번역이라고 프로그램을 실행하는 시점에 기계어로 번역하는 기법, JVM, .NET, node.js에서 JIT 컴파일을 지원함

- VES (가상 실행 시스템) : 공통 중간 언어(CIL)을 하드웨어에 맞춰 기계어로 컴파일





2) .Net Framework 클래스 라이브러리


- CLR과 강력하게 통합된 다시 사용할 수 있는 형식의 컬렉션

- 객체 지향적


구성요소

- ASP.NET : 웹 구현을 위해 사용되는 기능 패키지
- Windows Forms : Windows GUI 응용 프로그램 개발을 위해 사용되는 기능 패키지

- WPF(Windows Presentation Foundation) : windows 데스크톱 응용 프로그램을 구축하기 위한 모델 제공

- Data and XML : .NET을 통해 만ㄷ르어진 응용 프로그램과 데이터가 연결이 잘 될 수 있도록 하는 기능 패키지

- Base Class Library(BCL) : .NET Framework를 사용하는 모든 언어가 사용할 수 있는 클래스들의 라이브러리, 파일입출력, 그래픽렌더, 데이터베이스,xml 조작 등의 기능 제공

Posted by @히테
,

C# Singleton

카테고리 없음 2018. 12. 29. 22:13

싱글턴


클래스를 하나의 인스턴스로 제한하고 글로벌한 액세스 지점을 제공하는 패턴




Sample Code

이 코드는 간략한 로직을 설명하기 위한 코드이고 구글링을 해보면 각 언어에 맞게 더 좋은 코드들이 많이 존재함



class Singleton
{
    private static object syncLock = new object();
    private static Singleton instance = null;
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncLock)
                {
                     if(instance == null)
                         instance = new Singleton();
                }
            }
            return instance;
        }
    }

    protected Singleton()
    {
    }

    public void Method()
    {
    }
}

public static void Main()
{
    Singleton.Instance.Method();
}


- instance를 하나만 사용하기 위해 싱글턴에 접근할 때 static으로 선언된 필드로 접근한다

- lazy initiallization : 사용되지 않을 때에는 instance를 생성하지 않았다가 필요로 할 때 생성한다

- 멀티쓰레드 환경에서도 작동하기 위해 instance에 접근할 때 lock 사용



cf) http://csharpindepth.com/articles/general/singleton.aspx 이 블로그에서 C#에서의 싱글턴에 대한 상세한 내용(.Net 4버전 이후 포함)을 담고있다. 아주 좋은 글





싱글턴의 장점


- 프로그램에서 한개의 인스턴스만 존재하도록 보장

- 전역적으로 접근 가능

- lazy initiallization을 통해 메모리 최적화





싱글턴의 단점


- 결국 전역변수! 싱글턴으로 제작한 코드를 수정해야할 경우 프로젝트 전체를 뒤져봐야함 => 로직 간 커플링이 생길 확률 높음

- 싱글턴에서 다른 객체의 레퍼런스를 참조하고 있다면 그 객체는 메모리에 계속 올라와 있을 확률이 있다

- 만약 알맞지 않은 곳에서 싱글턴을 사용해서 싱글턴이 메모리에서 내려와야할 때 어떤 클래스의 소멸자에서 싱글턴을 다시 호출하는 경우 다시 메모리에 올라옴

- 객체지향설계원칙 중 '개방-폐쇄 원칙'을 위배

- 멀티쓰레드 환경에서 동기화처리를 잘 해야한다



=> 싱글턴으로 인해 디버깅이 힘들어지고 로직 간 커플링이 생기고 메모리 관리가 어려워지는 경우가 생기기 때문에 꼭 필요한 경우에만 사용하자(리소스로딩, 통신모듈, 로깅, 캐시, 쓰레드풀 등등)


=> 개인적인 생각으로는 C#에서는 싱글턴 로직을 구현하는 것보다 static class를 활용하는 것이 더 좋아보인다

Posted by @히테
,