ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체지향의 사실과 오해
    언어/객체지향 2023. 8. 1. 14:35

    1. 협력하는 객체들의 공동체 

     

    - 객체지향이란 실세계를 직접적으고, 직관적으로 모델링할 수 있는 패러다임

    - 하지만, 이는 실세계를 모방하는 것을 의미하지 않는다. 고객을 만족시킬 수 있는 신세계를 창조하는 것에 가깝다.

    - 실세계와의 연관성은 객체의 자율성을 부여하고, 객체가 서로 메시지를 통해 서로 협력하는 객체지향의 연결완전성에서 찾아 볼 수 있다.

     

    1.1 협력하는 사람들 

     

    - 커피를 주문하는 클라이언트, 주문을 받는 캐셔, 커피를 만드는 바리스타의 협력관계를 통해 객체지향을 엿볼 수 있다.

    - 협력 사이에 객체들은 각자의 역활과 수행해야할 책임이 있다.

    - 사람들 사이에서 일어나는 일처럼, 소프트웨어를 개발할 때도 협력,역할,책임은 중요한 의미를 가진다.

     

    > 요청과 응답으로 구성된 협력

      - 협력이란 스스로 해결할 수 없는 문제를 해결하기 위해 요청을 보내고 이에 대한 응답을 하는 과정이다 

      - 하나의 문제를 협력하여 해결하기 위해서는 다수의 역할이 필요하다. (일반적으로) 

    > 역할과 책임 

      - 객체는 협력 속에서 특정한 역할을 부여받는다. (역할은 책임과 의무를 내포한다.)

      - 즉, 특정한 역할은 특정한 책임을 암시한다. 

      - 협력을 위해 특정한 역할을 맡고 적합한 책임을 수행한다는 사실은 다음과 같은 개념을 제시한다.

          -> 여러 사람이 동일한 역할을 수행할 수 있다.

          -> 역할은 대체 가능성을 의미한다.

          -> 책임의 수행 방법은 자율적으로 선택 가능하다.

          -> 한 객체가 동시에 여러 역할을 수행할 수 있다. 

     

    1.2 역할, 책임 , 협력

     

    > 기능을 구현하기 위해 협력하는 객체들 

          - 요청은 메시지, 이를 처리하는 방법은 메서드로 생가할 수 있다. 

     

     > 역할과 책임을 수행하며 협력하는 객체들 

          - 협력의 핵심은 특정한 책임을 수행하는 역할들 간 연쇄적인 요청과 응답을 통해 목표를 달성하는 것이다.

          - 어플레케이션의 기능은 더 작은 책임으로 분할되고, 책임은 적절한 역할을 수행할 수 있는 객체에 의해 수행된다.

          - 시스템은 역할과 책임을 수행하는 객체로 분할되고, 시스템의 기능은 객체가 연쇄적인 요청과 응답의 흐름으로 구성 된 협력으로 구현된다. 

         - 객체지향 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다. 

     

    1.3 협력 속에 사는 객체

     

        - 객체지향 애플리케이션 윤곽을 결정하는 것은 계속 살펴본 역할,책임,협력이다. 

        - 실제로 협력에 참여하는 주체는 객체이다. 

        - 객체는 특정 기능을 수행하기 위해 존재 -> 협력을 통해 기능을 구현 -> 협력의 품질은 객체의 품질로 결정된다.

        - 객체의 품질을 높이기 위해

           1. 객체는 충분히 협력적이어야한다.

           2. 객체는 충분히 자율적이어야한다.

           즉, 협력에 참여할 만큼 충분히 개방적이면서, 참여 방법은 스스로 결정할 수 있을 만큼 충분히 자율적이어야한다.

           객체가 자율적이기 위해서는 필요한 행동과 상태를 함께 지녀야한다. (객체 내부와 외부를 명확하게 구분해야하마)

           타 객체는 한 객체가 무엇을 수행하는지는 알지만, 어떻게 수행하는지는 알 수 없다. 

     

      > 협력과 메세지 

          - 객체지향 세계에서는 객체간 단 한가지 의사소통 수단이 존재하는데 이를 메시지라고 한다. 

          - 메시지를 송신하고 수신하는 것이 유일한 의사사통 수단이다.

     

      > 메서드와 자율성 

          - 객체가 수시된 메시지를 처리하는 방법을 메서드라고 부른다. 

          - 메시지가 전달되면, 메시지에 대응하는 특정 메서드가 수행된다. 

          - 메시지를 수신한 객체가 메서드를 선택할 수 있다는 점이 자율성을 부여한다. 

          - 이렇듯 메시지와 메서드를 분리하는 것은 자율성의 핵심 메커니즘이자 캡슐화와 깊이 연관된다. 

     

    *자바에서 인스턴스 메서드는 객체별로 메시지에 대한 응답으로 다른 값을 내놓아야할 때 

                     정적 메서드는 객체별로 같은 응답을 내놓거나, 

                                            메서드가 아닌 절차지향의 함수로서 사용될 때 

    * 같은 응답이라는 의미는 동일한 상태에 대한 처리 혹은 동일한 행위만을 제공함을 의미할 수 있다. 

     

    1.4 객체지향의 본질 

     

    - 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공종체로 바라보고 시스템을 분할

    - 자율적인 객체한 상태와 행위를 함께 지니며, 스스로 자기 자신을 책임지는 객체 의미

    - 객체는 다른 객체와 협력하며, 협력 내에서 정해진 역할을 수행하며, 역할은 관련 책임의 집합이다.

    - 메시지를 통해 협력하며, 이를 자율적인 메서드로 처리한다.

     

    * 클래스는 객체지향에 중요한 구성요소이지만, 중심 개념은 아니다. 

       - 코드를 담는 클래스 관점이 아니라, 메시지를 주고받는 객체 관점으로 바라보자.

       -  어떤 클래스가 필요한 것이 아니다. 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가가 중요하다.

           클래스는 객체들의 협력 관계, 객체의 상태 행위등을 코드로 옮기는 도구에 불과하다. (객체를 만드는 도구)

       - 중요한 것은 클래스들의 정적 관계가 아니라, 메시지를 주고받는 객체들의 동적 관계이다. (역할 책임 협력에 집중하자)

     

    *협력, 역할 , 책임에 따라 필요한 객체에 대해 먼저 생각 한 뒤 이를 클래스로 옮기자는 것

     

     

     

    2. 이상한 나라의 객체 

    2.1 객체지향과 인지 능력

      - 인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라본다. 

      - 객체지향은 세상을 자율적이고, 독립적인 객체들로 분해할 수 있는 인간의 기본적 인지능력에 기반한다.

      - 객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 개념적인 경계를 지닌 어떤 것이다. 

      - 현실과의 유사성은 여기까지 객체지향은 이를 확장하여 객체에 현실에 없는 자율성을 부여하여 새로운 것을 창조한다. 

     

    2.2 객체,그리고 이상한 나라 

      - 앨리스 이야기 중 앨리스가 무엇을 먹었는 지에 따라 키와 위치가 변하는 이야기를 떠올려보자 

      > 앨리스 객체 

         - 문을 통과하기 위해 적당한 상태가 되기 위해 키를 계속 변화시킨다. (특정 시점의 앨리스의 상태란 앨리스의 키)

         - 앨리스의 상태를 결정하는 것은 앨리스의 행동이다. 

         - 상태를 결정하는 것은 행동이지만, 행동의 결과를 결정하는 것은 상태이다. 

         - 즉 상태는 이전 행동들을 추적할 수 있는 단서를 제공한다. 

         - 또 앨리스는 상태 변화와 무관하게 유일한 존재로 식별 가능하다. 

     

    2.3 객체,그리고 소프트웨어 나라

    - 객체의 다양한 특성을 효과적으로 설명하기 위해 객체는 상태, 행동, 식별자를 지닌다. 

    - 객체란 식별 가능한 개체 또는 사물이다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 

    - 소트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다. 

     

    > 상태 

      - 객체가 주변 환경과 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했는냐에 좌우된다.

      - 행동의 결과는 과거 행동에 의존한다.

      - 상태를 통해 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

    > 상태와 프러퍼티 

       - 숫자, 문자열 양, 속도,시간 등 간순한 값은 객체가 아니다. -> 다른 객체의 상태를 표현하기 위해 사용된다.

       - 앨리스의 상태를 구성하는 키는 단순한 숫자, 앨리스의 상태를 구성하는 위치는 문자열로 표현 가능 

       - 단순 값 뿐아니라, 특정 객체가 상태를 표현하는데 사용될 수 있다. 

       - 객체의 상태를 구성하는 모든 특징들을 객체의 프로퍼티라고 한다. 

       - 일반적으로 프로퍼티는 변경되지 않고 고정되므로 정적이다. 프로퍼티의 값은 변경될 수 있음으로 동적이다.

       (앨리스의 상태를 키와, 위치, 음료의 프로퍼티로 표현할 수 있음은 변하지 않지만, 각 키,위치,음료의 값은 변할 수 있다.)

       - 객체를 통해 객체의 상태를 표현할 떄는 의미있는 연결 링크가 있어야한다.

          (링크를통해서만 메시지를 주고 받을 수 있다) 

      - 링크를 통해 협력한다. (상태를 나타내기 위한 협력) > 링크란 객체가 다른 객체를 참조할 수 있음을 의미, 일반적으로 다른 객체의 식별자를 알고 있음

     

    * 정리하자면, 상태는 특정 시점에 객체가 가지고 있는 정보 집합이다. 

       객체의 상태는 프로퍼티와, 프로퍼티 값으로 구분할 수 있다.

        프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분 될 수 있다. 

    * 객체지향 세계에서는 객체는 다른 객체의 상태에 직접 접근하거나 변경할 수 없다 

    * 객체지향의 기본 사상은 상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것이다. 

       객체 스스로의 행동에 의해서만 상태가 변경되는 것을 보장하여 객체의 자율성을 유지한다. 

     

    > 행동 

     - 상태는 저절로 변경되지 않는다. 객체의 상태는 객체의 행동으로 변화한다. 

     - 행동에 의해 상태가 변경되는 것은 행동이 부수효과를 초래해서 이다. 

        -> 상호작용이 현재 상태에 어떤 방식으로 의존하는가 

        -> 상호작용이 어떻게 현재의 상태를 변경시키는가 

    > 협력과 행동  

     - 어떤 객체도 섬이 아니다. 주어진 책임을 완수해야한다. 

     - 객체가 어떤 행동을 하도록 만드는 것은 메시지에 의해서만 가능하다. 

     - 수신된 메시지에 따라 적절히 행동하여 협력의 참여하고 그 결과로 자신의 상태를 변경한다.

     - 물론 협력 과정에서 자신의 상태 뿐 아니라 다른 객체의 상태도 변화시킬 수 있다.

     

    * 행동이란 외부 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 

       행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다. 

    * 상태는 캡슐화 되어야한다. 상태를 변경시키는 것은 자신의 행동 뿐이고, 행동을 유발하는 것은 메시지이다.

    * 객체가 외부에 노출하는 것은 행동뿐, 외부에서 객체에 접근할 수 있는 방법도 행동 뿐이다. 

     

    >식별자 

     - 객체들을 구별할 수 있는 특정 프로퍼티 이를 식별자라고 한다. 모든 객체는 식별자를 통해 구별될 수 있다.

     - 값과 객체는 프로퍼티가 될 수 있지만, 값은 식별자가 없다. (객체와 값의 차이) 

     - 값은 흔히 불변상태를 가진다. (값 객체 Integer 등..) >불변상태에 따라 동일값 판단 -> 동등성

     - 객체는 행동을 통해 가변상태를 포함한다. -> 상태가 동일해도 독립적인 객체일 수 있다.

       따라서 식별자를 통해서 객체를 판단 -> 동일성 

    * 참조객체 혹은 엔티티와  값 객체 관계로 생각하자) 

     

    2.4 기계로서의 객체

    - 객체 상태 조회 작업을 쿼리, 상태 변경 작업을 명령 - 블랙박스 모델로 객체를 이해해보는 과정 

    2.5 행동이 상태를 결정한다.

    - 상태를 중심으로 객체를 바라보지 마라. 

      > 상태를 먼저 결정할 경우 캡슐화 저해의 우려가 있다.

      > 객체를 협력자가 아닌 고립된 섬으로 만든다.

      > 객체의 재사용성이 저해된다.

    - 행동에 초점을 맞춰 객체를 바라보자. 상태는 과거 행동에 의한 결과일 뿐이다. 

    - 협력에 문맥에 맞는 적절한 행동을 수행하는 객체를 만들자. 

    - 협력을 생각하고 협력에 필요한 행동을 생각한 후 수행 객체를 선택

    - 행동이란 결국 객체가 협력에 참여하면서 수행해야할 책임을 의미한다. 

     

    2.5 은유와 객체 

    - 객체지향은 현실의 추상화, 모방화가 아닌 으인화에 가깝다. 

    - 현실에서 수동적인 객체가 소프트웨어에서 능동적으로 변화한다. 

     

     

     

    * 객체지향을 바라보는 협력,책임,역할의 관점

       - 객체의 개방성

       응답과 요청으로 이루어진 협력을 위한 메시지 -> 해당 메시지를 처리할 역할을 가진 객체 -> 객체는 역할에 할당된 책임을 수행

       - 객체의 자율성

        책임에 대해 어떻게 처리할 것인지 객체 스스로 정할 수 있는 것을 의미 

        자율성은 객체의 행동과 상태에 의해 부여된다.

     

       - 책임을 수행하는 객체의 자율성 

       1. 상태 -> 과거 행동의 결과이자 향후 행동에 결과에 영향을 미친다.

                       상태는 여러 프로퍼티로 이루어짐 (값, 객체, 식별자) 

                       상태를 변경할 수 있는것은 객체 자신 뿐 

       2. 행동 -> 협력의 과정에서 책임을 수행하면서 객체가 수행하는 여러 작업  (메시지, 메서드를 의미)

                        행위의 결과로 자신의 상태 혹은 다른 객체의 상태에 변화를 줄 수 있다.

                        객체에서 중요한 것은 상태가 아닌 행동이다.

     

    > 협력,책임,역할을 떠올려, 객체를 도출하고 

        협력 과정에서 책임을 구체화할 행동을 중심으로  상태를 생각해보고 

        이를 구현하기 위한 방법으로 클래스를 사용하자.

      

Designed by Tistory.