ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 싱글톤(Singleton) 패턴
    잡기술 2021. 2. 20. 02:21

    내가 회사에서 개발할 때 가장 많이 쓰는 패턴 중 하나다. 자꾸 이런 잡기술만 늘어가는 것 같다...

     

    하여튼 너무나도 유용하게 잘 쓰고 있는 패턴인데, 인스턴스를 하나만 가져서 공유할 데이터가 필요할 때 자주쓴다.

     

    여러가지 방법이 있다는데, 내가 쓰는 코드만 적으려 한다.

     

     

    간단한 예로, 카카오톡의 구조를 내마음대로 짜봤다.

     

    • MyAccount : 내 계정의 정보를 가지고있는 객체. 내 이름, 이메일과 같은 정보들을 가지고 있다.
    • Profile : 카톡 친구 화면에서 맨 위에 보이는 내 프로필
    • Chatting : 채팅 화면 표시해주는 객체
    • Setting : 환경설정 관련 객체

    이렇게 있다고 가정해본다. Profile, Chatting, Setting에서 모두 내 계정의 정보를 필요로 한다. Profile엔 내가 어떤 이름으로 설정했는지, Chatting화면에도 내 객체가 어떻게 표시되는지, Setting에선 현재 내 계정 정보가 어떻게 되어있는지 등이 구현되어야 한다.

     

    1. MyAccount

    public class MyAccount
    {
        private static MyAccount instance;
        public static MyAccount Getinstance
        {
            get
            {
                if (instance == null)
                {
                    instance = new MyAccount();
                }
                return instance;
            }
        }
    
        public string MyName { get; set; }
        public string MyEmail { get; set; }
    
        public MyAccount()
        {
                
        }
    
        public void SetMyAccount(string name, string email)
        {
            MyName = name;
            MyEmail = email;
        }
    }

    먼저 Singleton은 객체를 한번만 생성해야한다. static으로 선언해준다. 그리고 최초 생성시에만 null체크가 되어 객체를 생성하고, 그 후는 이미 만들어놓은 객체를 계속 재사용한다.

     

     

    2. 기타 클래스(Profile/ Chatting/ Setting)

    public class Profile
    {
        public string DisplayedName { get; set; }
    
        public void SetProfile()
        {
            DisplayedName = MyAccount.Getinstance.MyName;
        }
    }
    
    public class Chatting
    {
        public string MyName { get; set; }
    
        public void SetName()
        {
            MyName = MyAccount.Getinstance.MyName;
        }
    }
    
    public class Setting
    {
        public string CurrentName { get; set; }
        public string CurrentEmail { get; set; }
    
        public void LoadMyAccount()
        {
            CurrentName = MyAccount.Getinstance.MyName;
            CurrentEmail = MyAccount.Getinstance.MyEmail;
        }
    }

    간단하게 각 클래스 내의 변수들이 Singleton객체를 어떻게 사용하는지를 나타내기위해 간단히 작성

     

    이렇게 해주면! 동일한 데이터의 공유가 가능하며, 계속 객체 생성할 필요도 없이 최초 1회만 생성이 되어 메모리도 절약된다. Command 패턴이랑 Singleton을 가장 많이 사용하는 것 같다.

     

    솔직히 학교다닐땐 디자인패턴을 왜 배우는지 체감이 안됐는데, 이제 패턴없으면 못살거같다. 맨처음에 이런생각들을 어떻게 하는건지,,,

     

    추가로 Singleton을 좀더 고도화해서 thread-safety하게 작성할 수도 있다. 다음에 한번 회사에 적용시켜 볼 생각이다.

     

    반응형

    '잡기술' 카테고리의 다른 글

    단위 테스트 작성  (0) 2020.12.02
    개발 협업 도구  (0) 2020.11.26

    댓글

Designed by Tistory.