Head First 디자인 패턴 공부 - ( 스트래티지 패턴 )

2019. 9. 12. 13:25개발공부/디자인 패턴

 

경험을 공부하다.

코딩을 하다보면 더 깔끔하고 잘 짜여진 코드를 짜고 싶다는 욕심이 생긴다. 잘하는 개발자가 되고 싶다는 생각은 가지고 있지만 이제 막 시작하는 입장에서 생각처럼 잘 짜여진 코드를 만들기가 쉽지가 않다. 그래서 디자인 패턴을 공부를 시작하려고 한다. 이미 나보다 더 뛰어나고 앞서간 개발자들이 이미 똑같은 문제를 경험 했고 자신들의 경험과 교훈을 토대로 문제를 해결해 나가는 방법을 만들어 줬다. 이제 그 경험을 공부해서 ( 호로록~! ) 상황에 맞는 유연한 코드를 작성할 수 있는 능력을 길러보자.

 

디자인 원칙

"애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다."

코딩을 하면서 유지보수를 위해 앞으로 수정되어 바뀔 가능성이 있는 부분이 있다면 바뀌지 않는 부분으로 부터 분리해야 한다고 한다. 바뀌는 부분만 따로 뽑아서 캡슐화 한다면 나중에 바뀌지 않는 부분에는 영향을 주지 않고 그 부분만 고치거나 확장할 수 있기 때문이다.

  • example

    스타크래프트 게임 유닛 구현 시

    class Unit{
    	move(){...} // 유닛 이동
    	attack(){...} // 유닛 공격
    	display(){...} // 유닛 모습
    	sound(){...} // 유닛 대사나 소리
    	...
    }
    
    class Marin extends Unit{
    }
    class Zergling extends Unit{
    }

    먼저 Unit 클래스를 만들고 Unit을 상속하여 마린과 저글링 유닛을 만들었다.

    하지만 스타크래프트에는 마린과 저글링만 있는게 아니다. 앞으로 마린을 도와줄 매딕과 저글링을 도와줄 뮤탈을 만들 계획이다. 하지만 문제가 생겼다....

    매딕과 뮤탈을 구현하기 위해서 Unit 클래스를 상속 받았더니 매딕은 attack함수가 필요없었으며, 뮤탈은 이동할 때 move함수가 아닌 fly함수를 사용한다. Unit클래스에 fly를 추가하자니 다른 클래스들까지 의미없는 함수가 추가 되어 버린다.

    이러한 경우 이동, 공격과 같이 앞으로 개발을 하면서 바뀔 수 있는 행동들을 따로 분리하는게 첫번째 디자인 원칙이다.

 

"구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다."

상속받아서 직접 구현하는것이 아니라 바뀔수 있는 부분은 따로 빼서 새로운 클래스의 집합을 만들어야 합니다. 나중에 수정하기 편하도록 분리한 행동들을 해당 행동의 인터페이스를 구현한 클래스들의 집합을 만든다는 생각으로 작업하면 좋겠습니다.

  • example

    공격과 이동이라는 행동을 분리

    // << 공격 >>
    interface AttackBehavior{ attack(){};	}
    
    // 여러가지 공격을 가지는 클래스들을 구현
    // 총
    class AttackWithGun implements AttackBehavior{ 
    	attack(){ useGun(); }
    	useGun(){ ... }
    }
    
    // 침
    class SalivaAttack implements AttackBehavior{ ... }
    
    // 공격기능 없음
    class NothingAttack implements AttackBehavior{ ... }
    
    
    // << 이동 >>
    interface MoveBehavior{ move(){} }
    
    // 여러가지 이동방식을 가지는 클래들을 구현
    // 걷기
    class WalkUnit implements MoveBehavior{ 
    	move(){ walk(); }
    	walk(){ ... }
    }
    
    // 날기
    class FlyUnit implements MoveBehavior{ ... }

    이런식으로 행동을 분리해서 그 행동을 구현한 클래스의 집합을 만든다면 Unit 클래스에서는 더이상 이동과 공격이라는 행동을 어떻게 구현했는지에 대해서는 알고 있을 필요가 없게 된다.

    이제 이 공격클래스들은 유닛이 아닌 공격이 가능한 건물에서도 사용할 수 있게 되었다. 이로서 코드를 재사용할 수 있으며 원래 Unit클래스는 건드리지 않고 새로운 행동을 추가할 수 있게 되었다.

     

