[Design Pattern]싱글톤(Singleton) 패턴이란?

Hyeon-Uk·2022년 8월 8일
0

싱글톤(Singleton)패턴 이란?

  • 프로그램이 실행될때 오직 1개의 인스턴스만 생성을 한 뒤, 필요시에 이 인스턴스를 공유받아 사용하는 디자인 패턴
  • 즉 인스턴스가 필요할 때, 똑같은 인스턴스를 만들지 않고 기존에 생성된 공용의 인스턴스를 활용

장점

  • 많은 인스턴스를 생성하지 않아서 메모리 낭비를 방지
  • 오직 한개의 인스턴스가 생성되는것을 보증
  • 객체를 한번 생성하고 참조값을 공유하기때문에, 매번 new로 새로운 인스턴스를 생성하는것보다 속도가 빠름
  • 전역으로 공유되는 단하나의 인스턴스이기때문에, 데이터의 공유가 쉽다.

단점

  • 오직 한개의 인스턴스를 공유하기 때문에, 맴버변수의 상태변화에 대한 동시성 문제가 생김
  • 따라서 Multi-thread환경에서 멤버변수에 대한 상태변화는 지양해야함.
  • private 생성자로 인해 상속이 어려움
  • Mock 오브젝트를 생성하기 힘들어짐

사용 이유

  • 객체의 인스턴스를 생성할때마다 메모리에 할당을 한다.

  • 하지만 공통되는 기능을 수행하는 객체를 매번 생성한다면 메모리의 낭비가 심해진다.

  • 예를들어 요청이 들어올때마다 로그를 기록해야 하고, 그 로그를 기록해주는 객체가 있다고 가정해보자.

  • 100명에 대한 요청이 들어오고, Singleton 패턴을 사용하지 않는다면, 100개의 Log객체가 생성이 될것이다. 생성이 되는 시간도 오래 걸리고, 로그하나 찍자고 객체를 100개 생성하니 메모리 낭비가 심해진다.

  • Singleton 패턴을 사용한다면, 이미 생성된 하나의 객체를 참조받기때문에 메모리 낭비를 방지할 수 있고, 객체를 생성하는 시간을 아낄 수 있다.

구현 예시(in Java)

public class Singleton {

    private static Singleton instance=new Singleton();//Heap영역에 인스턴스 한개만 생성해둠.

    private Singleton(){}//생성자는 private으로 새로운 인스턴스 생성을 막음

    //이 인스턴스를 사용하고싶으면 getInstance 메서드를 이용해서 객체의 참조값 반환
    public static Singleton getInstance(){
   	  if(instance == null){
        	instance = new Singleton();//혹시모를 객체 소멸을 대비해서 체크
        }
        return instance;
    }
    public void display(){
      System.out.println("Hello Singleton!");
    }
}

사용 예시(in Java)

public class Main {
  public static void main(String[] args) {
      Singleton instance1=Singleton.getInstance();//인스턴스를 참조받음
      Singleton instance2=Singleton.getInstance();//인스턴스를 참조받음
      instance1.display();//인스턴스의 메서드 실행
      instance2.display();//인스턴스의 메서드 실행

      System.out.println(instance1==instance2);//인스턴스가 같은 인스턴스인지
  }
}

/*
결과값:
Hello Singleton!
Hello Singleton!
true

*/
profile
Hi🖐

0개의 댓글