
똑같은 일이 자꾸 벌어져 그 문제를 해결하기 위해 반복적으로 무언가를 해야 한다면,
그 일이 일어나지 않도록 하는게 가장 좋지만
그럴 수 없다면 반복적으로 하는 일을 쉽게 할 방법을 찾아야 한다.
쉬운 일은 쉽게 해야한다.
쉬운 일은 쉽게 할 수 있는 관점에서 접근해서, 쉽게 하도록 내버려 두어야 한다.
쉬운 일이 복잡해지기 전에, 쉽게할 수 있는 정형화된 방법을 찾는다.
무언가를 할 때 막막해도 아마 대부분이 일단 해내보일 것이다.
하지만 막막한 일이 또 벌어진다면, 아마 그 다음도 해내보일 것이다.
하지만 계속해서 벌어진다면, 누군가는 무너질 것이다.
물론 적응할 수 있겠지만 나는 적응하는 것이 더 문제라고 생각한다.
번거롭고 막막한 일은 번거롭지 않게 만들기 위해 수단을 가리지 말아야 한다.

내가 싫어하는 일에 대한 해결책으로 프로그래밍에는 디자인 패턴이란 개념이 존재한다.
디자인 패턴은 특정한 문제에 대하여 쉽게 풀이하는 방식과 같다.
코딩을 하다보면 다양한 문제에 직면하는데
어떤 문제들은 많은 사람들에게서 빈번하게 등장하는 공통 관심사이기도 하고,
다른 문제들은 한 작업 내에서도 빈번하게 등장하여 조치가 필요하기도 하다.
유능한 선조들은 이러한 상황을 타개하기 위한 여러가지 방법들을
디자인 패턴으로 정의해놓았다.

재사용성을 지닌 객체지향 소프트웨어의 핵심 요소
디자인 패턴의 교과서와 같은 책이다.
저자인 에릭 감마는 객체 지향 언어인 자바에도 지대한 영향을 끼친 인물이라고 한다.
디자인 패턴은 수십가지가 존재하는데, 생성, 구조, 행동 3가지 패턴으로 나눌 수 있다고 한다.
앞으로 맞닥뜨릴 디자인 패턴 하나 하나를 공부하면서
끝으로 이 책을 완전히 정복해보자!

전략 패턴이란, 런타임 중에 전략을 선택하여 객체의 동작을 바꿀 수 있도록 하는 디자인 패턴이다.
객체가 동작할 때 그냥 하는 것이 아니라, 동작에 여러 전략들이 있다고 이해하면 된다.
객체의 동작을 바꿀 수 있다는 것은 객체의 동작이 빈번하게 바뀔 때 적절한 패턴이라는 것.
interface Attack {
void basic();
void upgrade();
void special();
}
자바에서의 전략은 곧 인터페이스이다.
위에서 전략 패턴은 공격(Attack)이라는 인터페이스(전략)를 두고, 각 전략을 구현해내는 것이다.
class Sword implements Attack { // ** 클래스를 설계하여 전략 구현 **
@Override
public void basic() {
// 메서드 바디
}
@Override
public void upgrade() {
// 메서드 바디
}
@Override
public void special() {
// 메서드 바디
}
}
class Magic implements Attack { // ** 클래스를 설계하여 전략 구현 **
@Override
public void basic() {
// 메서드 바디
}
@Override
public void upgrade() {
// 메서드 바디
}
@Override
public void special() {
// 메서드 바디
}
}
공격이라는 전략에 대해 다른 구현체를 설계하면,
예를 들어 한 캐릭터는 자신이 잡은 무기에 따라 다르게 동작할 수 있다.

지금까지 '어디서 인터페이스를 정의할까?'
'어떻게 하면 유연하게 동작하도록 설계할 수 있을까?' 생각했던 고민들이
바로 전략 패턴의 출발이었던 것이다.
앞으로도 다양한 디자인 패턴을 이해하고 습득하여,
다가올 문제에 대해 내 머릿속의 도서관을 열어보는 상황을 자주 맞닥뜨려보자.