싱글톤 패턴(Sigletone Pattern)

박세건·2024년 5월 26일
0

디자인 패턴

목록 보기
17/17
post-thumbnail

싱글톤 패턴이란, 하나의 객체에 대해 인스턴스를 새로 만드는 것이 아닌 기존의 인스턴스를 가져와 활욜하는 생성 패턴이다.
우리가 전역변수나, 정적 변수를 만들어서 언제 어디서는 같은 값을 사용하기위해 정의하는 것처럼 하나의 인스턴스를 생성해서 재사용하는 것이다.
객체의 생성이 리소스를 많이 차지할때 효과적이다.

예를 들면 DB 연결 모듈이 있을때, 이 객체가 제공하는 기능만 사용하면되는 것이기때문에 이 객체를 굳이 새롭게 생성하는 것이아닌 하나의 객체를 생성해주고 재사용하는 것이 효율적이다.

구조

  • Singleton : 싱글톤 패턴이 적용되는 객체
  • instance : 싱글톤 객체의 인스턴스
  • getInstance() : 인스턴스를 불러오는 메서드
  • new를 통한 객체의 생성을 제한해야하기 때문에 생성자는 private으로 처리해준다.

예시 코드

싱글톤 객체 코드

class Singleton {
    // 싱글톤 클래스 객체를 담을 인스턴스 변수
    private static final Singleton INSTANCE = new Singleton();

    // 생성자를 private로 선언 (외부에서 new 사용 X)
    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

싱글톤 객체 사용 코드

public class Main {
    public static void main(String[] args) {

        // Singleton.getInstance() 를 통해 싱글톤 객체를 각기 변수마다 받아와도 똑같은 객체 주소를 가리킴
        Singleton i1 = Singleton.getInstance();
        Singleton i2 = Singleton.getInstance();
        Singleton i3 = Singleton.getInstance();

        System.out.println(i1.toString()); // Singleton@1b6d3586
        System.out.println(i2.toString()); // Singleton@1b6d3586
        System.out.println(i3.toString()); // Singleton@1b6d3586

        System.out.println(i1 == i2); // true
    }
}

장점

  • 메모리 공간을 효율적으로 관리할 수 있다.

단점

  • TDD 단위 테스트에 애로사항이 있음
    • 싱글톤 클래스를 사요애하는 모듈을 테스트하기 어렵다
    • 하나의 인스턴스때문에 반복되는 초기화 과정
  • 모듈간 의존성이 높아진다.
    • 하나의 인스턴스를 여러 모듈에서 사용하니 인스턴스가 변경되는 참조하는 모듈의 수정 필요
  • SOLID 원칙에 위배되는 사례가 많다
    • 인스턴스 하나만 생성하기에 너무 많은 책임을 갖게됨

사실 싱글톤패턴을 하나의 인스턴스 생성을 보증해서 효율적이지만, 그와 반대로 문제점이 많다.
때문에 직접적으로 싱글톤 패턴을 사용하는 것보다는 스프링과 같은 프레임워크의 도움을 받아서 싱글톤 패턴을 사용하는 것이 좋다.

용어 정리

  • 안티패턴 : 많이 사용되는 패턴이지만, 비효율적이고 비생산적인 패턴
profile
멋있는 사람 - 일단 하자

0개의 댓글