I'm pine thank you and you?

[디자인 패턴, JAVA] Singleton Pattern(싱글톤 패턴) 정의, 목적, 용도 본문

CS

[디자인 패턴, JAVA] Singleton Pattern(싱글톤 패턴) 정의, 목적, 용도

SollyJ 2023. 2. 9. 23:11
Singleton Pattern

 

정의

객체의 인스턴스를 오직 1개만 생성할 수 있는 패턴

public class Singleton {
	// 외부에서 직접 인스턴스 생성을 못하도록 생성자의 접근 지정자 private
	private Singleton() {}
	
	// static하게 데이터를 만들어서 주입하고
	private static Singleton singleton;
	
	// return
	public static Singleton sharedInstance() {
		if(singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}

Singleton 클래스 정의

public class Main {
	public static void main(String[] args) {
		// 싱글톤 패턴으로 디자인 된 클래스의 인스턴스 생성
		Singleton singleton1 = Singleton.sharedInstance();
		Singleton singleton2 = Singleton.sharedInstance();
        
		// 해시코드 확인
		System.out.println(System.identityHashCode(singleton1));
		System.out.println(System.identityHashCode(singleton2));	// 똑같은 해시코드가 나온다.
	}
}

인스턴스 생성

 

목적

  • 메모리 측면

최초 한 번의 new 연산자를 사용하여 고정된 메모리 영역을 사용하고 접근하므로 메모리 낭비 방지

 

  • 속도 측면

이미 생성된 인스턴스를 사용하므로 속도 향상

 

  • 데이터 공유 용이

싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스가 접근이 용이하다.

But, 동시성 문제: 다른 인스턴스에서 한 인스턴스에 동시 접근하면서 생길 수 있는 문제 주의

 

  • 인스턴스가 1개만 있다는 것을 보증하고 싶을 때

ex) 설정파일의 경우 인스턴스가 여러개 생기면 설정 값이 변경될 위험이 있음

 

용도

Spring의 bean은 기본적으로 Singleton패턴이 적용되어있다.

서버 애플리케이션

👉 서버는 하나의 인스턴스를 이용해서 멀티 스레드로 클라이언트의 요청을 처리하기 때문에 서버에서는 하나의 클래스에 대한 인스턴스를 1개만 만드는 것이 일반적이다.

👉 서버에서 `작업을 처리하는 클래스``공유자원을 소유하는 클래스`에 싱글톤 패턴을 많이 적용한다.