////
Search
🔂

Singleton pattern(싱글톤 패턴)

싱글톤 패턴이란? 위키백과 싱글톤 패턴의 경우 객체를 사용하기 위해 getInstance()를 여러번 호출하더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 특징
객체는 하나만 사용된다.
new를 사용하지 않는다(객체를 사용하는 입장에서는).
지연로딩과 즉시로딩? 두가지가 있다.
솔직히 이렇게 본다면 잘 이해가 안된다. 그래서 필자의 경우는 필자가 이해한 방식으로 싱글톤 패턴을 정의해본다.
예를 들어보자. 친구와 함께 나는 여행을 가기 위하여 짐을 싸는 중이다. 근데 수화물이 많아지는 것을 싫어한 친구와 나는 최소한의 짐을 가져가려고 한다. 만약 아래와 같은 짐을 싸야 한다고 가정해보자. 가져갈 짐(생각) 1. 충전기 2. 입을 옷 3. 노트북(여행가서 코딩해야 하니깐) 4. 칫솔 … 100. 여권 여기서 우리가 가져가야 할 짐 중에서 중복을 제거 시켜봤다. 그렇게 생각하던 중 충전기는 하나만 있어도 된다는 결론이 나왔다. 자 그럼 100가지를 물건을 캐리어에 넣어보자. 가져갈 짐(생각 - 중복 제거) 1. 충전기 - pd 충전기 여러개 포트있는거 들고가면 여러가지 충전기를 들고 갈 필요가 없네? 2. 입을 옷 3. 노트북(여행가서 코딩해야 하니깐) 4. 칫솔 … 100. 여권

싱글톤 적용 전

싱글톤 패턴을 적용하기 전에는 캐리어에 마구잡이로 집어 넣다 보니 충전기가 두 개가 들어가는 상황이 발생했다. 이유는 캐리어의 제일 안쪽에 하나의 충전기가 들어가서 보이지 않았던 것이다. 그렇다면 넣을 때부터 하나임을 보장할 수 있다면 중복된 물건을 넣을 일이 없지 않을까?

싱글톤 패턴을 적용 후

싱글톤 패턴을 적용한 이후에는 중복된 물건이 들어갈 수 없게 된다. 이유는 체크 리스트를 확인한 이후에 물건을 가져오고 챙기는 건 차후에 하기 때문이다. 그래서 체크 리스트만 잘 확인한다면 문제없다. 이렇듯 싱글톤에서 중요한 점은 체크리스트를 만들고 이를 이용해서 물건을 이미 챙겼는지 확인하는 것이다. 그 이후 사용 즉, 캐리어에 담을 땐 이미 하나 임이 보장된다.

non Thread Safe한 상황?

만약 친구와 내가 동시에 아직 들고오지 않은 물건에 대한 체크리스트를 확인하는 순간이 있지 않을까? 친구와 나는 멍청해서 체크리스트만 확인하고 방바닥에 물건을 던져놓고 짐을 챙겨 버린 것이다. 그래서 동시에 체크리스트를 확인할 땐 분명 충전기를 챙기지 않았는데 방바닥에는 두 개의 충전기가 만들어진 것이다.

Thread Safe한 상황?

이 상황을 대비하여 우리는 체크 리스트를 확인할 때 줄을 서기로 했다. 이렇게 하니 동시에 물건을 챙기는 일은 없어졌다. 싱글톤도 마찬가지로 생성시에 동시에 여러 쓰레드가 접근할 수 있다. 그렇다면 단순 if로 확인할 경우 문제가 발생할 수 있다. 그래서 줄을 세우는 것(synchronized)을 이용하여 한번에 한 쓰레드만 접근 시키는 것이다. 하지만 이 방법도 문제가 있다. 아래의 예시를 기준으로 물건을 100개 챙겨야한다면 확인하고 가져오데 시간이 너무 오래 걸릴 것이다. 그래서 메서드에 synchronized 키워드를 사용하는 것이 아닌 DCL:Double Checked Lock을 이용한다. 또한 enum을 이용할 수도 있고, Holder class를 이용할 수 있다. 본 예시로는 enum과 Holder를 이용하는 예시가 떠오르지 않아 따로 만들지 않았다.

싱글톤 패턴 이해하기

싱글톤 패턴이란? 위키백과 싱글톤 패턴의 경우 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 아하 캐리어에 담을때 무조건 하나만 담기도록 하는 거구나 특징
객체는 하나만 사용된다.
당연히 하나만 준비하니깐
new를 사용하지 않는다(객체를 사용하는 입장에서는).
캐리어 입장에서는 이미 생성(방바닥에 있는걸 담기만 함)되어 있는 걸 들고와서 넣기만 하구나.
지연로딩과 즉시로딩? 두가지가 있다.
방바닥에 미리 다 만들어 놓고 담는다. - 즉시
체크리스트가 없고, 방바닥에 미리 만들지 않아도 캐리어에 물건을 바로 담는게 가능하다. 이유는 원래부터 가지고 있던 충전기가 하나라서 가능하다. - 지연
싱글톤 패턴 Singleton - 방바닥 내부 변수 singleton - 방바닥에 있는 물건 getInstance() - 방바닥에 있는 물건을 캐리어로 가져오는 것
싱글톤 패턴의 경우 많은 방식이 있다는 점을 알 수 있다. 필요에 따라 Thread Safe 하게 아니면 지연을 시켜야 하는 경우도 있다. 이 부분을 잘 생각하고 사용하자. 1. Double Checked Lock 방식 - 지연 가능 2. enum을 활용한 방식 - 컴파일 타임 3. Holder class를 이용한 방식 - 지연 가능