싱글톤 패턴
- 객체의 인스턴스를 하나만 생성하도록 하는 설계 패턴
- 특정 클래스의 인스턴스가 프로젝트 전반에 걸쳐 하나만 존재 + 이를 여러 곳에서 공유하여 사용하고 싶은 경우 사용
- 자원의 중복을 피하기 위해 사용
사용처
- DB 커넥션 풀
- 스레드 풀
- 시스템 설정 객체
필요성
- 시스템의 설정 정보를 저장하는 객체가 여러 개 생성 시, 각 설정 정보 간의 불일치 발생가능성
- 자원의 낭비 방지
구현법
- 생성자의 private 접근 제어
- 외부에서 인스턴스를 임의로 생성할 수 없어야 함.
- 정적 참조 변수
- 해당 클래스 인스턴스 참조가능한
private
정적 참조 변수가 필요함.
- 해당 변수로 생성된 유일한 인스턴스 참조함
- 해당 클래스 인스턴스 참조가능한
- 정적 메서드
- 외부에서 해당 클래스의 인스턴스를 얻을 수 있는 정적 메서드가 필요함
- 인스턴스가 생성 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
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[6단원]디자인 패턴 - 전략 패턴 (Strategy Pattern) (0) | 2023.09.23 |
---|---|
[6단원]디자인 패턴 - 템플릿 콜백 패턴(Template Callback Pattern - 견본/회신 패턴) (0) | 2023.09.23 |
[6단원]디자인 패턴 - 템플릿 메서드 패턴 ( Template Method Pattern) (0) | 2023.09.21 |
[6단원]디자인 패턴 - 개요 (0) | 2023.09.15 |
[6단원]디자인 패턴 - 어댑터 패턴 (0) | 2023.09.15 |