본문 바로가기
IT이야기/CS 지식

디자인 패턴 기초

by 행복찾아3만리 2022. 6. 6.
반응형

이번 글에서는 CS지식 중 하나인 디자인 패턴에 대해서 이야기해보도록 하겠습니다. 디자인 패턴이 무엇인가와 실제 디자인 패턴이 어떻게 쓰이는지에 대해 정리하였으니 공부하시는데 도움이 되었으면 합니다. 

 

디자인 패턴

디자인 패턴이란 프로그램 설계시 공통으로 발생했던 문제에 대해 재사용 가능하도록 한 '규약'입니다.

 

1 싱글톤 패턴(singleton pattern)

싱글톤 패턴이란 하나의 클래스가 단 하나의 인스턴스를 가지는 형태를 말합니다. 단 하나의 인스턴스를 가지다 보니 인스턴스 생성 비용이 줄어드는 장점이 있지만 의존성이 높아져 문제가 생기는 경우도 있습니다. 일반적으로 데이터베이스 연결을 위해 많이 사용됩니다. 데이터베이스를 연결하기 위해 싱글톤 패턴을 사용하게 되면 데이터베이스 연결에 관한 인스턴스 생성 비용을 줄일 수 있습니다.

※ 클래스(객체를 만들기 위한 설계), 객체(구현될 대상), 인스턴스(실체화된 것, 메모리에 할당됨) 

 

1.1 싱글톤 패턴의 단점

첫 번째, 싱글톤 패턴은 TDD(Test Driven Development)를 할 때 문제가 됩니다. TDD는 주로 단위 테스트를 진행하는데 단위 테스트의 경우 서로 독립적이어야 합니다. 하지만 싱글톤 패턴으로 생성된 인스턴스를 사용하는 경우 독립적이지 못합니다.

두 번째, 싱글톤 패턴은 의존성이 높다는 단점이 있습니다. 이때 의존성 주입(Dependency Injection)을 통해 모듈 간의 결합을 느슨하게 만들 수 있습니다. 예를 들어 아래 그림과 같이 메인 A 밑에 하위 B와 C가 있다면 메인 A가 변경되는 경우 B와 C도 변경이 일어납니다. 이런 경우 아래와 같이 의존성 주입자를 넣으면 됩니다.

※ 의존성(부모 모듈이 변하게 되면 자식 모듈도 변하게 되는 경우를 말합니다), 의존성 주입 장점, 단점(모듈을 쉽게 교체 가능하나 복잡해짐)

의존성 주입
의존성 주입

 

2. 팩토리 패턴(factory pattern)

팩토리 패턴이란  부모 클래스에서 자식 클래스가 어떤 객체를 생성할지 결정하는 패턴입니다.

Class 라면Factory{
	public static 라면 get라면(String type){
    	if("신라면".equals(type)){
        	return new 신라면();
        }
        else if("진라면".equals(type)){
        	return new 진라면();
        }
        else{
        	return Defalult라면();
        }
    }
}

 

3. 전략 패턴(strategy pattern)

전략 패턴(strategy pattern)은 정책 패턴(policy pattern)이라고도 하며 아래 로직과 같이 실행 중에 전략을 선택할 수 있는 디자인 패턴입니다.

interface 라면끓이기전략{
	public void 끓이기()
}
class 라면{
	public void 끓이기(라면끓이기전략 strategy){
    	strategy.끓이기()
    }
}
class 신라면전략 implements 라면끓이기전략{
	private int 온도;
	private int 물양;
	public 신라면전략(int 온도, int 물양){
		this.온도=온도;
	    this.물양=물양;
	}
}
class 진라면전략 implemnets 라면끓이기전략{
	private int 온도;
	private int 물양;
	public 진라면전략(int 온도, int 물양){
		this.온도=온도;
	    this.물양=물양;
	}
}
public class Main{
	public static void main(String[] args){
    	라면 ramen = new 라면();
        ramen.끓이기(new 진라면전략(70,50));
        ramen.끓이기(new 신라면전략(70,50));        
    }
}

 

4. 옵저버 패턴(observer pattern)

옵저버 패턴이란 한 객체의 상태가 변경되게 되면 그 객체에 의존하는 다른 객체에게도 상태가 전달되는 디자인 패턴입니다. 주로 이벤트 기반 시스템에서 사용됩니다. 옵저버 패턴 구현 방법은 여러 가지지만 보통 주제(Subject) 인터페이스와 옵저버(Observer) 인터페이스를 가지고 디자인합니다.

예제로 주제를 유튜버, 옵저버를 구독자로 하여 옵저버 패턴을 작성해보겠습니다. 

interface 유튜버명세{
	public void 구독자등록(옵저버 o);
	public void 구독자삭제(옵저버 o);
	public void 구독자알람();
}
interface 구독자명세{
	public void 업데이트();
}
publi class 유튜버 implements 유튜버명세{
	private List<구독자명세> 구독자들;
    
	public void 구독자등록(구독자명세 o){
    	구독자들.add(o);
    }
	public void 구독자삭제(구독자명세 o){
    	구독자들.remove(o)
    }
	public void 구독자알람(){
    	for(구독자명세 o : 구독자들){
        	구독자명세.업데이트();
        }
    }
}
public class 일반구독자 impements 구독자명세{
    priavte 유튜버 bj;
    
    public 구독자(유튜버 bj){
    	this.bj=bj;
        bj.구독자등록(this);
    }
	public void 업데이트(){
    	//일반 구독자는 알람이 없음
    }
}
public class 프리미엄구독자 impements 구독자명세{
    priavte 유튜버 bj;
    
    public 구독자(유튜버 bj){
    	this.bj=bj;
        bj.구독자등록(this);
    }
	public void 업데이트(){
    	//메일로 알람;
    }
}
public class 유튜브{
	public static void main(String[] args){
    	유튜버 슈카월드 = new 유튜버();
        구독자 lee = new 일반구독자(bj);
        구독자 kim = new 구독자(bj);
        
        슈카월드.구독자알람();
    }
}

 

 

 5. 이터레이터(iterator pattern) 패턴

이터레이터 패턴은 이터레이터(iterator)을 사용하여 Collection의 요소를 접근하는 패턴입니다. 서로 다른 구조를 가지고 있는 객체에 대해 접근할 때 사용되는 디자인 패턴입니다.

 

6. MVC 패턴

MVC 패턴은 Model, View, Controller로 구성된 디자인 패턴입니다. 애플리케이션을 3가지 역할로 나누어 각각의 요소에만 집중 개발할 수 있도록 만들어진 디자인 패턴입니다. 

 

7. MVP 패턴

MVP패턴은 MVC패턴에서 Controller를 presenter로 교체한 패턴입니다. MVC Controller의 경우 하나이상의 뷰를 가지는 것과 다르게 presenter는 View와 1:1 관계를 가지고 있습니다. 

 

8. MVVM 패턴

MVVM패턴은 MVC패턴에서 Controller를 View Model로 교체한 패턴입니다. View Model의 경우 View를 표현하기 위해 만든 View의 모델입니다.

 

여기까지 기본적은 디자인 패턴에 대해 알아보았습니다. 이것 외에도 많은 디자인 패턴이 있으며 숙지하고 있다면 개발하는데 큰 도움이 될 것입니다. 긴 글 읽어주셔서 감사합니다.

반응형

댓글