코딩 개발/Java

Singleton (싱글톤 패턴)

호소세 2023. 5. 27. 11:08
728x90
반응형

Singleton Pattern 이란?

싱글턴 패턴은 객체의 인스턴스가 오직 1개만 생성되도록 보장하는 디자인 패턴입니다. 싱글톤 패턴을 사용하면 객체의 인스턴스를 공유할 수 있고, 객체의 생성 및 소멸을 제어할 수 있습니다.

 

Singleton Pattern의 장점

  • 객체를 단 한 번만 생성하여 메모리 낭비를 방지할 수 있습니다.
  • 객체를 프로그램 전체에서 공유할 수 있으므로 코드의 재사용성이 높아집니다.
  • 객체의 상태를 쉽게 관리할 수 있습니다.
  • 객체의 동기화를 쉽게 구현할 수 있습니다.

Singleton Pattern의 단점

  • 객체의 확장성이 떨어질 수 있습니다.
  • 객체의 테스트가 어려울 수 있습니다.
  • 객체의 모듈성이 떨어질 수 있습니다.

이렇게 장단점이 있어서 Singleton Pattern을 사용할 때는 장점과 단점을 모두 고려하여 신중하게 선택해야 합니다.

 

Singleton Pattern의 사용

  • 객체를 단 한 번만 생성하여 메모리 낭비를 방지해야 하는 경우
  • 객체를 프로그램 전체에서 공유해야 하는 경우
  • 객체의 상태를 쉽게 관리해야 하는 경우
  • 객체의 동기화를 쉽게 구현해야 하는 경우

사용 예시로는

  • 데이터베이스 연결
  • 프린터
  • 파일 시스템
  • 로그 시스템

이러한 것들이 있습니다.

Singleton Pattern 사용 비추천

  • 객체의 확장성이 중요한 경우
  • 객체의 테스트가 중요한 경우
  • 객체의 모듈성이 중요한 경우

Singleton Pattern 사용 방법

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

1. private static으로 자기 자신을 멤버변수로 선언합니다.

2. 생성자를 private으로 선언합니다.

3. 자기 자신이 없으면 자기 자신을 생성하고 돌려주는 함수를 생성합니다.(getInstance())

 

이렇게 하면 프로그램이 실행되고 해당 class 내부에 있는 함수를 실행할 때 해당 class에 대한 객체를 한 번만 생성하고 그 이후에 삭제가 되지 않는 이상 생성되지 않습니다.

 

이전 같은 경우에는

Singleton s1 = new Singleton();
Singleton s2 = new Singleton();
Singleton s2 = new Singleton();

이런 식으로 계속 객체를 생산하여 메모리에 부하를 주었다면

이제는

Singleton.getInstance()

이 코드로 class 내부에 있는 메서드나 변숫값을 가져올 수 있습니다. static 변수에 저장되어 있고 객체를 하나만 생성하기 때문에 메모리의 부하를 낮춰줍니다.

 

Singleton 객체 소멸방법

public class Singleton {

    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public static void atexitHandler() {
        delete instance;
    }
}

객체를 사용하지 않을 시에는 메모리 사용량을 줄이기 위해 개발자가 직접 객체를 삭제해줘야합니다.

그래서 atexitHandler라는 메서드를 만들어서 instance를 직접 삭제해 주면서

메모리 할당을 적게 해 줄 수 있습니다.

 

소감

예전에는 메모리 할당? 이런 것이 왜 중요한지 몰랐는데 이제는 아주 조금은 알 것 같습니다. 속도 개선을 위해서라면 이러한 기초 지식을 잘 알아야겠다고 생각했고 언젠가는 꼭 사용해봐야겠다는 생각을 했습니다.

비가 내리는 주말인데요. 다들 우산 잘 들고 나가세요

반응형