본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생-OCP

 

  1. OCP(Open Closed Principle)

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

 

기존의 클래스에 메소드의 내부코드를 변경하는 방법이 있다. 이 경우는 가장 직관적으로 해결하는 방법일 것이다. 그러나 위험하다. 기존의 소스를 변경하는 방법은 기름바닥이라는 높은 결합도에 라이타불을 던지는 것과 마찬가지이다.

 

기존의 소스는 이미 여러 클래스들에 의해 사용되고 작동되는 소스이다. 이 소스를 사용하는 클래스들은 소스가 제공하는 기능과 상호작용하여 그들만의 해야할 일을 수행한다.

 

그러나 기존의 소스를 변경하면 잘돌아가는 클래스 생태계에 이상이 생기면서 상황이 급변한다. 기존의 소스를 사용하는 모든 클래스의 정상적인 작동이 위태롭게 변한다. 하지만 만약 거만한 개발자가 기존의 소스를 변경해도 관련된 모든 클래스가 정상 작동할것이라고 걱정말라 단언 한다고 말할 수 있다.

 

그러나 모든 클래스의 정상 작동 유무를 귀찮게 테스트 해야 하는 진실은 변함 없다.

 

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

 

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

 

[상속과 폴리모피즘 예제, 피자 ]

 

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

 

[만약 닭가슴살 토핑을 동네 피자에 얹히고 싶다면 이렇게 한다.

피자 동네피자_닭가슴살토핑 = new 닭가슴살 토핑(동네피자)

동네피자_닭가슴살토핑.토핑만들기()

닭가슴살 토핑 클래스에 동네피자를 객체로 넘겨주면 닭가슴살 토핑 클래스는 먼저 동네피자의 기본 토핑 만들기() 메소드를 실행하고 그 다음 닭가슴살 토핑의 토핑 만들기() 메소드를 실행한다.]

 

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

 

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

 

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

 

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

 

덧 ) 이 객체지향의 탄생 원고는 제가 책으로 내려다가 일단 잘 안되었는데요. 이유는 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다.등 입니다. 그래도 원고를 일단 블로그에 몽땅 풀어보고 언젠가 제대로 교정해서 다시 도전할 생각입니다. 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다. 이점을 감안해서 읽고 객체지향을 이해하는데 도움이 되셨으면 좋겠습니다. 의견도 주셨으면 좋겠습니다. 원고 조금만 교정하면 괜찮을것 같은 출판사 관계자분의 피드백도 환영합니다. 특별한 일 없으면 매주 월수 발행 예정입니다.