본문 바로가기

Design Patterns

Decorator Pattern ② Open Closed Principle

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
OCP(Open Closed Principle) 에 대해서는 Agile Java 스터디를 하면서 한번 발표한 내역이 있기 때문에 책을 보면서 그렇게 생소한 개념은 아니었습니다. 디자인 원칙중에서 가장 중요한 원칙중에 하나라고 소개하고 있는 OCP는 약간은 모순적인 개념입니다.

확장에 대해서는 열려있고, 코드 변경에 대해서는 닫혀 있다.
뭔가 동시에 만족할 수 없는 조건입니다만, 실제 코드를 변경할 수 없는 상황에도 시스템을 확장할 수 있게 해주는 객체지향 기법이 있다고 합니다. -_- 헉.. 그게 바로 앞서 배웠던 옵저버 패턴이라고 합니다. 아 그렇군요.. 생각해보니 옵저버 패턴에 몬스터와 싸우는 플레이어를 추가(확장에 열려있는 경우)해주는데는 몬스터의 코드에 전혀 영향을 미치지 않았었군(변경에 닫혀있는 경우)요.. ^^



음.. 아직 OCP에 대해서 감이 오지 않는다면.. 이걸 꼭 보시길 바랍니다!!! 예전에 영어 원문을 해석하면서 공부했던 예제인데 이해하는데 굉장한 도움이 되었습니다.

사용자 삽입 이미지
이런 다이어 그램을 그리고 있습니다. 그래픽 에디터라는 녀석이 존재하고.. 세가지 형태의 꼴(모양)을 그리는 메소드들이 있군요. Shape, Rectangle, Circle을 그립니다. Shape를 그리는 경우는 뭔지 모르겠군요!

노란 박스 안에 조건문을 사용하여 해당되는 모양을 그려주는 메소드를 호출하는데요, 만약에 모양이 100개가 추가된다면.. 조건문도 100개로 늘어나겠지요.. 이런 경우에는?? 확장에 열려있다고 봐야되나요?? Shape의 서브 클래스가 추가 될때마다 다른 클래스의 코드까지도 영향을 미치기 때문에 확장이 코드 변경을 유발 시킨다고 볼수 있기때문에 OCP에 위배된다고 해야 하겠군요.





사용자 삽입 이미지

이건 아주 올바르게 사용된 경우의 예제인데요 ㅋ 이제 그래픽에디터라는 녀석 안에는 구체적인 형태가 아니라 drawShape(Shape s)라는 하나의 메소드를 가지고 있고 s.draw();를 호출하는 역할을 합니다. 인터페이스로 동적으로 변화합니다. s.draw()라고 호출이 되더라도 Circle에 가서는 원을 그리는 draw()를 호출하고 Rectangle에 가더라도 직사각형을 그리는 draw()를 호출하겠죠?

그럼 100개의 다른 모형을 추가하는 경우는 어떻게 할까용?? 물론 100개 대한 형태를 그리는 draw() 메소드들을 구현해 줘야 하지만 그래픽 에디터와 Shape 클래스에는 전혀 영향을 미치지 않습니다. 확장이 코드 변경을 유발 시키지 않는 경우입니다. 따라서 OCP를 따르고 있는 좋은 경우라고 보면 되겠습니다.

이제 OCP에 대해서 어느정도 이해가 가시나요 ^^? OCP를 따르는 패턴은 데코레이터 패턴과 옵저버 패턴 이외에도 팩토리 메소드 패턴이 있다고 하는데요.. 데코레이터 패턴 다음이 팩토리 메소드 패턴이군요!! 빨리 공부 합시다 +_+ ㅋㅋ