ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [객체지향의 사실과 오해] 1. 협력하는 객체들의 공동체
    책/객체지향의 사실과 오해 2023. 1. 11. 15:09
    반응형

     

    이번 장에서 설명하는 내용

    객체지향에 대한 의미 바로잡기

    객체지향에서 가장 중요한 점


     

     

    1. 객체지향에 대한 의미를 재정립


    많은 사람들이 객체지향은 실세계의 모방이라는 설명을 자주 한다.

    하지만 이런 말은 객체지향의 철학적인 개념을 설명하는데 적합하지만, 객체지향 분석과 설계를 설명하는 실용적인 관점에서는 적합하지 않다.

     

    객체지향의 목표는 실세계를 모방하는 것이 아니라, 고객과 사용자를 만족시킬 수 있는 새로운 세계를 창조하는 것이다.

    객체지향이 실세계의 모방이라고 말하는 이유는 실세계에 대한 비유가 객체지향을 이해하고 학습하는데 효과적이기 때문이다.

     

    아래 내용은 많은 사람들이 실세계를 비유하며 객체지향을 설명하는 내용이다.

    이것은 실무적으로 부적합한 내용이지만, 객체지향을 설명하는데 효과적이다.

    그래서 이번 장에서는 실세계에 대한 비유를 하며 전반적인 객체지향에 대한 내용이 적혀있다.


    객체를 스스로 생각하고 스스로 결정하는 현실 세계의 생명체

    → 상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명하는데 효과적

     

    현실 세계 사람들이 암묵적인 약속과 명시적인 계약을 기반으로 협력하며 목표를 달성해 나가는 과정

    → 객체들의 관계를 설명하는데 효과적

     

    현실 세계의 사물을 기반으로 소프트웨어 객체를 식별하여 구현까지 이어나가는 개념

    → 객체지향 설계의 핵심 사상인 연결완전성을 설명하는데 적합함


     

     

    2. 협력하는 사람들


    모든 예시는 커피 주문을 해서 받는 상황으로 설명한다.

     

    협력은 요청과 응답만으로 이루어진다.

    만약 커피를 주문한다고 하면 손님은 키오스크에 요청하고, 키오스크는 바리스타에게 요청을 한다. 이후 커피가 만들어지면 바리스타는 키오스크에 커피를 완성했다고 응답해주고, 키오스크는 손님에게 커피를 완성했다고 응답해준다.

    다른 행동도 마찬가지로 요청과 응답으로 나누어 설명할 수 있다.

     

    역할은 협력에 참여하는 사람이 협력 안에서 차지하는 책임이나 임무를 의미한다.

    사람들은 협력을 할 때 특정한 역할을 부여받는다. 이때 손님이 주문한 커피를 만들기 위해서는 손님, 키오스크, 바리스타라는 역할이 존재한다.

     

    [손님]

    - 커피를 주문하는 책임

     

    [키오스크]

    - 주문 내용을 바리스타에게 전달할 책임

    - 커피가 완성됐다는 것을 손님에게 알리는 책임

     

    [바리스타]

    - 커피를 제조할 책임


    이렇게 객체들이 협력을 위해 특정한 역할을 맡고, 역할에 적합한 책임을 수행한다는 것은 아래의 중요한 점을 제시한다.

     

    [여러 사람이 동일한 역할을 수행할 수 있고, 역할은 대체 가능성을 의미한다]

    각 역할의 책임만 이행하면 끝이기 때문에 손님, 키오스크, 바리스타의 역할은 누구든지 할 수 있고, 언제든지 대체할 수 있다.

     

    [책임을 수행하는 방법은 자율적으로 선택할 수 있다]

    요청을 처리하는 방법은 자유롭게 선택이 가능하다. 그래서 다형성은 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 말한다.

     

    [한 객체가 동시에 여러 역할을 수행할 수 있다]

    위 내용에서는 손님, 키오스크, 바리스타로 역할을 나누었지만, 한 사람이 키오스크 역할을 하면서 동시에 바리스타 역할을 맡을 수도 있다.


     

     

     

    3. 역할, 책임, 협력


    위에서 언급한 내용을 다음 단어로 대응할 수 있다.

     

    사람 ↔ 객체

    요청 ↔ 메시지

    요청을 처리하는 방법 ↔ 메서드

     

    객체지향에서 중요한 내용은 역할, 책임, 협력이지만, 코드를 보면 협력에 참여하는 주체는 객체다.

    애플리케이션의 기능은 아주 작은 기능조차 객체 혼자 감당하기에는 버거울 정도로 복잡하고 거대하기 때문에 객체는 다른 객체와의 협력을 통해 기능을 구현하게 된다.

    객체지향 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다. 그렇기 때문에 각 객체의 책임을 명확하게 명시해야하고, 적절한 책임을 할당해야 아름다운 설계가 완성된다.


     

    객체를 상태(state)와 행동(behavior)을 함께 지닌 실체라고 정의한다.

    객체가 협력에 참여하기 위해 어떤 행동을 해야 한다면, 그 행동을 하는데 필요한 상태도 함께 지니고 있어야 한다.

    그래서 객체가 자율적으로 활동하기 위해서는 필요한 상태와 행동을 가지고 있어야 한다.

    예를 들어 바리스타는 커피를 만드는 레시피(상태)를 알고 있어야 한다. 그리고 레시피에 따라 커피를 제조(행동)할 수 있어야 한다.


    객체지향에서는 오직 메시지로 의사소통을 할 수 있다.

    한 객체가 다른 객체에서 요청하는 것은 메시지를 전송하는 것이고, 한 객체가 다른 객체로부터 요청 받는 것을 메시지를 수신한다고 말한다.

    객체 사이의 협력은 메시지를 전송하는 객체와 메시지를 수신하는 객체 사이의 관계로 구성된다.


    객체는 메시지를 수신하면 자신만의 방법으로 메시지를 처리한다. 이때 객체가 수신된 메시지를 처리하는 방법을 메서드라고 부른다. 그래서 어떤 객체에게 메시지를 전송하면 특정 메서드를 선택하여 실행된다.

    여기서 중요한 점은 메시지와 메서드를 분리해야 한다,

     

    만약 메시지로 아메리카노 주문을 받으면, 모든 바리스타가 무조건 기계를 사용하여 커피를 만들지 않을 것이다.

    누구는 기계로 만들겠지만, 누구는 완제품을 몰래 사용할 수도 있고, 누구는 수작업으로 직접 사용할 수 있다.

    그렇기 때문에 메시지와 메서드를 분리하면 객체의 자율성을 높일 수 있다.

    이것은 캡슐화 개념과도 깊이 연관되어 있다.


    전통적인 개발 방법은 데이터와 프로세스를 엄격하게 구분하지만, 객체지향은 데이터와 프로세르르 객체라는 하나의 틀 안에 함께 묶어놓아 객체의 자율성을 보장한다.

    그래서 객체지향으로 코드를 작성하게 되면 유지보수가 쉽고, 재사용이 용이한 시스템을 구축할 수 있게 된다.


     

     

     

    4. 객체지향의 본질


    많은 사람들이 객체지향에 대한 단어를 들으면 클래스라는 단어가 떠오를 것이다. 그리고 그 클래스를 정의하는 것과 상속에 대해 초점을 맞춘다.

    클래스가 객체지향 프로그래밍에서 매우 중요한 구성요소는 맞지만, 객체지향의 핵심을 이루는 개념이라고는 말하기 힘들다.

     

    훌륭한 객체지향 설계를 하기 위해서는 코드를 담은 클래스의 관점에서 메시지를 주고 받는 객체의 관점으로 사고의 중심을 전환하는 것이다.

    클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하며, 객체지향의 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.

    객체지향의 중심에는 클래스들의 정적인 관계가 아니라 메시지를 주고받는 객체들의 동적인 관계이다. 그렇기 때문에 클래스, 메서드에 집중하기 보다는 객체의 역할, 책임, 협력에 집중하는 것이 중요하다.


     

    반응형

    댓글

Designed by Tistory.