2024. 6. 7. 20:08ㆍJava
오늘은 싱글톤 패턴에 대해 공부해 볼 것이다.
싱글톤 패턴은 디자인 패턴의 종류 중 하나로 객체의 인스턴스가 오직 1개만 생성되는 패턴이다. 우선 싱글톤패턴이 속한 디자인 패턴에 대해 짧게 알아보자 디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위해 재사용 가능하도록 정리해 놓은 해결책이다.
디자인 패턴은 크게 세 종류로 분류되는데 생성 패턴(Creational Pattern), 행동 패턴(Behavioral Pattern), 구조 패턴(Structural Pattern)이 있다.
- 생성 패턴 (Creational Pattern)
객체 생성에 대한 메커니즘을 다루고 객체 생성의 복잡성을 줄이며, 객체 생성 과정을 캡슐화하는 방법을 다루는 패턴이다.
오늘 공부할 싱글톤 패턴도 이 패턴에 속한다.
생성 패턴에 속한 패턴 : 싱글톤(Singleton Pattern), 팩토리 메서드(Factory Method Pattern), 추상 팩토리(Abstract Factory), 빌더 (Builder), 프로토타입(Prototype Pattern) 패턴이 있다.
- 행동 패턴 (Behavioral Pattern)
객체 간의 상호작용을 정의하고 객체의 역할을 분담하는 방법을 다루는 패턴이다.
행동 패턴에 속한 패턴 : 옵저버 (Observer Pattern), 전략 (Strategy Pattern), 커맨드 (Command Pattern), 상태 (State Pattern), 책임 연쇄 (Chain of Responsibility Pattern), 방문자 (Visitor Pattern), 인터프리터 (Intepreter Pattern), 메멘토 (Memento Pattern), 중재자 (Mediator Pattern), 템플릿 메서드 (Template Method Pattern), 이터레이터 (Iterator Pattern) 패턴이 있다.
- 구조 패턴 (Structural Pattern)
클래스나 객체를 조합해 더 큰 구조를 만드는 방법을 다루는 패턴이다.
구조 패턴에 속한 패턴 : 어댑터 (Adapter Pattern), 브릿지 (Bridge Pattern), 컴포지트 (Composite Pattern), 데코레이터 (Decorator Pattern), 퍼사드 (Facade Pattern), 플라이웨이트 (Flyweight Pattern), 프록시 (Proxy Pattern) 패턴이 있다.
이제 본격적으로 싱글톤 패턴에 대해 알아보자
싱글톤 패턴은 인스턴스가 1개만 생성되게 만든 객체라 했는데 어째서 1개만 만드는 것일까?
쉽게 두가지 정도 생각해볼 수 있다.
- 싱글톤 패턴의 장점
1. 인스턴스가 하나만 생성되므로 메모리 절약에 유리하다.
최초에 생성된 인스턴스 하나만으로 고정된 메모리 영역을 사용하기 때문에 추후에 새로 인스턴스를 생성하지 않고 이미 만들어진 인스턴스에 접근한다. 즉 객체를 생성하는 비용 (시간, 자원)을 절약할 수 있다.
2. 전역적인 접근이 가능해 객체를 공유할 수 있다.
최초에 생성된 인스턴스가 전역으로 사용되기 때문에 다른 클래스에서 쉽게 접근이 가능하다.
그렇다면 장점이 있으면 단점 또는 문제점이 있을것이다. 그렇다면 문제점은 무엇일까?
- 싱글톤 패턴의 단점
1. 테스트가 어렵다.
싱글톤 패턴은 전역적으로 자원을 공유하고 있기 때문에 테스트 하기 위해서는 인스턴의 상태를 초기화 해줘야 한다. 전역에서 공유되는 상태에서 테스트를 수행하면 정확한 테스트 결과를 얻을 수 없을것이다.
2. 의존성이 명확하지 않다.
인스턴스가 보통 코드 내부에서 접근되므로 클래스가 어디에 의존되는지 정확히 알 수 가 없다. 그렇기 때문에 코드의 가독성을 떨어뜨리고 유지보수를 어렵게한다. 쉽게말하면 싱글톤 패턴을 남용하면 SOLID 원칙중 하나인 DIP를 위반한다는 것이다. 이전 게시글에서 설명했듯이 DIP를 위반하면 OCP 또한 위반할 가능성이 높다.
이제 싱글톤 패턴의 장단점을 설명했으니 싱글톤 객체를 생성하는 코드를 봐보자
public class SingletonEx {
private static SingletonEx instance = new SingletonEx();
// 전역으로 싱글톤 객체 생성
private SingletonEx() {}
// 외부에서 싱글톤을 새로 못만들게 private으로 막아둠
public static SingletonEx getInstance() {
return instance;
}
// 싱글톤 객체를 얻어서 사용하기 위한 코드
public void hello() {
System.out.println("hello");
}
// 싱글톤 객체로 호출하는 메서드
}
주석으로 설명했지만 다시 한번 언급하자면 전역으로 사용할 수 있게 static으로 생성해주고 외부에서 마음대로 싱글톤 객체를 만들 수 없게 private 으로 생성자를 막아둔것이다.
public class SingletonMain {
public static void main(String[] args) {
SingletonEx.getInstance().hello();
}
}
public class SingletonMain2 {
public static void main(String[] args) {
SingletonEx.getInstance().hello();
}
}
코드를 실행해보면 정상적으로 hello를 출력하는것을 볼 수 있다.
- 참고 자료
[Design pattern] 많이 쓰는 14가지 핵심 GoF 디자인 패턴의 종류
디자인 패턴을 활용하면 단지 코드만 ‘재사용’하는 것이 아니라, 더 큰 그림을 그리기 위한 디자인도 재사용할 수 있습니다. 우리가 일상적으로 접하는 문제 중 상당수는 다른 많은 이들이 접
m.hanbit.co.kr
싱글톤(Singleton) 패턴이란?
이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라
tecoble.techcourse.co.kr
이분의 블로그가 싱글톤 패턴을 너무 깔끔하게 정리해두셔서 공부에 도움이 된거같다.
[OOP] 디자인 패턴(Design Pattern)이란? - 장점 및 종류
디자인 패턴(Design Pattern)이란? 디자인 패턴은 개발하면서 발생하는 반복적인 문제들을 어떻게 해결할 것인지에 대한 해결 방안으로 실제 현업에서 비즈니스 요구 사항을 프로그래밍으로 처리하
ittrue.tistory.com
'Java' 카테고리의 다른 글
불변객체 VS 가변객체 (0) | 2024.06.15 |
---|---|
자바 GC(Garbage Collection) (1) | 2024.06.13 |
자바 메모리 구조 (0) | 2024.06.09 |