싱글톤 패턴...
단일색의 톤으로 이루어진 문양인가 싶을 수 있지만
이는 디자인 패턴에서 사용된다.

애플리케이션이 시작될 때 어떤 클래스가 단 한 번만 메모리를 할당받고, 그 메모리에 단 하나의 인스턴스를 만들어 사용하는 디자인 패턴.
싱글톤을 구현하기 위해서는 외부에서 마음대로 객체를 생성하지 못하도록 생성 권한을 클래스 내부로 가져와야 한다.
private 생성자: 외부에서 new 키워드를 사용할 수 없도록 막는다.static 변수: 클래스 로딩 시점에 생성된 단 하나의 인스턴스를 보관합니다.static 메서드: 외부에서 인스턴스를 받아갈 수 있는 유일한 통로(getInstance)를 제공합니다.과거에는 여러 스레드가 동시에 접근할 때 객체가 2개 생성되는 문제가 있었으나, 현대 Java에서는 Lazy Holder 방식을 가장 권장한다.
public class Singleton {
// 1. private 생성자로 외부 생성을 원천 차단
private Singleton() {}
// 2. 내부 정적 클래스(Holder) 정의
// Singleton 클래스가 로드될 때가 아니라, getInstance()가 처음 호출될 때 로드됩니다.
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
// 3. 유일한 인스턴스를 반환하는 메서드
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
# ✅ 싱글톤 패턴의 장점 (Pros)
🚀 메모리 효율성: 객체를 매번 생성하지 않고 기존 인스턴스를 재사용하므로 메모리 낭비를 줄인다.
⚡ 속도 향상: 인스턴스가 이미 메모리에 올라와 있어 객체 생성 로딩 시간이 단축된다.
🌐 데이터 공유: 전역 인스턴스이므로 여러 클래스에서 하나의 상태를 공유하고 관리하기 쉽다.
🎯 유일성 보장: 설정 파일 관리자나 데이터베이스 커넥션 풀처럼 시스템 전체에서 하나만 존재해야 하는 자원을 안전하게 관리한다.
-----------------------------------------------------------------------------------------------
⚠️ 싱글톤 패턴의 단점 (Cons)
🔗 높은 결합도: 전역에서 접근 가능하므로 의존 관계가 복잡해지며, 유지보수가 어려워질 수 있다.
🧪 테스트의 어려움: 단위 테스트 시 독립적인 수행이 어렵고, 매 테스트마다 객체 상태를 초기화해야 하는 번거로움이 있다.
🛠️ 유연성 저하: 상속을 통한 확장이 어렵고, 내부 상태가 변경될 경우 예상치 못한 부작용이 발생할 수 있다.
🧵 멀티스레드 위험: 여러 스레드에서 동시에 접근할 경우, 인스턴스가 중복 생성될 수 있는 동기화 문제가 존재한다.