소프트웨어 디자인 패턴(software design pattern)은 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 소스나 기계 코드로 바로 전환될수 있는 완성된 디자인은 아니며, 다른 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 서술이나 템플릿이다.
객체지향언어를 사용한다면 캡슐화, 추상화, 상속, 다형성은 다 들어보았을것이다.
디자인패턴은 객체지향에서 사용할 수 있는 이러한 특징들을 이용해
코드를 유지보수하기 쉽게 재사용하는 방법이라고 생각하면 된다.
이 글에선 기존코드에 새로운 요구사항이 들어올때의 상황을 가정해보겠다.
Duck슈퍼클래스를 만들고, 클래스를 확장(상속)하여 다른 종류의 오리를 만들었다.
오리가 날 수 있도록해야되는 요구사항이 발생했다.
가장 기본적인 방법은 fly() 메소드를 Duck슈퍼클래스에 추가하는 것이다.
상속을 활용해 Duck을 상속받는 모든 클래스들이 날 수 있게 되었다.
그러나 상속받는 오리들 중 날면 안되는 오리가 있다면 문제가 된다.
슈퍼클래스에 코드를 추가한다면 적용받지 않아야할 서브클래스에도 행동이 추가된다. fly()를 오버라이드한다면 문제가 해결되지만 오버라이드를 통해 변경만 가능하다는 점이 문제다. 새로운 서브클래스가 추가될 때마다 이 과정을 거쳐야 한다.
오버라이드시 문제점
- 새로운 서브클래스 추가시 오버라이드를 통한 변경만 가능하다.
- 같은 오버라이드 코드를 가진 서브클래스끼리의 코드 재사용 불가하다.
상속을 사용할 경우 생길 수 있는 문제를 생각해보자
1.서브클래스마다 fly()의 행동이 달라질 때도 모두 오버라이드해야한다.
2. 새로운 요구사항이 생겼을때 코드를 일일히 바꿔야 한다.
3. 행동을 변경하기 위해 슈퍼클래스의 코드아니면 오버라이드한 코드는 변경해야한다.
이러한 문제점들을 극복하기 위해서 디자인패턴을 배워보자!