1. 객체 지향은 실세계의 모델링?
객체지향에 대해서
"객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임" 이라고 설명하는 책을 흔히 볼 수 있다.
이런 설명에 따르면
객체지향 소프트웨어는 실세계의 어떤 사물을 소프트웨어 내부로 모방해오는 실세계의 투영이며
객체는 실세계의 사물에 대한 추상화라는 의미이다.
이러한 설명은 이해에는 도움이 될 수 있으나 유연하고 실용적인 관점에서 객체지향 분석, 설계를 설명하기에는 적합하지 않다.
실제 어플리케이션의 소프트웨어에서 실세계의 사물과 대응되는 객체를 발견할 확률은 그다지 높지 않기 때문이다.
그럼에도 많은 책에서 이렇게 객체를 실세계의 사물에 대한 추상화라고 언급하는 데에는 이유가 있다.
2. 왜 실세계의 모델링이라고 설명할까?
객체지향 어플리케이션에서에서 각 객체는 역할이 부여되며 이 역할에 따라 책임을 갖게 된다.
또한 역할을 가진 수 많은 객체들이 서로 메시지를 주고 받으며 상호 협력관계에서 하나의 기능을 완성하고 이런 기능이 하나 둘 모여 어플리케이션을 만들게 된다.
이는 실세계의 객체들이 협력과정을 통해 모든 작업이 수행되는 것을 투영하고 있다. 실세계에서의 협력과정은 다음과 같은 특징을 갖는다.
- 여러 사람이 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
- 한 사람이 동시에 여러 역할을 수행할 수 있다.
마찬가지로 이러한 특징을 객체지향의 세계에서도 동일하게 적용하면
- 여러 객체가 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 책임을 수행하는 방법은 객체가 자율적으로 선택할 수 있다.
- 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
즉, 객체지향 설계라는 예술은 '적절한 객체' 에게 '적절한 책임들을 할당하는 것' 에서 시작한다. 책임이 불분명한 객체는 어플리케이션의 미래 역시 불분명하게 만든다.
3. 객체지향이란
앞서 객체지향을 실세계의 모방이라고 설명하는 이유에 대해서 설명하였다.
하지만 실행중인 어플리케이션의 내부를 뜯어보면 우리가 아는 세계와 유사해보이지만 본질적으로는 매우 이질적은 모습을 지닌 세계와 마주하게 된다. 그 이유는
객체지향은 실세계의 사물들을 모방하는 것이 아니라 모든 협력과정의 매커니즘을 소프트웨어 세계에 적용하는 것이다.
여기서 더 나아가 현실 세계를 기반으로 새로운 세계를 창조하는 것이다.
4. 객체.. 그리고 Class..
지금까지 객체지향에 대해서 조금은 살펴보았다.
그렇다면 객체지향에서 나오는 객체란 무엇일까?
객체지향이라는 개념이 발표된 초기에 객체지향 프로그래밍의 초점은 'Class' 라는 블록이었다. 이러한 초점을 바탕으로 시간이 흐르자 객체지향에서 클래스를 중시하는 경향이 강해졌다. '클래스지향' 프로그래밍이 아니라 '객체지향' 프로그래밍 인데도 말이다.
하지만 객체지향에서 가장 중요한 것은 바로 객체이다.
앞에서 언급한 것처럼 객체는 객체지향 어플리케이션에서 실제로 협력에 참여하는 주체이다.
어플리케이션이 구동되면서 각 객체는 어떤 책임을 가지고 역할을 수행하며 도움이 필요할 때에는 메시지를 통해 다른 객체와 소통하며 도움을 요청한다.
즉, 객체지향 이라는 패러다임의 중심에는 '객체' 가 존재한다는 것이다.
협력 공동체에서 협력의 주체로 활동하는 객체는 두 가지의 덕목을 지녀야 한다.
- 충분히 '협력적' 이어야한다.
- 충분히 '자율적' 이어야한다.
객체간의 협력을 위해서는 객체가 다른 객체를 기꺼이 도울 수 있기 위해 귀가 열려 있어야 하고 마찬가지로 객체 본인도 다른 객체에게 도움을 요청하기 위해 열린 마음을 지녀야 한다.
객체지향 언어를 배우는 사람은 한 번쯤은
"하나의 클래스는 하나의 책임만 지녀야 한다." 혹은 "하나의 메서드는 하나의 기능만을 담당해야 한다." 등의 말을 들은 적이 있을 것이다.
이는 각 객체가 마음과 귀를 열어 서로가 서로를 위해 기꺼이 협력하는 관계를 맺어야 한다는 의미이다.
만약 전지전능해서 모든 기능을 수행할 수 있는 어떤 객체가 있다면 이런 객체는 내부 복잡도에 의해 자멸할 것이다.
또한 위에 언급한 대로 서로가 기꺼이 협력하는 관계를 맺기 위해서는 각 객체가 자율적으로 어떤 행동을 해야할지, 어떤 상황에서 도움을 청해야 할지에 대한 통제 즉, '자율성' 이 있어야 한다.
그렇다면 과거부터 많은 사람들이 객체지향의 중심이라고 생각하는 클래스란 무엇일까?
클래스는 단순히 객체들의 협력관계를 코드로 옮기는 도구에 불과하다.
중요한 것은 클래스를 강조하며 클래스간의 결합을 강화시키는 것이 아니라,
각 객체가 적절한 책임을 수행하도록 역할을 부여하고 이 역할들이 능동적으로 유연하고 견고한 협력 관계를 구축하는 것이다.
5. 1 장 마무리
객체지향의 핵심은 바로 객체이다.
객체는 협력을 하기 위해 어떤 행동을 하며, 그 행동을 하는 데에 필요한 상태 또한 함께 지니고 있다. 객체는 자율성을 지녀 본인의 내부와 외부를 확실하게 구분하여 사적인 부분은 외부에서 일체 간섭할 수 없도록 하며 스스로 관리해야 하며 외부와의 소통은 접근이 허락된 수단을 통해서만 가능해야 한다.
객체지향의 본질은 클래스가 아니라
- 시스템을 상호작용하는 자율적인 객체들의 공동체이며
- 객체는 상태와 행위를 스스로 관리하는 자율적인 주체이다.
- 객체는 시스템의 행위(기능) 을 구현하기 위해 다른 객체와 협력하며 협력 내에서 각 객체는 각자의 역할을 수행하며 역할은 책임의 집합이다.
- 객체는 다른 객체와 메시지를 통해 의사소통 하며 메시지를 수신한 객체는 메시지의 따라 적합한 메서드를 자율적으로 선택한다.
'객체지향에 관하여' 카테고리의 다른 글
객체지향의 사실과 오해 (0) (0) | 2023.01.17 |
---|
댓글