[CS]싱글톤 패턴

잡초·2024년 3월 22일
0

CS 스터디

목록 보기
1/4
post-thumbnail

싱글톤 패턴이란?

싱글톤 패턴은 객체를 딱 한 번만 생성하도록 보장하는 디자인 패턴이다. 이 패턴은 전역 변수를 사용하여 객체를 저장하고 다른 객체들이 그 객체를 공유하게 된다.

싱글톤 패턴은 주로 다음과 같은 경우에 사용된다.

  • 자원을 공유해야 하는 경우
  • 고비용 객체의 생성을 최소화해야 하는 경우
  • 시스템에서 단 하나의 객체만 존재해야 하는 경우

싱글톤 패턴 만들기

기본적인 싱글톤 패턴 예제

public class Singleton {

    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

싱글톤 패턴의 장단점

장점

  1. 메모리 측면의 이점
    싱글톤 패턴을 사용하게 된다면 한개의 인스턴스만을 고정 메모리 영역에 생성하고 추후 해당 객체를 접근할 때 메모리 낭비를 방지할 수 있다.

  2. 속도 측면의 이점
    생성된 인스턴스를 사용할 때는 이미 생성된 인스턴스를 활용하여 속도 측면에 이점이 있다.

  3. 데이터 공유가 쉽다
    전역으로 사용하는 인스턴스이기 때문에 다른 여러 클래스에서 데이터를 공유하며 사용할 수 있다. 하지만 동시성 문제가 발생할 수 있어 이 점은 유의하여 설계하여야 한다.

문제점

  1. 모듈간 의존성이 높아진다.
    대부분의 싱글톤을 이용하는 경우 인터페이스가 아닌 클래스의 객체를 미리 생성하고 정적 메소드를 이용해 사용하기 때문에 클래스 사이에 강한 의존성과 높은 결합이 생기게 된다.

  2. S.O.L.I.D 원칙에 위배되는 사례가 많다.
    우선 싱글톤 인스턴스 자체가 하나만 생성하기 때문에 여러가지 책임을 지니게 되는 경우가 많아 단일 책임 원칙(SRP)를 위반하기도 하고, 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스들 간의 결합도가 높아지게 되어 개방-폐쇄 원칙(OCP)에도 위배된다.
    그리고 의존 관계상 클라이언트가 인터페이스와 같은 추상화가 아닌, 구체 클래스에 의존하게 되어 의존 역전 원칙(DIP)도 위반하게 된다.
    따라서 싱글톤 인스턴스를 너무 많은 곳에서 사용할 경우 잘못된 디자인 형태가 될 수도 있다.
    그래서 싱글톤 패턴을 객제 지향 프로그래밍의 안티 패턴이라고 불리기도 한다.

  3. TDD 단위 테스트하기 어렵다.
    단위 테스트를 할때, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행 할 수 있어야 하는데, 싱글톤 인스턴스는 자원을 공유하고 있기 때문에, 테스트가 결함없이 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다. 그렇지 않으면 어플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못할 수도 있다.

간단한 사용 예

DB 연결 관리
싱글톤으로 여러 클래스에서 한 데이터베이스 연결 구현 가능

profile
개발자가 되고싶은 잡초

0개의 댓글