Skip to content

Latest commit

 

History

History
69 lines (48 loc) · 3.42 KB

singleton.md

File metadata and controls

69 lines (48 loc) · 3.42 KB

싱글톤 패턴

싱글톤 패턴이란 ?

  • 어플리케이션이 시작될 때 어떤 클래스가 최초로 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.

예를들어 레지스트리 같은 설정 파일의 경우 객체가 여러개 생성되면 설정 값이 변경될 위험이 생길 수 있다.
인스턴스가 1개만 생성되는 특징을 가진 싱글턴 패턴을 이용하면, 하나의 인스턴스를 메모리에 등록해서 여러 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있게끔 할 수 있기 떄문에 요청이 많은 곳에서 사용하면 효율을 높일 수 있다.

주의해야 할 점은 싱글턴을 만들 떄 동시성 문제를 고려해서 설계해야 한다.


싱글톤 패턴의 장점

  • 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
  • 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용한다.
  • 두 번째 이용시 부터는 객체 로딩 시간이 줄어 성능이 좋아지는 장점이 있다.

이러한 강점을 가진 싱글톤 패턴은 DBCP (DataBaseCommection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용된다.

싱글톤 패턴의 단점

  • 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 개방-폐쇄 원칙을 위배한다.
  • 이는 객체 지향 설계 원칙에 어긋나기 때문에 수정이 어려워지고 유지보수의 비용이 높아질 수 있다. 또한 멀티 스레드 환경에서 동기화 처리를 안하면 인스턴스가 2개가 생성이 되는 가능성이 생기게 된다.

이러한 이유로 싱글톤 패턴은 꼭 필요한 경우가 아니라면 지양해야한다.


싱글톤 패턴 예제

public class CarClass {

  private static CarClass car = new CarClass();
  private CarClass(){}

  public static CarClass getInstance() {
    return car;
  }

  // 차 사용 시작
  public static void drive() {
    isUse = true;
    System.out.println("start driving");
  }

  // 차 사용 종료
  public static void parking(){
    isUse = false;
    System.out.println("parking");
  }

  public static boolean isEnableUseCar() {
    return !isUse;
  }
}

자동차(CarClass) 객체가 있다. 어떻게 해야 자동차 객체의 인스턴스가 하나만 존재하도록 할 수 있을까 ? (생성자가 private 면 아무도 객체를 생성하지 못한다.)
그렇다면 자신을 멤버로 선언해서 메모리로 올린다.
외부에서 멤버로 선언된 car를 가져올 수 있는 method를 만든다
이처럼 해주면 getInstance 메서드 외에는 CarClass 객체를 생성 및 사용이 불가하다.


private static CarClass = new CarClass(); 를 통해 최초 한번만 객체를 생성하고 이후에 해당 객체를 getInstance 메서드를 활용해 리턴을 받아 사용하는데 해당 차 객체를 누군가 이용하고 있으면 이용을 못하게 끔 구현한다.

이와 같은 방식이 싱글톤 패턴 방식이다.