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

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

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

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

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

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

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

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

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

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

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

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

- 일단 OCP는 끝 -


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

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 산골
산골 블로그 소개 저는 하얀머리 개발자와 작가를 꿈꾸는 블로거 산골 입니다. 프로그램 개발자로서 저의 관심사는 개발자의 숨통을 트여준 아이폰 개발, 철학과 같은 깊이가 있는 객체지향 방법론입니다. 글쓰기와 수영을 좋아합니다. 블로그를 통해 관심사를 공유합니다. 제 블로그에 관심 있으시면 아래 RSS나 즐겨찾기로 편하게 구독하세요.

rss Bookmark and Share

댓글을 달아 주세요

  1. BlogIcon 데굴대굴 2009.06.11 15:18 신고  댓글주소  수정/삭제  댓글쓰기

    으악. 뭔가 대단히 어려운 글이에요.

  2. ARMA 2009.06.11 16:17 신고  댓글주소  수정/삭제  댓글쓰기

    뭔가 하고는 있는게냐? ^^

  3. BlogIcon 써니 2009.06.14 19:11 신고  댓글주소  수정/삭제  댓글쓰기

    OCP 원칙은 객체지향 뿐만 아니라, 절차지향 프로그래밍에서도 유사하게 적용할 수 있을 듯 합니다.

    그런데, 저는 오버라이드 기법이 코드의 직관성을 오히려 해친다고 생각해서 폴리모피즘 기법 보다는 합성 기법을 권장하는데 어찌 생각하시는지 여쭙고 싶습니다만...

    좋은 글과 정보 공유 감사 드립니다. ^^;

    • BlogIcon 산골 2009.06.15 13:04 신고  댓글주소  수정/삭제

      옷~ 써니님..제가 바라던 고수개발자님의 댓글 정말 감사드립니다..
      근데 답글은 조금만 기다려주세요.생각해보고 답글달겠습니다. ^ ^;

    • BlogIcon 산골 2009.06.16 14:54 신고  댓글주소  수정/삭제

      네 써니님 저도 저위에 글에 상속보다
      전형적인 합성구조인 스트라테지 패턴을 쓰면 더 깔끔하게
      OCP를 지킬수 있다고 썼습니다.

      그런데 오버라이드 기법이 코드의 직관성을 해친다는
      말씀은 코드를 이해하기 쉽지 않다는 말로 이해했는데..
      왜 직관성을 해치는지는 이해가 잘 안됩니다만..^ ^;

      그러니깐 제가 알고 있는 상속보다 합성을 써야 되는
      이유는요. 상속은 모든 서브 클래스에서 똑같은 행동을
      무조건 상속받아야하는데 만약 상속받기엔 꺼림칙한
      서브클래스가 존재한다면 이제 그 서브클래스를 하나하나
      찾아서 로직을 맞춰주면서..수정을 하다보면 이제 오히려 OCP를 어기면서..
      코드가 복잡해지는 문제가발생하며,
      컴파일 할때 서브 클래스의 행동이 완전히 결정되기
      때문에 유연함을 지향하는 객체지향에서 오히려
      더 경직되는 문제가 있지만,

      합성은 실행중에 얼마든지 동적으로 행동을 추가, 교체
      할수 있고, 서브클래스마다 원하는 행동 또는 새로 원하는
      행동을 인자로 받아 실행할수 있기에 유연하고 확장하기
      쉬운 객체지향 본래의 의도를 따를수가 있기에,

      상속보다는 합성이 OCP를 제대로 지킬수 있는 것이라고
      생각합니다.

      다시 정리하면 합성 고유의 장점이 저절로 OCP를
      지켜주지만 상속은 '변하지 않는 IS-A관계'가 아니면
      코드가 경직되는 문제가 발생하기 때문에 상속도
      오버라이드 통한 OCP를 지원하기는 하지만 합성이
      더 좋다는 것입니다. @@;

      그런데 오버라이드가 직관성을 해친다..즉 코드 해석력
      이 떨어진다?는 뜻은 슬쩍 이해가 부족해집니다만..^ ^;
      왜냐면 오버라이드를 했다고 해서 코드가 이해하기
      어려워진다...는 아닌것도 같아서요..

      좌우지간 생각할만한 댓글 남겨주셔서 감사합니다. ^ ^;

  4. BlogIcon 써니 2009.06.15 18:18 신고  댓글주소  수정/삭제  댓글쓰기

    쿨럭... 다른 분들이 오해하십니다. 저는 '듣보잡' 개발자 입니다만...
    우연히 흘러 들어와서 귀한 글 읽고 가는걸요.

    저도 비슷한 컨셉의 글을 쓰고 있는데 내공이 한참 딸립니다.

    • BlogIcon 산골 2009.06.16 14:50 신고  댓글주소  수정/삭제

      써니님 블로그보니 유명 개발자 블로거시고..
      여러 후배들을 지도하시는 분이시던데요..^ ^;
      저도 많이 배우고 여쭤보겠습니다. ^ ^

    • BlogIcon 산골 2009.06.16 14:56 신고  댓글주소  수정/삭제

      써니님 블로그는 로그인해야면 댓글 달수가 있나봐요 ^ ^;
      답글 남기려다가 그냥 돌아왔습니다~

  5. BlogIcon 버리 2009.06.16 14:08 신고  댓글주소  수정/삭제  댓글쓰기

    산골님.. 요즘 바쁘게 지내시나봐요~~~ 메신저에도 안보이궁.. (내가 잘 안봐서 그런가..)

  6. BlogIcon 써니 2009.06.16 16:40 신고  댓글주소  수정/삭제  댓글쓰기

    저는 결코 유명 개발자가 아닙니다.
    먼저 내새울 만한 실적이 전혀 없는 데다가,
    '사이비'에 불과하다는 평도 들은 적이 있기 때문에 조용히 블로깅을 하는 거죠...

    비로그인 덧글을 풀어두면, 날마다 찾아와서 욕설을 푸짐하게 안기고 가는 '자칭 개발자' 분이
    계셔서 방문객들도 불편해 하고 저도 짜증나서 막아 두었습니다.

    별거 아닌 질문에 길게 답해 주셔서 감사드리고, 제 의견을 다시 트랙백으로 보내겠습니다.

    • BlogIcon 산골 2009.06.18 16:29 신고  댓글주소  수정/삭제

      써니님은 열혈 토론을 즐기시는분 같습니다.
      저도 그래야 실력이 빨리 늘텐대..
      귀차니즘에 대충 포스팅하고있네요.
      종종 블로그 통해 뵙겠습니다. ^ ^