---
description: 1.1.1 싱글톤 패턴
---

# 1.1.1 Singleton Pattern

싱글톤 패턴(Singleton Pattern)은 특정 클래스의 인스턴스를 하나만 만들고, 이 인스턴스를 어디서든지 접근할 수 있도록 하는 디자인 패턴입니다. 주로 애플리케이션 설정, 로그 관리, 데이터베이스 연결 등에 사용됩니다.



**싱글톤 패턴의 특징**

1. **유일한 인스턴스 보장**: 특정 클래스의 인스턴스가 하나만 존재하도록 제한합니다.
2. **전역 접근**: 인스턴스를 전역적으로 접근할 수 있도록 합니다.
3. **지연 초기화**: 인스턴스가 처음 사용될 때 생성되어 초기 로딩 시간과 메모리 사용을 절약할 수 있습니다.

**싱글톤 패턴 구현 예제 (Java)**

다음은 Java에서 싱글톤 패턴을 구현한 예제입니다:

```java
public class Singleton {
    // 클래스의 유일한 인스턴스를 저장할 정적 변수
    private static Singleton instance;

    // 생성자를 private으로 선언하여 외부에서 인스턴스 생성 불가
    private Singleton() {}

    // 인스턴스를 반환하는 정적 메서드
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

public class SingletonDemo {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        System.out.println(instance1 == instance2);  // true
    }
}
```

위 예제에서는 `Singleton` 클래스의 유일한 인스턴스를 보관하는 정적 변수 `instance`와, 이를 반환하는 정적 메서드 `getInstance`를 정의합니다. `new` 키워드를 통해 인스턴스를 생성할 수 없도록 생성자는 `private`으로 선언되었습니다. `getInstance` 메서드는 인스턴스가 없을 때만 새로 생성하며, 이후에는 동일한 인스턴스를 반환합니다.



**데이터베이스 연결 모듈에서의 싱글톤 패턴 (Java)**

다음은 데이터베이스 연결을 위한 싱글톤 패턴의 활용 예제입니다:

```java
public class Database {
    private static Database instance;
    private String url;

    private Database(String url) {
        this.url = url;
        connect();
    }

    public static Database getInstance(String url) {
        if (instance == null) {
            instance = new Database(url);
        }
        return instance;
    }

    private void connect() {
        System.out.println("Connecting to " + url);
        // 실제 데이터베이스 연결 로직
    }
}

public class DatabaseDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        Database db1 = Database.getInstance(url);
        Database db2 = Database.getInstance(url);

        System.out.println(db1 == db2);  // true
    }
}
```

이 예제에서는 `Database` 클래스가 데이터베이스 URL을 인자로 받아 초기화합니다. `getInstance` 메서드는 인스턴스가 존재하지 않을 경우에만 새로운 `Database` 인스턴스를 생성하고, 이후에는 동일한 인스턴스를 반환합니다. 이를 통해 애플리케이션 전반에 걸쳐 단일 데이터베이스 연결 객체를 사용할 수 있습니다.



**싱글톤 패턴의 장점과 단점**

**장점:**

* **유일성 보장**: 인스턴스가 하나만 존재하도록 보장하여, 불필요한 인스턴스 생성을 방지합니다.
* **전역 접근**: 어디서든 동일한 인스턴스에 접근할 수 있어, 관리가 용이합니다.
* **지연 초기화**: 인스턴스가 처음 사용될 때 생성되어 메모리 사용을 최적화합니다.

**단점:**

* **단일 책임 원칙 위반 가능성**: 싱글톤 클래스가 너무 많은 역할을 맡게 될 수 있습니다.
* **테스트 어려움**: 전역 상태를 가지므로 단위 테스트 작성이 어려울 수 있습니다.
* **의존성 숨김**: 싱글톤 인스턴스에 의존하는 클래스들이 이를 명시적으로 드러내지 않아, 코드의 명확성을 떨어뜨릴 수 있습니다.



싱글톤 패턴은 그 특성상 특정 상황에서 매우 유용하지만, 남용할 경우 코드의 복잡성을 증가시키고 유지 보수성을 떨어뜨릴 수 있으므로 신중하게 사용해야 합니다.
