-
JAVA | 싱글톤 패턴 (Singleton Pattern)programming/JAVA 2020. 5. 20. 22:59
싱글톤(Singleton) 패턴
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는
디자인 패턴이다.
생성자가 여러 차례 호출 되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다 (생성자를 private로 선언해서 외부에서 생성 불가하게 하고 getInstance()로 받아서 사용한다. 싱글톤은 단 하나의 인스턴스(객체)를 생성해 사용하는 디자인 패턴이다.)
* 인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라! 동일(기존)의 인스턴스를 사용하게 하는 거라고 이해하자!
단 하나만 생성된다고 해서 이 객체를 싱글톤(Singleton)이라고 한다.
A class의 값을 B class가 필요로 한다면 Main class에서 A class의 값을 get 하고 B class에 set 해야한다.
이때 Main class를 거치지 않고, Main class 몰래 값을 전달하고 받는 패턴이 Singleton pattern 이다.
Main class 가 아닌 Singleton class를 만들어서 값을 주고 받는다.
Singleton class 의 멤버는 다른 클래스들에 의해 공유되어야 하기 때문에 여러개의 객체가 생성되면 안된다.
그렇기 때문에 Singleton class 객체는 여러개가 생성되지 않고 딱 하나의 인스턴스만 생성되어 heap메모리에 생성되고
나머지 클래스들이 이를 공유한다. Singleton class가 중재자가 되어 하나의 인스턴스를 사용해 값을 주고 받는다.
* Singleton 객체 접근
Singleton 객체는 static으로 선언되어 객체화 없이 접근이 가능 하지만 private 이기 때문에 외부에서 new로 선언할 수 없다.
Singleton class 내부에 선언된 getInstance() 메소드로만 접근이 가능하다.
getInstance() 를 사용해서 생성된 인스턴스가 없다면 인스턴스를 생성해서 리턴하고,
이미 생성된 인스턴스가 있다면 멤버 인스턴스를 리턴한다.
이러한 방법을 통해 메모리에는 단 하나의 Singleton 객체만 생성, 사용이 되고
객체 내부의 멤버들이 여러 클래스에 의해 공유될 수 있다.
Singleton pattern 사용 이유
고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지 할 수 있다.
싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터 공유하기 쉽다.
DBCP(DataBase Connection Pool) 처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용
- 스레드풀, 캐시, 대화상자, 사용자설정, 레지스토리 설정, 로그기록 객체 등
인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아짐
Singleton pattern의 문제점
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져
"개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남) 따라서 수정이 어려워지고 테스트하기 어려워진다.
멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있다.
참고 : 이것이 자바다https://jeong-pro.tistory.com/86 [기본기를 쌓는 정아마추어 코딩블로그]
https://qkrrudtjr954.github.io/design%20pattern/2017/11/24/singletone-pattern.html
'programming > JAVA' 카테고리의 다른 글
JAVA | 상속(Inheritance) (0) 2020.05.21 JAVA | 접근 제한자 (public, protected, default, private) (0) 2020.05.21 JAVA | 클래스 구성(필드, 생성자, 메소드) (0) 2020.05.16 JAVA | 객체 지향 프로그래밍(OOP : Object Oriented Programming) (0) 2020.05.15 JAVA | JAVA란? (0) 2020.05.13