1. 싱글톤 패턴(Singleton pattern) 정리
싱글톤 패턴이란?
어플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.
예를들어 레지스트리 같은 설정 파일의 경우 객체가 여러개 생성되면 설정 값이 변경될 위험이 생길 수 있다.
인스턴스가 1개만 생성되는 특징을 가진 싱글턴 패턴을 이용하면, 하나의 인스턴스를 메모리에 등록해서 여러 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있게끔 할 수 있기 때문에 요청이 많은 곳에서 사용하면 효율을 높일 수 있다.
주의해야 할 점은 싱글턴을 만들 때 동시성(Concurrency) 문제를 고려해서 설계해야 한다.
싱글톤 패턴의 장점
- 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
- 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용한다.
- 두 번째 이용시 부터는 객체 로딩 시간이 줄어 성능이 좋아지는 장점이 있다.
이러한 장점을 가진 싱글톤 패턴은 DBCP (DataBaseCommection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용된다.
싱글톤 패턴의 단점
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우에 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙"을 위배하게 된다.
이는 객체 지향 설계 원칙에 어긋나기 때문에 수정이 어려워지고 유지보수의 비용이 높아질 수 있다.
또한 멀티쓰레드 환경에서 동기화 처리를 안하면 인스턴스가 2개가 생성 될 수 있는 가능성이 생기게 된다.
이러한 이유로 싱글톤 패턴은 꼭 필요한 경우가 아니라면 지양해야 한다.
2. 싱글톤 패턴(Singleton pattern) 예제
자동차(CarClass)라는 객체가 있다.
public class CarClass
어떻게 해야 자동차 객체의 인스턴스가 하나만 존재하도록 할 수 있을까?
private CarClass() {}
// 생성자가 private이면 아무도 이 객체를 생성할 수 없는데..
그렇다면 자신을 멤버로 선언해서 메모리에 올려놓자(static)
private static CarCalss car = new CarClass();
// 이렇게 해도 멤버로 선언된 CarClass 역시 private이다..
외부에서 멤버로 선언된 car를 가져올 수 있는 method를 만들면 된다!
public static CarClass getInstance() {
return car;
}
이처럼 해주면 getInstance 메서드 외에는 CarClass 객체를 생성 및 사용할 수 없게되었습니다.
구현
public class CarClass {
private static CarClass car = new CarClass();
private CarClass() {}
public static CarClass getInstance(){
return car;
}
private static boolean isUse = false;
// 차 사용 시작
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;
}
}
getInstance 메서드 외에는 CarClass객체를 생성 및 사용할 수 없습니다.
private static CarClass = car = new CarClass();를 통해 최초 한번만 객체를 생성하고 이후에 해당 객체를 getInstance 메서드를 활용해 return 받아 사용하는데 해당 차 객체를 누군가 이용하고 있으면 이용을 못하게 끔 구현하였습니다.
이와같은 방식이 싱글톤 패턴을 활용한 방식입니다.
'IT knowledge > GoF & Architecture' 카테고리의 다른 글
Layered Architecture (계층화 아키텍처) 란 무엇인가? (0) | 2023.03.13 |
---|---|
[디자인 패턴] 데코레이터 패턴(Decorator Pattern) 정리 및 예제 - 구조패턴 (0) | 2021.04.15 |
[디자인 패턴] 디자인 패턴(Design Pattern) 이란? - 개념 및 분류(생성 패턴, 구조 패턴, 행동 패턴) (0) | 2021.04.13 |
[디자인 패턴] 어댑터 패턴(Adapter Pattern) 개념 정리 및 예제 - 구조 패턴 (0) | 2021.04.08 |
[디자인 패턴] 디자인 패턴 개념 및 종류와 SOLID원칙 (객체지향 5대 원칙) (0) | 2020.12.24 |