싱글턴(Singleton) 패턴은 생성 패턴(Creational Patterns)으로써 객체 생성에 관련된 패턴입니다. 위 캡쳐글인 위키피디아의 정의에 의하면 싱글턴(Singleton) 패턴의 정의는 최초 한번만 메모리를 할당하고 그 메모리에 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미합니다.
즉, 한 클래스의 기능을 여러 클래스에서 사용할 때 인스턴스를 새롭게 생성하면 메모리 적으로 손해가 생기니까 메모리를 아낄 때 싱글톤 패턴을 사용할 수 도 있고, 다른 의미로는 모든 클래스에서 접근하는 DATA 가 있던가, 사용하는 메서드가 있다면, 싱글턴으로 만들어두고 사용 할 수 있습니다.
싱글턴 패턴에서는 생성자를 클래스 자체에서만 접근할 수 있도록 private 접근 제어자로 생성자에 접근을 못하게 하여야 합니다. 만약 생성자를 Public 같은 접근 제어자로 선언하면, 해당 클래스를 다른 클래스에서 인스턴스화 시킬 수 있기 때문입니다. 그리고 접근 제어자로 막는 것과 값의 수정이 되지 않게 해야합니다. 만약 인스턴스 생성 이후, 수정이 가능하면 극단적인 경우 해당 클래스의 인스턴스의 값을 NULL로 초기화 시켜버릴 수 있기 때문입니다.
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// 생성자는 외부에서 호출못하게 private 으로 지정합니다.
// private로 되어있기 때문에 내부 값 수정이 불가능하게 됩니다.
}
public static Singleton getInstance() {
return instance;
}
public void say() {
System.out.println("Hi, Singleton");
}
}
요약
- 클래스 밖에서는 새로운 객체를 생성하지 못하게 접근 제어자를 private으로 만듭니다.
- 생성된 Singleton 객체를 저장할 수 있는 자신과 같은 타입의 static필드를 정의합니다.
- static 팩토리 메서드인 getInstance()를 만들고 이 메서드가 최초로 호출되는 시점에 한 번만 객체가 만들어지게 합니다.
- 생성된 객체는 static 필드에 저장됩니다. 또는 위의 예제처럼 static 필드의 초기값으로 객체를 미리 만들수 도 있습니다.
- 객체가 만들어지고 난 후에는 getInstance() 메서드를 통해 이미 만들어져 static 필드에 저장한 객체를 넘겨줍니다.
1. private 생성자를 갖고 있어 상속 불가능.
싱글턴은 자신만이 객체를 생성할 수 있도록 생성자를 private으로 제한 합니다. 하지만 객체지향에서는 상속을 통해 다형성을 적용하기 위해서 다른 기본생성자가 필요하므로 객체지향의 장점을 활용할 수 없습니다. (다만, spring과 같은 프레임워크에서는 이러한 단점이 해결 되었습니다.)
2. 구체 클래스에 의존해서 OCP(Open-Closed-Principle: 개방 폐쇄 원칙)를 위반할 가능성이 높다.
싱글턴으로 생성된 객체가 다른 클래스의 객체들과 많은 데이터를 공유하면 OCP원칙을 어기게 됩니다. 개방-폐쇄 원칙(OCP, Open-Closed Principle)은 '소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다'는 프로그래밍 원칙 입니다.
추가 공부가 이루어지면 내용을 지속적으로 업데이트 할 예정입니다.
https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4
https://ttl-blog.tistory.com/89