헤드퍼스트디자인패턴 - STRATEGY
0. 다시 시작
- 블랙잭 구현 중 막장 설계 및 스파게티 코드가 나오는것을 보고 손놨던 헤드 퍼스트 디자인 패턴 책을 다시 펼처본다.
- 책을 읽으며 생각을 정리하는 방식으로 블로깅
1. STRATEGY란
EXTENDS, 자바에서 익숙하게 보이는 키워드이며 상속을 의미한다.
도입부에선 이 상속의 문제점을 짚고 있다.
오리는 추상 개념이며, 실제 오리의 종류는 여러 가지이다. 청동 오리, 식용 오리 등등.. 학명으로 따지자면 수십가지 일 것이다. 다만 이러한 오리라는 추상 개념을 자바에 가져왔을때, 고무 오리, 나무 오리 등등은 오리 추상 클래스를 상속받는다면, 고무 오리, 나무 오리가 날아다니고 꽥꽥 소리 지를거라는 문제점을 지적하고 있다.
이는 중간 해결점에서 Flyable, Quackable이라는 인터페이스로 해결하고자 하지만, 이 또한 올바르지 않으며 오히려 최악의 방법이라 지적하고 있다.
인터페이스를 활용해 고무 오리가 날아다니고 나무 오리가 꽥꽥 꺼리는 상황은 방지 할 수 있지만, 코드 재사용성 측면에서 최악이라 꼬집고 있다.
캡슐화, 사용자에게 필요 없는 정보는 뒷단에 숨겨 보이지 않게 한다.
캡슐화, 설계 단계에서 자주 바뀔것 같은 부분과 바뀌지 않을 부분을 구분하여 캡슐화한다.
헤드퍼스트에서 얘기하는 원칙 중 구현이 아닌 인터페이스에 맞춰 프로그래밍한다는 디자인 원칙이 소개 된다.
풀어보자면, 클래스는 변수와 함수의 집합이며 나 또한 한 객체를 만들때 해당 객체가 동작할때 필요한 변수와 함수를 직접 클래스에 프로그래밍 했다. 설계와 훗일은 생가지도 않은채..
이렇게 되면 항상 내가 만든 클래스가 어떤 클래스에 종속되고 코드를 더 작성하거나 변경하는 것 외에는 행동을 변경할 여지가 없었다. 책에서는 이부분을 구현이 아닌 인터페이스에 맞춰서 프로그래밍 하라고 원칙을 세우고 있다.
여기서 인터페이스란 중의적 의미로 꼭 자바의 interface 키워드만을 사용하라고 강조하는 것이 아니라, abstract, interface 등 상위 형식을 사용해 프로그래밍하라는 의미이며, 이는 객체를 변수에 대입할때 상위 형식을 구현한 형식이라면 어떤 객체든 집어넣을수 있기 때문에 유연성이 커진다는 것이다.
책에서는 애니멀 객체를 상속받은 개 클래스와 고양이 클래스를 예로 들고 있다. 애니멀 객체는 makeSound() 메소드를 가지고 있으며, 개와 고양이 클래스는 이 메소드를 상속받아 올바른 행동만 구현 한다면 dog 객체를 Animal 상위 형식으로 만들어 사용할 수 있다.
처음 부터 완벽한 소프트웨어는 있을 수 도 있지만, 개발 라이프 사이클 어느 단계에서라도 디자인 원칙을 적용해 리팩토링 가능하다.
끝으로
- BLACKJACK 게임을 디자인 패턴 및 객체 지향적 설계를 적용해 공부해 보고 있던 도중, 짜파게티… 또는 한심한 코드가 나와 손을 놨던, 디자인 패턴 책을 다시 읽어 보며 정리를 해봤다.
- 또다시 읽으니 새로운 내용이 보이며, 실 업무에 적용을 해보고 싶은 욕구가 든다.
Reference
- 에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 버트 베이츠, 『 Head First Desgin Pattern』, 서환수 옮김, O’Reilly(1999.6.24).