싱글톤 패턴
어플리케이션이 시작될 때 어떤 클래스가 최초 한 번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.
간단하게 설명하면 전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
즉, 싱글톤 패턴은 이와 같은 상황에 사용을 한다.
- 프로그램 내에서 하나의 객체만 존재해야 한다.
- 프로그램 내에서 여러 부분에서 해당 객체를 공유하여 사용해야 한다.
싱글톤 패턴을 사용하는 이유
하나의 인스턴스만을 사용하는 싱글톤 패턴의 이점은 다음과 같다.
- 메모리 측면의 이점
싱글톤 패턴을 사용하게 된다면 한 개의 인스턴스만을 고정 메모리 영역에 생성하고 추후 해당 객체를 접근할 때 메모리 낭비를 방지할 수 있다. - 속도 측면의 이점
생성돈 인스턴스를 사용할 때는 이미 생성된 인스턴스를 활용하여 속도 측면에 이점이 있다. - 데이터 공유가 쉽다
전역으로 사용하는 인스턴스이기 때문에 다른 여러 클래스에서 데이터를 공유하며 사용할 수 있다. 하지만 동시성 문제가 발생할 수 있어 이 점은 유의하여 설계해야 한다.
이러한 장점을 가진 싱글톤 패넡은 DBCP (DataBaseCommection Pool)처럼 공통된 객체를 여러 개 생성해서 사용해야 하는 상황에서 많이 사용된다.
싱글톤 패턴의 문제점
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우에 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙"을 위배하게 된다.(객체 지향 설계 원칙에 어긋남)
따라서 수정이 어려워지고 테스트하기 어려지고 유지보수의 비용이 높아질 수 있다.
또한 멀티쓰레드환경에서 동기화 처리를 안 하면 인스턴스가 두 개가 생성된다든지 하는 경우가 발생할 수 있다.
결론
싱글톤 패넡은 메모리, 속도, 데이터 공유 측면에서 이점이 있다. 하지만 그렇다고 해서 싱글톤 패턴이 무조건 좋은 것은 아니다.
multi-thread환경에서는 동시성 문제가 발생할 수 있기에 싱글톤 패턴을 사용하고자 한다면 사용하기 앞서 "해당 객체의 인스턴스가 한 개만 존재해야 하는지?"의 여부와 "사용을 했을 때 동시성 문제가 발생하지 않는지"를 체크를 하며 사용해야 한다.
이러한 이유로 싱글톤 패턴은 꼭 필요한 경우가 아니라면 지양해야 한다.
참고 https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
'Java' 카테고리의 다른 글
[Java] ArrayList (0) | 2022.11.23 |
---|---|
[Java] Reflection(리플렉션) 이란? (0) | 2022.11.03 |
[Java] 컬렉션 프레임워크 (0) | 2022.10.31 |
[Java] Optional 이란? (1) | 2022.10.23 |
[Java] Stream(스트림)? (0) | 2022.10.18 |