1장. 객체지향 디자인
- 객체지향은 무엇인가?
- 객체지향은 왜 필요한가?
- 디자인이란 무엇인가?
- 어떻게 디자인해야 하는가?
- 절차지향 프로그래밍
- 객체지향 프로그래밍
객제지향은 무엇인가?
객체지향의 사실과 오해
에서 객체 지향을 서로 상호 작용(협력
)하는 자율적인 객체들의 공동체로 설명하는 데 구체적으로 어떻게 설명해야 할지 몰라 이번 기회에 정리하고자 합니다.-
서로 상호작용하는 자율적인 객체들의 공동체
를 구체화하기- 자율적인 객체는 무엇입니까?
자율적인 객체는 다른 객체들과 상호작용하는 과정에서 어떤 행동을 할 때 그 행동을 결정하는 주체가 자기 자신인 객체를 말합니다.
- 객체는 자신의 상태를 표현하는 데이터와 행동을 표현하는 메서드를 가지고 있습니다.
- 행동은 다른 객체들과 상호작용하기 위해 필요한 것이고 행동은 상태를 기반으로 어떻게 행동할지 객체 스스로가 결정합니다.
-
객체가 어떤 행위가 필요할 때 다른 객체에게 요청을 하게 됩니다. 이때 요청한 객체는 행위가 무엇인지만 요청하고 행위의 방식, 어떻게 행위 하라는지에 대해서는 요청하지 않습니다.
- 객체는 왜 자율적이어야 합니까?
- 객체는 왜 자율적이어야 할까요? 객체가 자율적이지 않으면 어떻게 될까요?
- 객체가 자율적이지 않는다면 애플리케이션의 많은 기능을 혼자 담당하는 거대한 객체가 생겨나게 됩니다.
- 이 거대한 객체는 모든 일을 스스로 처리하려고 하는 God Object가 됩니다. 하나의 객체에서 모든 기능을 처리하려고 하기 때문에 이 객체의 내부의 복잡성은 걷잡을 수 없게 커지게 됩니다.
- 복잡한 객체는 다시 건들 수 없게 됩니다. 복잡성으로 유지 보수할 수 없는 객체가 돼버리고 맙니다.
-
객체가 자율적이려면 어떻게 해야할까요?
- 객체가 자율적이기 위해서는 하나의 책임만을 수행할 만큼 작고 어떻게 행동할지 판단할 수 있는 충분한 데이터가 있어야 합니다.
- 객체지향은 자율적인 객체들을 서로 상호작용하면서 시스템의 기능을 실현할 수 있도록 하는 프로그래밍 패러다임입니다. 때문에 객체지향 프로그램에 속해있는 객체들은 서로 상호작용할 수 있어야 합니다.
- 객체들이 서로 상호작용하기 위해서는 많은 것을 처리하는 객체(Gob Object)가 맡고 있는 책임과 역할을 다른 객체에 분배해야 합니다.
- 각기 책임을 맡은 객체들은 그 책임에 따라 행동하게 되고 다른 객체와의 상호작용에 참여하게 됩니다. 행동에 필요한 충분한 데이터를 기반으로 어떻게 행동할 지 스스로 결정하게 됩니다. 행동을 결정할 때 객체는 외부의 영향을 받지 않습니다.
- 객체들은 어떻게 상호작용합니까?
- 객체들은 메시지를 통해서 상호작용합니다.
- 객체가 어떤 일을 수행하는 데 있어서 다른 객체의 도움이 필요할 경우 다른 객체의 메시지를 보내 필요한 것을 요청합니다.
- 메시지는 다른 객체로부터 받을 수 있는 객체 간의 의사소통 수단입니다.
-
객체는 메시지를 받고 해당 메시지를 처리할 수 있는 메서드를 자율적으로 선택하여 행동을 수행합니다.
- 객체들은 왜 상호작용해야 합니까?
- 위에서 언급한 god object의 내용 때문입니다.
객체지향은 왜 필요한가?
- 객체지향의 필요 이유에 대해서 설명하기 위해 이전의 프로그래밍 패러다임과 비교하여 설명하면 좋을 것 같습니다. 이전의 문제점은 무엇이고, 그 문제점을 객체지향이 어떻게 해결하는지를 설명하는 과정을 통해 객체지향이 필요한 이유를 설명합니다.
-
절차적 프로그래밍
- 절차적 프로그래밍에 대해서 자세하게 설명하지는 않습니다. 책에 나와있는 정도로 정리하겠습니다.
- 절차적 프로그래밍은 프로시저의 호출 개념을 바탕으로 하는 프로그래밍 패러다임입니다.
- 절차적 프로그래밍은 객체지향과 큰 차이점으로 데이터와 프로시저(행동)를 별개로 취급한다는 특징이있습니다.
- 때문에 절차적 프로그램에서 데이터를 어떤 프로시저에서든지 하나의 데이터를 수정하고 사용할 수 있습니다.
- 이는 데이터가 어떻게 변하고 사용되는지 추적하기 어렵게 만듭니다. 또 어떻게 사용될지 예측할 수도 없게 됩니다.
- 예측할 수 없는 프로그램은 코드를 수정해도 어떻게 동작할지 예측할 수 없게 됩니다.
-
객체지향 프로그래밍
- 객체지향은 절차적 프로그래밍과 다르게 데이터와 데이터를 처리하는 행동을 별개로 취급하지 않고 객체안에 통합하게 합니다.
- 객체 안에 있는 데이터는 객체에 있는 행동만이 수정하고 사용할 수 있습니다.
- 이는 절차적 프로그래밍에 비해서 객체지향 프로그램에서는 데이터가 어떻게 변하고 사용되는지 추적이 용이하다는 것을 알 수 있습니다.
- 추적이 가능하고 예측이 가능한 프로그램은 앞으로의 변화에 대응하여 프로그램을 수정하고 재사용할 수 있습니다.
- 이외에 객체지향 프로그래밍은 실세계를 바탕으로 하여 프로그래밍하기 때문에 직관적입니다. 이 내용은
객체지향의 사실과 오해 - 02장의 객체지향과 인지능력
부분을 참고하면 좋을 것 같습니다.
~~휴 ~~
디자인이란 무엇이고, 어떻게 해야 하는가?
디자인은 코드를 배치하는 작업입니다.
-
코드를 어떻게 배치해야 할까요? 코드를 왜 배치해야 하나요?
- 코드를 배치하는 이유는 변경이 가능하고 수정이 용이한 프로그램을 만들기 위해서입니다.
- 디자인은 나중에 디자인할 수 있는 여지를 남겨 놓기 위한 것이고, 그 최종 목표는 변화의 비용을 최소화하는 것입니다.
- 위에서 객체지향은
앞으로의 변화
에 대응하여 수정하고 재사용할 수 있도록 하는 패러다임이라고 설명했습니다. 프로그램은 계속해서 변하게 됩니다. 사용자의 다른 요구 사항이 있을 수 있고, 구현한 요구 사항이 사용자가 원하던 것이 아닐 수도 있기 때문입니다. 변화의 이유가 여러 가지이기 때문에우리는 변경하기 쉬운 프로그램
을 만들어야 합니다. - 변경이 어려운 이유는 무엇일까요?
- 변경이 어려운 이유는 우리가 만드는 프로그램이 각자 역할을 수행하는 객체들로 이루어져 있기 때문입니다.
- 단순한 기능의 경우에는 서로 상호작용하는 객체의 개수가 적어 변경에 어려움이 없을지도 모릅니다.
- 하지만 우리가 구현하려는 기능이 복잡하면 복잡할 수록 필요로 하는 객체의 수는 증가합니다.
-
객체의 수의 증가는 객체간의 상호작용의 수도 증가함을 의미합니다.
객체 간의 상호작용은 두 객체 간의 의존성이 있음을 의미하는데 이 의존성 때문에 하나의 객체가 수정되었을 때 상호작용하고 있는 다른 객체까지 변경이 전파될 수 있기 때문에 변경이 어려워지게 됩니다.
- 객체지향 디자인은 이러한 의존성을 관리하고, 객체가 변화를 받아들일 수 있도록 의존성을 정리하는 코딩 기술의 묶음입니다.
- 자세한 내용은 책을 참고하시면 좋을 것 같습니다.