본문 바로가기

기타/객체지향 토막글

수필 객체지향, OCP(open-closed principle, 개방-폐쇄의 원리)

사람 사는 세상은 복잡다단하다. 예를들어 마른하늘에 정말로 날벼락이 칠수도 있다. 어플리케이션은 사람 사는 세상을 고스란히 옮겨놓았다. 틀림없이 어플리케이션도 마른하늘에 날벼락이 치는 변화무쌍한 요구사항이 발생할것이다. 요구사항에는 기존 개발된 기능의 변경 건이 있거나 새로운 기능의 확장의 경우가 있다. 이런 요구사항이 생길때 객체지향 설계자는 어플리케이션을 어떻게 변경하거나 확장할지 고민한다.

기존의 소스를 변경하는 방법이 있다. 이 경우는 가장 직관적으로 해결하는 방법일 것이다. 하지만 위험하다. 기름바닥에 라이타불을 던져서 불폭탄을 만드는 광경을 영화에서 본적이 있는가. 기존의 소스를 변경하는 방법은 기름바닥이라는 높은 결합도에 라이타불을 던지는 것과 마찬가지이다.

기존의 소스는 이미 여러 클래스들에 의해 사용되고 작동되는 소스이다. 이 소스를 사용하는 클래스들은 소스가 제공하는 기능과 상호작용하여 그들 클래스만의 새로운 기능을 무사히 작동중에 있다. 그러나 기존의 소스를 변경하면 잘돌아가는 클래스 생태계에 이상이 생기면서 상황이 급변한다. 기존의 소스를 사용하는 모든 클래스의 정상적인 작동이 위태롭게 변한다. 하지만 만약 거만한 개발자가 기존의 소스를 변경하더라도 관련된 모든 클래스가 정상 작동할것이라고 걱정말라 단언 한다면, 그래도 모든 클래스의 정상 작동 유무를 귀찮게 테스트해야 하는 진실은 변함이 없다.

그래서 기존 개발된 어플리케이션에 요구사항이 발생하면 기존의 클래스는 최대한 수정하지 말고 새로운 클래스나 기능을 만들어서 확장해야 한다. 클래스는 확장에 대해서는 열려있지만 수정에 대해서는 닫혀있어야 한다. 이것이 OCP 원리이다.

객체지향의 여러 요소를 활용하여 OCP원리를 손쉽게 구현할 수 있다. 객체지향의 핵심 요소인 상속과 폴리모피즘과 또 상속과 폴리모피즘의 핵심 요소인 오버라이드가 OCP를 지원한다.  

[상속과 폴리모피즘 예제그림1..그려야됨..]

만약 피자의 토핑 이라는 메소드에 기본적인 토핑만 가능했는데 어느 광고에 나오는 닭가슴살 토핑을 추가해야 한다고 하자. 이 경우 기존의 소스를 굳이 수정할 필요 없이 닭가슴살 토핑을 오버라이드 할 수 있는 클래스를 새로 확장하면 된다.

[합성 예제그림2, 데코레이터..그려야됨..]

데코레이터 패턴이나 전형적인 합성 구조인 스트라테지 패턴같은 디자인 패턴을 활용하면 단순한 상속과 폴리모피즘 구현을 넘어서 더 깔끔하게 OCP를 지향하는 프로그램을 설계할 수 있다.

스트라테지 패턴 같은 경우 예를들어 토핑 인터페이스를 만들고 이 인터페이스를 상속받는 새로운 닭가슴살 토핑을 만드는 식으로 알고리즘을 확장할수 있다. [..상세 설명 필요..]

데코레이터 패턴 같은 경우 피자 클래스에서 토핑 기능들을 따로 추가한 클래스들를 만들고 이 클래스에 기존 피자 클래스를 넘겨서 ‘기존 피자클래스 로직 + 새로운 토핑로직’을 추가하는 식으로.. 세련되게 알고리즘을 확장할수 있다. [..상세 설명 필요..]

객체지향을 알면 OCP를 지킬수 있고, OCP를 알면 객체지향을 이렇게 써야 겠구나 감이 오며, 디자인 패턴을 알면 OCP를 더 세련되고 깔끔하게 지키는 방법을 알게 된다.

- 일단 OCP는 끝 -


산골이 덧1) 지금 이런식으로 원고를 쓰고 있습니다. 처음에는 어떻게 책쓰기라는 마치 히말라야 등정처럼 어려운 일을 할수 있을까 고민이 되었고 실제로 미적미적 진행이 되어서 무척 갑갑했습니다. 하지만 정말 시작이 반이라고..어떻게 써야될지 체계를 잡은뒤에는 6월달에는 탄력받고 원고쓰기에 매달리고 있습니다. 5월은 객체지향 지식 습득 및 책의 뼈대 구축, 6월은 일단쓰고보기-살붙이기, 7월은 문장더쓰고 그림도 그리고 깔끔하게다듬기-근육키우기 및 근육 다듬기, 8월은 출판사 PR기획서 쓰고 마케팅 하기 등의 계획을 세우고 있고요. 지금 이 원고는 수필처럼 다듬어지지 않았고 앙상한 살만 붙였고 그림도 그리지 않았습니다. 그래서 못써도 이해해주시고요. 그럼에도 사실은.. 이쯤에서 프로그래밍 포스팅 하나는 올려야 겠다는 뭐랄까..위기의식에 토막글이나마 올리게 되었습니다. ^ ^; 이 책의 원고가 다 쓰여지면 틈틈이 블로그에도 원고 통해 정리한 객체지향-디자인패턴 지식을 공유하겠습니다. ^ ^