싱글톤(Singleton) 패턴이란?

최민재·2022년 5월 10일
14

공부

목록 보기
1/5
post-thumbnail

고등학생인 저는 수업이 끝이 난 후 동아리 시간.. 후임인 친구에게 질문이 받았습니다.
"싱글톤이 뭐임??"
"그.. 인스턴스가 딱 하나..?? 뭐 그런 느낌?"
말로 설명하려니 지식이 부족하다는 것을 깨닫고 말았습니다..
그래서!
한번 싱클톤(Singleton) 패턴에 대하여 정리해보겠습니다!!

싱글톤이 무엇일까요? 🧐

대부분 싱글이시니 싱글이 보통 무엇인지 당연히 아실 것입니다.ㅎ
일단 싱글이라고 하면

  • 한 개, 단 일의..

보통 그런 내용이 떠오릅니다.

좀 어렵게 말해서
싱글톤 패턴이란?

어떤 클래스가 최초 한번만 메모리를 할당하고 인스턴스를 생성해 사용하는 디자인 패턴이다.

위의 어려운 말을 쉽게 그림으로 보겠습니다!


원래라면 이런 식으로 C라는 객체가 2번 중복되어 사용이 될 것입니다.
하지만

하지만 싱글톤 패턴을 사용한다면 위의 사진과 같이 객체 하나를 함께 사용하는 일이 벌어집니다!
딱봐도 뭔가 훨씬 효율적일 것이라는 느낌이 듭니다!

싱글톤 패턴 왜 사용할까? 🌈

먼저 싱글톤 패턴은 메모리 측면에서 효율적입니다.
위에서 본 사진처럼 같은 기능을 하는데 여러번 반복되서 생성이 된다면 당연히 메모리 측면에서 좋지 않습니다.
최초에 한번 생성된 인스턴스를 그냥 사용하는 것이 훨씬 더 효율적이죠.

그리고 클래스 간의 데이터 공유가 쉽습니다.
그 이유는 위의 사진에서 전역으로 사용되는 싱글톤 인스턴스를 ClassA도 사용하고 ClassB도 사용하고 있기 때문이죠!

싱글톤 패턴의 단점! 🤕

이런 좋아보이는 싱글톤 패턴도 단점이 있기 마련입니다.

싱글톤을 구현하기 위한 코드가 많이 필요합니다..

아래에서 코드를 살펴보면 바로 알 수 있을 것입니다.
만약에 멀티 스레딩 환경이라면 동시에 호출해버리는, 동시성 문제가 발생할 수 있습니다. 그래서 자바에서는 synchronized를 붙여야 하기도 합니다.

테스트 하기 어렵습니다.

온전한 테스트는 격리된 환경에서 수행이 되어야 합니다.
하지만 싱글톤으로 구현된 인스턴스는 자원을 공유하고 있어서 매번 인스턴스의 상태를 초기화를 해주어야 합니다..

싱글톤 패턴 코드로 구현하기! 💻

싱글톤 패턴을 이제 직접 코드로 구현해 보겠습니다.
자바로 구현해 보겠습니다.

public class Singleton {
    private static Singleton instance = new Singleton();
    
    private Singleton() { } // 외부에서 호출하지 못하도록 private으로 지정했다.

    public static synchronized Singleton getInstance() {
        return instance;
    }
}

외부에서 생성자를 호출하여 객체를 만들 수 없도록 생성자에 private을 달았다. 객체를 미리 생성하고 그 객체를 getInstance()를 통해 받아올 수 있습니다.

static을 사용하며 객체를 정의하여 getInstance() 메서드를 사용할 수 있습니다.

그리고 위해서 언급한 동시성 문제를 막기 위해서 getInstance() 메서드에 synchronized를 붙여주었습니다!

마지막으로 💪

동아리 후임에게 잘 대답하기 위해서 짧게 싱글톤 패턴에 대하여 정리해 보았습니다. 이제 잘 대답할 수 있겠죠?

싱글톤 패턴은 정말 좋은 장점과 이에 못지 않게 단점이 꽤 많다는 것을 알았습니다. 위의 제가 적은 단점 말고도 객체 지향적인 문제 등 다양한 단점이 많습니다. 그런 단점을 구글링하여 찾아보시는 것을 추천드려요! 꼭 이런 장점과 단점을 잘 비교하여 상황에 맞게 사용하는 것이 좋을 것 같습니다.

아 참고로 저는 코틀린을 주로 사용해서 코틀린으로 싱글톤을 구현하는 방법은

object Singleton {

}

끝 입니다...

profile
Android Engineer

0개의 댓글