2022. 6. 14. 15:42ㆍProgramming의 세계/JAVA
싱글턴 패턴을 말하기 앞서 디자인 패턴에 대해 알아야 한다.
디자인패턴이란?
디자인이라 하면 보통 심미적이거나 이쁜 모형, 예술을 생각이 먼저 나겠지만
코딩 세상에서는 특정 맥락에서 자주 발생하는 고질적인 문제들이 발생했을 때 재사용할 수 있는 훌륭한 코드디자인 혹은 방법을 말하는 것이다. (훌륭한 코드가 멋지고 이뻐 보여서 그런가...)
그리고 패턴이란 각기 다른 소프트웨어 모듈이나 기능을 가진 다양한 응용 소프트웨어 시스템들을 개발할 때도 설계과정에서 이를 처리하는 해결책 사이에 공통점들을 말한다. 일맥상통하는 구간이라고 생각하면 될 것 같다.
디자인패턴의 종류
GoF 디자인 패턴의 분류
| 생성(Creational) 패턴 | 구조(Structural) 패턴 | 행위(Behavioral) 패턴 |
| 추상 팩토리(Abstract Factory) 빌더(Builder) 팩토리 메서드(Factory Methos) 프로토타입(Prototype) 싱글턴(Singleton) |
어댑터(Adapter) 브리지(Bridge) 컴퍼지트(Composite) 데커레이터(Decorator) 퍼사드(Facade) 플라이웨이트(Flyweight) 프록시(Proxy) |
책임 연쇄(Chain of Responsibility) 커맨드(Command) 인터프린터(Interpreter) 이터레이터(Iterator) 미디에이터(Mediator) 메멘토(Memento) 옵서버(Observer) 스테이트(State) 스트래티지(Strategy) 템플릿 메서드(Template Method) 비지터(Visitor) |
생성 패턴 : 객체 생성에 관련된 패턴으로 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공.
구조 패턴 : 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
행위패턴 : 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴.
그 중 싱글턴 패턴은 생성패턴 분류에 속하는 것을 확인 할 수 있겠다.
싱글턴 패턴이란?

위키백과에 따르면 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다고 한다. 즉 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.
파이썬의 모듈은 그 자체로 싱글 턴이기 때문에 따로 설정하지 않아도 되며 자바에서는 생성자를 private으로 선언하여 상속이 불가능함을 지정하기도 한다.
싱글턴 패턴 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
싱글턴 패턴 - 위키백과, 우리 모두의 백과사전
ko.wikipedia.org
싱글턴 패턴을 쓰는 이유 : 메모리 낭비 방지, 데이터 공유 용이.
정보를 보관하고 공유하고자 하는 클래스가 한번의 메모리만 할당하고 그 할당한 메모리에 대해 객체로 관리하면,
여러 클래스에서 싱글턴 패턴으로 구성된 클래스의 생성자를 호출하더라도 처음 한번 생성된 인스턴스를 반환해주기 때문에 정보 공유 차원에서의 변수 관리 즉 동기화에 용이해진다.
그럼 자바를 이용하여 싱글턴을 구현해보자.
싱글턴 패턴으로 구성된 클래스 구성
public class ProductRepository {
//1.static 인스턴스를 준비한다.
private static ProductRepository instance = new ProductRepository();
public static ProductRepository getInstance() {
//2. 보통 static 매서드로 getInstance()를 대부분 쓴다.
return instance;
}
private ProductRepository() {
//3. 새로운 생성자 생성을 막기 위해 private을 쓴다. 이렇게 하면 new를 못한다.
}
}
해당 클래스 호출
ProductRepository repository = ProductRepository.getInstance();
1) 인스턴스를 제공하는 메서드와 인스턴스 변수 모두 Static으로 선언하는 정적 변수 및 메서드다. 기본생성자를 통해 생성할 수 없기 때문에 외부에서 인스턴스에 접근하려면 클래스 변수 및 메서드에 접근을 허용해야하기 때문에 두 메서드는 정적타입으로 선언되어 있다.
2) static 매서드로 getInstance()를 대부분 쓴다. getInstance는 내부적으로 생성되지 않았다면 생성하고, 기존에 생성된 값이 존재한다면 생성된 인스턴스를 리턴하는 형태로 프로그램 전반에 걸쳐 하나의 인스턴스를 유지한다
3) 기본생성자를 private 를 사용하여 생성을 불가능하게 하고 getInstance를 통해서만 부를 수 있다.
이제 누군가 디자인패턴에 대해 물어보면
"아~ 싱글턴 패턴 정도 써봤습니다~~~"
라고 자신있게 말하면 된다.
D.O.N.E!!!!

'Programming의 세계 > JAVA' 카테고리의 다른 글
| [JAVA] 자바 입문자용 인터페이스(Interface)의 이해 (0) | 2022.06.20 |
|---|---|
| [JAVA] split vs StringTokenizer (0) | 2022.06.09 |
| [JAVA] BufferedReader/ BufferedWriter/ StringBuilder (0) | 2022.06.09 |