728x90
객체의 생성 제어와 싱글톤(Singleton) 디자인 패턴
객체의 생성을 제한해야 한다면?
- 여러 개의 객체가 필요 없는 경우
- 객체를 구별할 필요가 없는 경우 = 수정 가능한 멤버 변수가 없고 기능만 있는 경우
- 이런 객체를 stateless한 객체라고 함
- 객체를 계속 생성/삭제 하는데 많은 비용이 들어서 재사용이 유리한 경우
Singleton 디자인 패턴
생성자가 여러번 호출되도, 실제로 생성되는 객체는 하나이며 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환시키도록 만드는 것
(java에서는 생성자를 private으로 선언해 다른 곳에서 생성하지 못하도록 만들고, getInstance() 메소드를 통해 받아서 사용하도록 구현한다)
- 외부에서 생성자에 접근 금지 -> 생성자의 접근 제한자를 private으로 설정
- 내부에서는 private에 접근 가능하므로 직접 객체 생성 -> 멤버 변수이므로 private 설정
- 외부에서 private member에 접근 가능하나 getter 생성 -> setter는 불필요
- 객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static 추가
- 외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용
class SingletonClass {
private static SingletonClass instance = null;
private SingletonClass() {}
public static SingletonClass getInstance() {
if(instance == null){
instance = new SingletonClass();
} return instance;
}
public void sayHello() {
System.out.prinln("Hello");
}
public class SingletonTest {
public static void main(String[] args) {
SingletonClass sc1 = SingletonClass.getInstance();
SingletonClass sc2 = SingletonClass.getInstance();
System.out.prinf("두 객체는 같은가? %b%n", sc1==sc2);
sc1.sayHello();
}
}
}
*getInstance()를 사용했을때 참조하는값이 동일해야 싱글톤
'Java' 카테고리의 다른 글
[Java] 추상클래스, 인터페이스, Generic (0) | 2023.01.31 |
---|---|
[Java] 다형성, 정적 바인딩, 동적 바인딩 (0) | 2023.01.31 |
[Java] 상속, 메서드 재정의, package, 제한자 (0) | 2023.01.31 |
[Java] 객체지향 프로그래밍, 변수, 메서드, 생성자 (0) | 2023.01.30 |
[Java] Java 기본 (0) | 2023.01.16 |