Java/Design Patterns

[자바 디자인 패턴] 싱글톤 패턴

LimeCoding 2023. 8. 15. 13:49

문제


 지금 게임의 환경 설정에 대한 부분을 구현하고 있다. 환경 설정은 그래픽, 소리와 같이 게임의 전반적인 요소에 대한 정보를 가지고 있기 때문에 모든 영역에서 환경 설정에 대한 정보를 제공할 수 있어야 한다. 또한 여러 개의 환경설정이 동시에 존재하면 일관성에 문제가 생기기 때문에 환경 설정은 한 개만 존재해야한다. 이를 해결하려면 어떻게 해야 할까?

 

 

싱글톤 패턴이란?


싱글톤 패턴이란 클래스에 인스턴스가 하나만 존재하게 만드는 것이다. 일반적으로 클래스를 생성한다는 것은 여러 개의 인스턴스를 생성하려는 목적으로 만들지만 데이터베이스에 접속하기 위한 클래스를 만든다고 가정했을 때 여러 인스턴스가 동시에 데이터베이스에 접근하도록 한다면 문제가 생길 것이다. 이런 문제를 해결하기 위해 오직 하나의 인스턴스만 생성하도록 하는 패턴이 싱글톤 패턴이다. 또한 싱글톤으로 생성된 패턴은 전역에서 접근할 수 있는 엑세스 지점을 제공한다.

 

싱글톤의 문제 해결 포인트

  1. 어떻게 하면 클래스가 하나의 인스턴스만 가지게 할 수 있을까?
  2. 어떻게 하면 전역에서 인스턴스에 접근하게 할 수있을까?

 

싱글톤의 문제 해결 방법


싱글톤에서는 위 문제를 다음과 같은 방법으로 해결하고 있다.

 

  • 클래스의 생성자를 숨긴다
  • 단일 인스턴스를 반환하는 스태틱 메소드를 정의한다.

 

위에 대한 구현은 다음과 같이 할 수 있다

package org.example;

public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton () {}
    
    public static Singleton getInstance() {
        return singleton;
    }
}

이렇게하면 생성자가 private이기 때문에 밖에서 객체를 생성할 수 없기에 외부에서의 생성을 막아준다. 또한 내부에서 하나의 인스턴스만 생성하고 그 인스턴스를 돌려주기때문에 단일 인스턴스 반환을 보장할 수 있다. 

정적 메소드와 변수는 전역에서 접근을 가능하게 해준다.

 

앞선 문제를 해결하기 위한 방법은 환경설정을 싱글톤으로 만들어 준 후 다른 영역에서 접근할 수 있도록 만들어주면 된다.

 

싱글톤의 장점과 단점


장점

  1. 클래스가 하나의 인스턴스만 갖는다는 것을 보장할 수 있다.
  2. 전역에서 인스턴스에 접근할 수 있다.

단점

  1. 테스트를 어렵게 만든다.(단일 인스턴스만 생성되기 때문에 테스트를 위한 대체 인스턴스 생성이 안됨)
  2. 다중 쓰레드 환경에서 동시접근에 대한 문제가 발생할 수 있다.
  3. 단일 책임 원칙 위반(싱글톤 자체는 문제가 없지만 자원 관리 클래스라는 이름으로 db 연결 관리(역할1)과 파일제어(역할2)를 동시에 하면 문제가 발생)

 

 

참고자료


  1. Refactoring guru,https://refactoring.guru/ko/design-patterns/singleton
  2. [O`Reilly. Head First] - Head First Design Patterns, https://github.com/ajitpal/BookBank/blob/master/%5BO%60Reilly.%20Head%20First%5D%20-%20Head%20First%20Design%20Patterns%20-%20%5BFreeman%5D.pdf
  3. DigitalOcean, https://www.digitalocean.com/community/tutorials/java-singleton-design-pattern-best-practices-examples
  4. The GoF Design Patterns Reference, https://www.w3sdesign.com/GoF_Design_Patterns_Reference0100.pdf

 

'Java > Design Patterns' 카테고리의 다른 글

[자바 디자인 패턴] 이터레이터 패턴  (0) 2023.09.01