# 디자인 패턴 - Singelton

오늘은 디자인 패턴 중 하나인 Singleton 패턴에 대해 간단히 소개해드리려고 합니다.

**Singleton 패턴이란?**

Singleton 패턴은 클래스에 단 하나의 인스턴스만 생성되도록 하는 패턴입니다. 즉, 클래스의 인스턴스를 생성하는 방법을 제한하여 클래스에 단 하나의 인스턴스만 생성되도록 합니다.

**Singleton 패턴의 장점**

Singleton 패턴을 사용하면 다음과 같은 장점이 있습니다.

- 클래스에 단 하나의 인스턴스만 생성되도록 보장할 수 있습니다.

- 클래스의 인스턴스를 공유할 수 있습니다.

- 클래스의 인스턴스를 캡슐화할 수 있습니다.

**Singleton 패턴의 예시**

Singleton 패턴의 예시로 게임의 주인공을 생각해 볼 수 있습니다. 게임의 주인공은 항상 하나만 존재해야 합니다. 따라서 게임의 주인공을 Singleton 패턴으로 구현할 수 있습니다.

다음은 Singleton 패턴을 사용하여 게임의 주인공을 구현한 예시입니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20231206/171418_rxmDrXtsQ8X4Bpx2NM?q=75&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20231206/171448_5FJ2YBUchzzHitMjzn?q=75&s=1280x180&t=outside&f=webp)

**Python Code**

```javascript
class Hero:

    __instance = None

    def __init__(self, name):
        self.name = name

    @classmethod
    def getInstance(cls):
        if cls.__instance is None:
            cls.__instance = Hero("Default")
        return cls.__instance

hero = Hero.getInstance()
print(hero.name)

```

위 코드에서 Hero 클래스는 __instance라는 클래스 변수를 사용하여 Singleton 패턴을 구현합니다. __instance 변수는 Hero 클래스의 인스턴스를 참조합니다. 

Hero 클래스의 getInstance() 메서드는 __instance 변수가 None이면 새로운 Hero 인스턴스를 생성하고, None이 아니면 __instance 변수에 저장된 인스턴스를 반환합니다.

클라이언트 코드에서는 Hero 클래스의 getInstance() 메서드를 사용하여 Hero 클래스의 인스턴스를 얻을 수 있습니다. getInstance() 메서드는 항상 동일한 Hero 인스턴스를 반환합니다.

**Singleton 패턴의 적용**

Singleton 패턴은 다음과 같은 상황에서 유용하게 사용할 수 있습니다.

- 클래스에 단 하나의 인스턴스만 생성되도록 보장해야 하는 경우

- 클래스의 인스턴스를 공유해야 하는 경우

- 클래스의 인스턴스를 캡슐화해야 하는 경우

Singleton 패턴은 디자인 패턴 중에서도 가장 기본적인 패턴 중 하나입니다. 따라서 디자인 패턴을 학습하는 개발자라면 Singleton 패턴을 반드시 이해하고 있어야 합니다.

Singleton 패턴을 사용할 때는 다음과 같은 주의 사항을 고려해야 합니다.

Singleton 패턴을 사용하면 클래스에 단 하나의 인스턴스만 생성되므로, 클래스의 인스턴스를 여러 번 생성해야 하는 경우에는 Singleton 패턴을 사용하지 않는 것이 좋습니다.

Singleton 패턴을 사용하면 클래스의 인스턴스를 공유하므로, 인스턴스의 상태가 변경될 때는 동시성 문제가 발생할 수 있습니다. 따라서 인스턴스의 상태를 변경할 때는 동시성 문제를 고려해야 합니다.

Singleton 패턴을 사용할 때는 이러한 주의 사항을 고려하여 사용해야 합니다.

오늘 소개해드린 내용을 바탕으로 Singleton 패턴에 대한 이해를 넓혀나가시기 바랍니다. 감사합니다.

For the site tree, see the [root Markdown](https://slashpage.com/kpmg-lighthouse.md).
