본문 바로가기
소프트웨어공학/디자인 패턴

Singleton 패턴 클래스의 인스턴스가 하나만 있는 것 | Design Pattern 디자인 패턴

by javapp 자바앱 2021. 10. 5.
728x90

디자인 패턴

Design Patterns

 

패턴이란 특정 context 내에서 주어진 문제에 대한 solution 이다.

문맥) 반복적으로 발생하는 상황

문제) context 내에서 이루고자 하는 목적과 제약 조건(constraint)

해결) 문제를 해결하는 일반적인 설계

 

 


 

 

디자인패턴 중 하나인 싱글톤 패턴

 

그 전에 " singleton " 에 대한 용어부터 알아보자.

Singleton
1. (단독) 개체
2. 독신자
3. 외둥이(단일아)

출처 : 네이버사전

 

  • 어떤 클래스의 인스턴스 갯수를 오직 하나로 제한하는 패턴
  • 시스템 전체의 행동을 조정해주는 단 하나의 객체가 필요할 때 
    • 중앙집중적인 관리

 

 

Singleton Pattern

: JVM 내에서 클래스의 인스턴스가 하나만 있는 것

어떤 클래스의 instance가 오직 하나만 생성되고, global access가 가능하도록 함.

 

 

목적 : Guarantees the number of instance of a certain class to ONE.

용도 : Centralized management of resources

-> 프로그램 내에 모든 client 에게 global accesspoint 제공해야 한다.

- Logger class, Registry class, Configuration class

- Shared resource : ex) Printer spooler, Memory manager

- Singleton factory : ex) 계좌 생성팩토리, 계좌 번호의 consistency

 

 

멀티톤 예방

  • Thrad-safety
  • 클래스 버전
  • 객체 복제 (Cloning)

 

 

Basic Mechanisms

기본 장치

Static initialization 클래스 최초 적재시 오직 한번 실행됨.
singleton 보장, thread-safe 보장.
정적 초기화 : 정적 변수 초기화
private constructor 클래스 외부에서 객체 생성 방지 (new .. 불가)
A single golobal access point All clients: Singleton.getInstance()

생성자가 private 일때 (new 생성 불가)

new 연산자를 얻기 위한 메소드가 필요.

 

 

 

 

Static initialization

Eager
initialization
Static initializer private static final Singleton INSTANCE = new Singleton();
Static initializer block private static final Singleton INSTANCE = null;
    //예외처리가 가능하다.

    static {
               INSTANCE = new Singleton();
     }
Lazy
initialization
Static class
(nested class)
private static class Holder{
     private static final Singleton INSTANCE = new Singleton();
}

Eager : 클래스 적재시 1회 실행

Lazy : 최초로 필요할 때

 

 

 

 

Eager instantiation using Static initializer

- 객체 사용 전에 미리 생성한다. 

- 프로그램 start-up 시 생성

private class Singleton
{
	// ① 정적초기화문 + ② private 생성자 ⇨ 유일성 보장.
    private static final Singleton INSTANCE = new Singleton();
    
    private Singleton(){ // 외부 호출 불가 (new .. 불가)
      ...
    }
    
    // ③ 모든 client가 사용할 global access point 제공
    public static Singleton getInstance(){
    	return INSTANCE;
    }
    
    // other attributes and poerations
 }

 

 

Eager instantiation using Static initializer block

  • 프로그램 실행 중 singleton object 가 반드시 필요한 경우 적절한 방법. ( 큰 규모, 미리 만들어야 될 경우 )
public class Singleton {

	private static final Singleton INSTANCE = null;
	
    static { // 정적초기화블록 ⇨ 예외처리 가능.
        try { 
            singleObject = new Singleton();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

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

	other attributes and operations
}

 

 

 

Lazy instantiation using Static Class

  • 객체가 실제로 필요할 때 생성
    • 즉, Singleton.getInstance() 가 실제로 호출 될 때 생성
public class Singleton
{

	// (중첩)클래스는 최초 잠조시 적재되며, 이때 정적초기화문이 실행된다.
    private static class Holder { // getInstance() 호출 시 실행
    	//예외 발생할 수 있으면 정적 초기화 블록 사용
        public static final Singleton INSTANCE = new Singleton();
    }
    
    private Singleton(){..}
    
    public static Singleton getInstance() { return Holder.INSTANCE; }
    
    // other attributes and operations
 }

실행

Singleton singleObject = Singleton.getInstance(); // 최초 호출 시 Holder 적재.

singleObject.aMethod();

 

public class Singleton
- instance: Singleton
- Singleton()
+ getInstance(): Singleton

UML 다이어그램 표현

 

 

 

댓글