통합해보기

이제 분리된 클래스들을 어떻게 사용하는지 알아보자.

먼저 Unit클래스에 AttackBehavior와 MoveBehavior라는 두 개의 인터페이스 형식의 인스턴스 변수를 추가한다.

class Unit{
	// 인스턴스 변수로	
	AttackBehavior attackBehavior;	
	MoveBehavior moveBehavior;

	// 기존 attack과 move를 대신 한다.
	// attackBehavior와 moveBehavior에 초기화 되었는 동작을 실행하도록 유도
	performAttack(){ attackBehavior.attack() }
	performMove(){ moveBehavior.move() }

	display(){...}
	sound(){...}
	...
}

class Marin extends Unit{
	// 생성자에서 attack과 move에 원하는 동작으로 초기화
	Marin(){
		// 마린은 총을 사용하고 걸어다니도록 정해준다.
		attackBehavior = new AttackWithGun();
		moveBehavior = new WalkUnit();
	}
	...
}

정말 Unit에서 공격하는 행동이 분리가 되었다!! 이제 마린이 총이 아닌 침을 뱉게 변경하고 싶다면

다른 객체에 영향을 주지 않고, 마린만 attackBehavior = new SalivaAttack(); 으로 바꾸면 된다.

지금까지 알아본 방법을 자주 쓰이고 가장 기본적인 패턴인 스트래티지 패턴이라고 한다.

 

잡담

추석때 작정하고 책만 보려고 교보문고에서 과투자 하여 3권을 구매했다.

책은 두고두고 꺼내볼 수 있어서 그나마 먹는거나 놀때 쓰는거에 비해 어느정도 합리화가 된다ㅋ

추석안에 절반만 보자는 마인드로 시작!!

 

구매한 책

Head First Design Patterns

You Don't Know JS 시리즈

( Git Hub에 무료로 공개 되었지만 영어 ... )

 

https://book.naver.com/bookdb/book_detail.nhn?bid=1882446

 

HEAD FIRST DESIGN PATTERNS

참신한 유머와 퍼즐, 비주얼한 그림 그리고 친숙한 대화 스타일 등 색다른 시도로 주목받는 HEAD FIRST 시리즈의 DESIGN PATTERNS 편. 디자인 패턴을 사용하면 다른 사람들의 노력과 경험을 바로 활용해서 시간과 에너지를 절약할 수 있다. 이 책은 중요한 디자인 패턴과 사용 시기 및 이유, 즉시 디자인에 적용하는 방법, 패턴의 근간이 되는 객체지향 디자인 원칙 등의 내용 등을 다루고 있다.신경생물학, 인지과학, 학습이론 같은 분야의 최신 연구

book.naver.com

https://book.naver.com/bookdb/book_detail.nhn?bid=12199050

 

You Don't Know JS

모호하고 애매한 여덟 가지 자바스크립트 개념 길라잡이_YOU DON’T KNOW JS 시리즈웹 초창기 시절부터 자바스크립트는 사람들이 대화하듯 웹 콘텐츠를 소비할 수 있게 해준 기반 기술이었다. 20년 가까이 흐른 지금은 엄청난 규모로 기술적 역량이 성장하였고, 세계에서 가장 널리 사용되는 소프트웨어 플랫폼이라 불리는 웹의 심장부를 형성하는 핵심 기술이 되었다. 자바스크립트는 처음 시작하고 실행하기가 가장 쉬운 언어지만, 다른 언어보다 완전히 숙달한 사람

book.naver.com

https://book.naver.com/bookdb/book_detail.nhn?bid=12298924

 

You Don't Know JS

두 번째 You Don’t Know JS 시리즈 ‘this와 객체 프로토타입, 비동기와 성능’ 자바스크립트, 그중에서도 특히 ‘어려운 부분’을 심층적으로 다루는 [You Don’t Know JS] 시리즈의 두 번째 책이다. 자바스크립트 언어에서 가장 헷갈리고 난해한 동시에 그 무엇보다도 중요한 기본 개념인 this 바인딩과 프로토타입 체인, 그에 못지않게 난해한 비동기와 성능, 이 책은 이 두 주제를 집중적으로 파고든다. ‘this와 객체 프로토타입’에서

book.naver.com