싱글톤 패턴은,
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다.
보통 하나의 클래스를 가지고 여러개의 인스턴스를 만들 수 있지만,
그렇게 하지 않고, 하나의 인스턴스만 만드는 것이다!
보통 데이터베이스 연결 모듈에 많이 사용한다.
이렇게 한다면,
장점 | 하나의 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 새로운 인스턴스를 생성하는 비용이 줄어든다. |
단점 | 하나의 인스턴스를 다른 모듈들이 공유하면 사용하기 때문에 해당 인스턴스의 의존성이 높아진다. |
// DB 연결을 하는 것이기 때문에 비용이 더 높은 작업
const URL = 'mongodb://localhost:27017/kundolapp'
const createConnection = url => ({"url" : url})
class DB {
constructor(url) {
if (!DB.instance) {
DB.instance = createConnection(url)
}
return DB.instance
}
connect() {
return this.instance
}
}
const a = new DB(URL)
const b = new DB(URL)
console.log(a === b) // true
이와 같이 DB.instance라는 하나의 인스턴스를 기반으로 a,b를 생성해서
이를 통해 데이터베이스 연결에 관한 인스턴스 생성 비용을 아낄 수 있다.
코드로 싱글톤 패턴을 알아보자,
아래 코드를 확인해보자.
아래방식은, 인스턴스를 미리 한번만 만들어두는 가장 심플한 방법이다. (Eager Initialization 이라고도 한다.)
class Singleton {
// 싱글톤 클래스 객체를 담을 인스턴스 변수
private static final Singleton INSTANCE = new Singleton();
// 생성자를 private로 선언 (외부에서 new 사용 X)
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
클래스 외부에서 new를 통해 인스턴스를 제한 없이 사용하는 것을 막기 위해서
생성자를 private로 선언하고,
static 함수를 통해서 이미 생성된 객체를 반환하는 구조이다.
이러한 방식을 싱글톤 패턴이라고 보면 된다.
public class Main {
public static void main(String[] args) {
// Singleton.getInstance() 를 통해 싱글톤 객체를 각기 변수마다 받아와도 똑같은 객체 주소를 가리킴
Singleton i1 = Singleton.getInstance();
Singleton i2 = Singleton.getInstance();
Singleton i3 = Singleton.getInstance();
System.out.println(i1.toString()); // Singleton@1b6d3586
System.out.println(i2.toString()); // Singleton@1b6d3586
System.out.println(i3.toString()); // Singleton@1b6d3586
System.out.println(i1 == i2); // true
}
}
getInstance()를 통해서 객체를 불러와도
3개의 객체를 비교하더라도 같은 주소를 가리키는 것을 볼 수 있다.
싱글톤 패턴의 단점
싱글톤 패턴은 TDD(Test Driven Development)를 할 때 불리하다.
보통 TDD에서는 단위테스트를 주로 하는데,
단위 테스트는 테스트가 주로 독립적이어야 하고 테스트를 어떤 순서로든 실행할 수 있어야 한다.
싱글톤 패턴은 하나의 클래스당 하나의 인스턴스를 만들어 사용하는 것을 목표로 하다보니,
각 테스트 마다 독립적인(다른) 인스턴스를 만드는 것이 어렵다.
의존성 주입 (DI)
싱글톤 패턴은 모듈간의 결합도를 높일 수 있기 때문에
DI를 통해서 모듈간의 결합도를 낮출 수 있다.
DI는 이걸 참고!
https://hqc24.tistory.com/36
DI 패턴을 사용하여 IoC 설계 원칙을 구현하고 있다
IoC를 공부하려고 보니,스프링 공식문서에서는IoC는 DI로도 알려져 있다라고 설명하고 있다.(제어를 역전한다는게 도대체 무슨 말이야..?) DI -> 디자인패턴IoC -> 설계원칙 그렇다면? DI 패턴을 사
hqc24.tistory.com
디자인 패턴을 공부하면서 느낀 의문
그렇다면, 클래스당 인스턴스를 하나만 만들고 그것만 사용하면 되는거 아니야?
라는 의문이 들었다.

하지만 개발하면서 겪는 문제나 어려움등을 방지하기 위해서
개발자들이 디자인 패턴이라는 구조(규율)를 정하고
사용하는 것이라고 생각하면 납득이 간다!
열심히 공부해보자!
'CS > 디자인패턴' 카테고리의 다른 글
전략 패턴 (Strategy Pattern) (0) | 2025.04.24 |
---|