Java 싱글톤패턴에 대하여
디자인패턴이란?
- 소프트웨어 개발 방법으로 사용되는 디자인패턴은 과거 소프트웨어 개발과정에서 발견된 설계의 노하우를 축적하여 그 방법에 이름을 붙여서 이후에 재사용하기 좋은 형태로 특정 규약을 만들어 정리한 것이다.알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만 특정한 상황에서 구조적인 문제를 해결하는 방식. 즉 “효율적인 코드를 만들기 위한 방법론”이라고 생각하면 편하다.
디자인 패턴의 종류
생성 패턴(Creational Patterns)
- 객체 생성에 관련된 패턴. 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공함.
종류
생성
-
Abstract factory : 인스턴스화 할 패토리에 대한 결정을 중앙 집중화 함
-
Factory method : 여러 개의 구현 중에 특정 타입의 객체를 선택 생성하는 작업을 중앙 집중화함
-
Builder : 생성 절차는 동일하나 서로 다른 결과를 가져오는 경우, 복잡한 객체의 구축을 표현(represention)과 분리함
-
Lazy initialization : 객체 생성, 값 계산, 다른 값 비싼 프로세스를 실제로 필요한 시점까지 지연하는 전술
-
Object pool : 더이상 사용하지 않는 객체의 재활용을 통해 값 비싼 획득 및 해지를 피함
-
Prototype pattern : 어떤 애플리케이션에서 표준적인 객체 생성이 값비쌀 때 사용함
-
Singleton pattern : 클래스의 객체 생성을 하나로 제한함
구조
-
Adapter : 어떤 클래스를 위해, 클라이언트가 기대하는 하나의 인터페이스를 채택함
-
Bridge : 추상적인 부분을 구현과 분리함으로써 두 요소가 독립적으로 확장 가능하게 함
-
Composite : 각 객체가 동일한 인터페이스를 가지는 객체들의 트리구조
-
Decorator : 상속을 사용할 경우 클래스 갯수가 지수적으로 늘어날 경우, 클래스에 기능 추가
-
Facade : 기존의 복잡한 인터페이스들을 사용하기 쉽도록 단순화한 인터페이스 생성
-
Flyweight : 공간을 절약하기 위해 공통의 속성을 공유하는 많은 수의 객체
-
Proxy : 다른 것들을 위한 인터페이스 역할을 하는 클래스
행위
-
Chain of responsibility : 명령 객체가 로직을 포함하고 처리하는 객체에 의해 다른 객체로 전달되거나 처리됨
-
Command : 행위와 매개변수를 포함하고 있는 명령 객체
-
Interpreter : 특정 문제 집합을 신속하게 풀기 위해 특수화된 컴퓨터 언어를 구현함
-
Iterator : 객체 내부 표현방식을 노출하지 않고 집합 객체의 요소에 순차적으로 접근할 때 사용함
-
Mediator : 하위 시스템 안에서 인터페이스의 집합을 위하여 통합된 인터페이스를 제공
-
Memento : 객체를 이전의 상태로 되돌릴 수 있는 역량을 제공함 (Rollback)
-
Null Object : 객체의 기본값(default value)으로 작동하도록 설계함
-
Observer : 별칭 : Puvlish/Subscribe 또는 이벤트 리스너; 다른 객체에 의해서 발생할 이벤트를 관찰하기 위해 객체를 등록
-
State : 실행 시점에 알고리즘을 선택할 수 있도록 함
-
Specification : 부울리언 방식으로 재결합할 수 있는 비즈니스 로직
-
Template method : 프로그램의 뼈대를 기술함으로써 처리 절차를 공유함
-
Visitor : 객체로부터 알고리즘을 분리하는 방법
이 중에 오늘 알아볼건 싱글톤패턴이다.
싱글톤 패턴이란?
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
- static 변수, 메서드를 활용하여 구현 할 수 있음
싱글톤패턴으로 객체 구현하기
Company.java
package ch18;
public class Company {
private static Company instance = new Company();
private Company() {}
public static Company getInstance() {
if (instance == null) {
instance = new Company();
}
return instance;
}
}
CompanyTest.java
package ch18;
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company1);
System.out.println(company2);
}
}
결과
ch18.Company@26f0a63f
ch18.Company@26f0a63f
싱글톤패턴의 사용이유
- 고정된 메모리 영역을 얻으면서 한번의 new 인스턴스를 사용하기 때문에 메모리 낭비방지
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기가 쉬움
- 인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용함
- 두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아짐
싱글톤패턴의 문제점
- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 “개방-폐쇄원칙”을 위배하게 된다.
- 객체 지향 설계 원칙에 어긋남
- 멀티쓰레드 환경에서 동기화처리를 안하면 인스턴스가 두개가 생성되거나 하는 경우가 발생할 수 있음
결론
- 적절히 잘 사용하자.
Leave a comment