[디자인패턴] 싱글톤 패턴이란?

김우경·2021년 5월 25일
1

싱글톤 패턴이란

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
-위키피디아-

객체를 하나만 생성하고, 생성된 객체를 어디서든 참조가능하게 하여 프로그램 전반에서 하나의 인스턴스만 사용하게 하는 패턴이다.

자바의 싱글톤 패턴

  • private 사용 : 생성자를 private으로 선언하여 외부에서의 호출과 상속이 불가능하게 지정

장점

  • 메모리 낭비 방지 : 한번의 new로 인스턴스를 사용하므로 메모리 낭비를 방지할 수 있다.
  • 데이터의 공유가 용이함 : 전역 인스턴스이므로 다른 클래서의 인스턴스들과 데이터 공유가 쉬움
  • 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용
    -> DBCP란? 데이터베이스와 애플리케이션을 효율적으로 연결하는 커넥션 풀 라이브러리

문제점

  • 동시성 문제 고려 : 멀티쓰레드 환경에서 제대로 동기화 하지 않으면 race condition이 발생하여 인스턴스가 두개 생성되는 경우가 발생 가능
  • 개방 폐쇄 원칙 위배 가능 : 각 객체간의 결합도가 높아지고, 변경에 유연하게 대처할 수 없다.

동시성 문제 해결 방법

방법 1: 정적 변수에 인스턴스를 만들어 바로 초기화하기

private static Printer printer = new Printer();

와 같이 static 변수에 바로 인스턴트를 만들어서 초기화시킨다.


-> static 변수란? 객체가 생성되기 전 클래스가 메모리에 로딩될 때 만들어져 초기화가 한 번만 실행된다.
프로그램 시작~종료까지 없어지지 않고 메모리에 계속 상주하며 클래스에서 생성된 모든 객체에서 참조할 수 있다.

방법 2: 메소드에 동기화 블록을 지정하기

인스턴스를 만드는 메소드에 synchronized를 지정하여 해당 메소드를 임계구역으로 지정한다.
-> 다중 스레드 환경에서 여러 스레드가 동시에 접근하는 것을 방지한다.

출처

https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4
https://gmlwjd9405.github.io/2018/07/06/singleton-pattern.html
https://velog.io/@kyle/%EC%9E%90%EB%B0%94-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4-Singleton-Pattern

profile
Hongik CE

0개의 댓글