[6단원]디자인 패턴 - 싱글턴 패턴 (Singleton Pattern)

싱글톤 패턴

  • 객체의 인스턴스를 하나만 생성하도록 하는 설계 패턴
  • 특정 클래스의 인스턴스가 프로젝트 전반에 걸쳐 하나만 존재 + 이를 여러 곳에서 공유하여 사용하고 싶은 경우 사용
  • 자원의 중복을 피하기 위해 사용

사용처

  • DB 커넥션 풀
  • 스레드 풀
  • 시스템 설정 객체

필요성

  • 시스템의 설정 정보를 저장하는 객체가 여러 개 생성 시, 각 설정 정보 간의 불일치 발생가능성
  • 자원의 낭비 방지

구현법

  1. 생성자의 private 접근 제어
    • 외부에서 인스턴스를 임의로 생성할 수 없어야 함.
  1. 정적 참조 변수
    • 해당 클래스 인스턴스 참조가능한 private 정적 참조 변수가 필요함.
    • 해당 변수로 생성된 유일한 인스턴스 참조함
  1. 정적 메서드
    • 외부에서 해당 클래스의 인스턴스를 얻을 수 있는 정적 메서드가 필요함
    • 인스턴스가 생성 X → 해당 메서드 내에서 인스턴스 생성 후 반환

코드

package org.example.singletonPattern;

public class Singleton {
    static Singleton singletonObject; // static으로 선언된 객체는 클래스가 로딩되는 시점에 생성된다.
    
    private Singleton() {
    
    } // 생성자를 private으로 선언하여 외부에서 생성자에 접근할 수 없도록 한다.
    //
    // 이렇게 생성자를 private으로 선언하면 외부에서 new 연산자를 사용하여 객체를 생성할 수 없다.
    
    // 객체 반환 정적 메서드
    public static Singleton getInstance() {
        if (singletonObject == null) {
            singletonObject = new Singleton();
        }
        return singletonObject;
    }
    
}
  • 해당 정적 메서드는
    • 싱글턴 객체를 반환함.
    • Singleton.getInstance()가 처음 호출되면
      • singletonobject == null
      • null 인 경우
        • new Singleton() 을 통해 싱글턴 객체 생성
    • 다음 호출시
      • singletonObject 를 반환
  • 이러한 초기화 방식을 Lazy Initialization 이라고 함.
package org.example.singletonPattern;

public class Client {
    public static void main(String[] args) {
        // private 생성자이므로 new를 통해 인스턴스를 생성할 수 없다.
        // Singleton s = new Singleton(); // 컴파일 에러 발생
        
        // 유일하게 생성된 인스턴스를 getInstance() 메서드를 통해 접근한다.
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        Singleton s3 = Singleton.getInstance();
        
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s2 == s3);
        
        s1 = null;
        s2 = null;
        s3 = null;
    }
    
}
  • 출력

메모리 분석

  • s = null 전까지 메모리 구조가 위와 같다.
  • singletonObject , s1, s2 ,s3 등을 동일한 객체를 참조하고 있다.

속성과 제약조건

  • 싱글턴 객체는 상태를 가지며 안된다.
    • 한 참조변수가 싱글턴 객체의 상태를 변경하면
    • 그 변경이 모든 참조변수에 영향을 미친다.
    • 다만 읽기전용 속성 혹은 다른 싱글턴 객체 참조는 문제X


Uploaded by N2T