디자인패턴이란?

  • 소프트웨어 개발 방법으로 사용되는 디자인패턴은 과거 소프트웨어 개발과정에서 발견된 설계의 노하우를 축적하여 그 방법에 이름을 붙여서 이후에 재사용하기 좋은 형태로 특정 규약을 만들어 정리한 것이다.알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만 특정한 상황에서 구조적인 문제를 해결하는 방식. 즉 “효율적인 코드를 만들기 위한 방법론”이라고 생각하면 편하다.



디자인 패턴의 종류

생성 패턴(Creational Patterns)

  • 객체 생성에 관련된 패턴. 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공함.



종류

생성

  1. Abstract factory : 인스턴스화 할 패토리에 대한 결정을 중앙 집중화 함

  2. Factory method : 여러 개의 구현 중에 특정 타입의 객체를 선택 생성하는 작업을 중앙 집중화함

  3. Builder : 생성 절차는 동일하나 서로 다른 결과를 가져오는 경우, 복잡한 객체의 구축을 표현(represention)과 분리함

  4. Lazy initialization : 객체 생성, 값 계산, 다른 값 비싼 프로세스를 실제로 필요한 시점까지 지연하는 전술

  5. Object pool : 더이상 사용하지 않는 객체의 재활용을 통해 값 비싼 획득 및 해지를 피함

  6. Prototype pattern : 어떤 애플리케이션에서 표준적인 객체 생성이 값비쌀 때 사용함

  7. Singleton pattern : 클래스의 객체 생성을 하나로 제한함




구조

  1. Adapter : 어떤 클래스를 위해, 클라이언트가 기대하는 하나의 인터페이스를 채택함

  2. Bridge : 추상적인 부분을 구현과 분리함으로써 두 요소가 독립적으로 확장 가능하게 함

  3. Composite : 각 객체가 동일한 인터페이스를 가지는 객체들의 트리구조

  4. Decorator : 상속을 사용할 경우 클래스 갯수가 지수적으로 늘어날 경우, 클래스에 기능 추가

  5. Facade : 기존의 복잡한 인터페이스들을 사용하기 쉽도록 단순화한 인터페이스 생성

  6. Flyweight : 공간을 절약하기 위해 공통의 속성을 공유하는 많은 수의 객체

  7. Proxy : 다른 것들을 위한 인터페이스 역할을 하는 클래스




행위

  1. Chain of responsibility : 명령 객체가 로직을 포함하고 처리하는 객체에 의해 다른 객체로 전달되거나 처리됨

  2. Command : 행위와 매개변수를 포함하고 있는 명령 객체

  3. Interpreter : 특정 문제 집합을 신속하게 풀기 위해 특수화된 컴퓨터 언어를 구현함

  4. Iterator : 객체 내부 표현방식을 노출하지 않고 집합 객체의 요소에 순차적으로 접근할 때 사용함

  5. Mediator : 하위 시스템 안에서 인터페이스의 집합을 위하여 통합된 인터페이스를 제공

  6. Memento : 객체를 이전의 상태로 되돌릴 수 있는 역량을 제공함 (Rollback)

  7. Null Object : 객체의 기본값(default value)으로 작동하도록 설계함

  8. Observer : 별칭 : Puvlish/Subscribe 또는 이벤트 리스너; 다른 객체에 의해서 발생할 이벤트를 관찰하기 위해 객체를 등록

  9. State : 실행 시점에 알고리즘을 선택할 수 있도록 함

  10. Specification : 부울리언 방식으로 재결합할 수 있는 비즈니스 로직

  11. Template method : 프로그램의 뼈대를 기술함으로써 처리 절차를 공유함

  12. 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