TIR: 객체지향의 사실과 오해 | (2) 이상한 나라의 객체

Lumpen·2023년 1월 24일
0

OOP

목록 보기
2/5

객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화 함으로 실세계 문제에 내재된 복잡성을 관리하려고 한다
객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다

객체지향과 인지 능력

인간은 인지능력을 이용해 세상에 존재하는 다양한 객체를 식별하고 분류함으로
세상을 이해한다
객체지향은 직관적이고 이해하기 쉬운 패러다임이라고 말한다
인간의 기본적인 인지 능력과 비슷하기 때문

객체지향 패러다임은 인간이 인지할 수 있는 다양한 객체들이 모여 현실 세계를 이루는 것과 같이 소프트웨어 세계 역시 다양한 소프트웨어 객체들이 모여 이뤄져있다는 믿음에서 출발한다

저자는 객체지향과 현실 세계의 유사성은 여기까지라고 말한다
그리고 역시나 객체지향은 현실 세계의 것을 바탕으로 새로운 세상을 창조하는 것이라고 말했다

객체, 그리고 이상한 나라

이상한 나라의 앨리스

  • 앨리스는 상태를 가지며 상태는 변경 가능하다
  • 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다
    - 행동의 결과 상태는 상태에 의존적이며 상태를 이용해 서술할 수 있다
    - 행동의 순서가 결과에 영향을 미친다
  • 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다

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

하나의 개별 실체로 식별 가능한 물리, 개념적 사물은 어떤 것이라도 객체가 될 수 있다
객체는 상태, 행동, 식별자를 지닌 실체로 보는 것이 효과적이다

상태

왜 상태가 필요한가

행동의 과정과 결과를 단순하게 기록할 수 있다
상태에 따라 행동이 혹은 같은 행동이라도 결과가 달라질 수 있다

상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을
이해할 수 있다
세상의 복잡성을 완화하고 인지 과부화를 줄일 수 있는 중요한 개념이다

상태와 프로퍼티

세상의 존재하는 모든 것이 객체는 아니다
키, 위치, 속도 등
단순한 값들은 그 자체로 독립적인 의미를 가지기보다는
다른 객체들의 특성을 표현하는 데 사용된다
객체는 아니지만 객체의 상태를 표현하는 중요한 수단이 된다

때로는 단순한 값이 아닌 객체로 상태를 표현해야할 때도 있다

모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다
이 때 객체의 상태를 구성하는 모든 특징을 통틀어서 프로퍼티라고 한다
일반적으로 프로퍼티는 정적으로 변하지 않는다
반면 프로퍼티 값은 동적으로 변할 수 있다

객체와 객체 사이의 연결은 link 라고 한다
link가 존재해야만 객체끼리 메시지를 주고 받을 수 있다

링크는 객체가 다른 객체를 참조할 수 있다는 것으로
일반적으로 참조하는 객체의 식별자를 알고 있는 것으로 표현된다

객체의 단순한 값은 속성 이라고 한다
객체의 프로퍼티는 속성과 링크라는 두 조합으로 표현할 수 있다

상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다
객체의 상태는 객체에 존재하는 정적 프로퍼티와 동적 프로퍼티 값으로 구성된다
객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다
링크는 연간관계라는 정적인 관계의 인스턴스로 보면 된다
따라서 프로퍼티는 속성과 연관관계로 구분할 수 있다

객체는 자율적 존재로 다른 객체의 상태에 직접 접근하거나 변경할 수 없다

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

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

행동

상태와 행동

객체의 상태는 객체의 자발적 행동에 의해서만 변경된다
객체가 취하는 행동은 객체 자신의 상태를 변경시킨다
이는 행동이 부수효과(side effect) 를 초래한다는 것을 의미한다

객체의 행동은 객체의 상태를 변경시키고 행동의 결과는 객체 상태에 의존적이다

  • 객체의 행동은 상태에 영향을 받는다
  • 객체의 행동은 상태를 변화시킨다

행동을 두 가지 관점에서 서술할 수 있다

  • 상호작용이 현재의 상태에 어떤 방식으로 의존하는지
  • 상호작용이 어떻게 현재의 상태를 변경시키는지

상태를 이용해 앨리스를 표현해보면

  • 앨리스의 키가 40센티미터 이하라면 문을 통과할 수 있다
  • 문을 통과한 후의 위치는 아름다운 정원이 되어야 한다

협력과 행동

어떤 객체도 섬이 아니다
객체는 자신의 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공하기도 한다

객체가 다른 객체외 협력하는 유일한 방법은 다른 객체에게 요청을 보내고 요청을 수신한 객체는 적절히 처리 후 응답을 하는 것
따라서 객체의 행동은 협력에 참여할 수 있는 유일한 방법이다

객체는 메시지를 통해서만 의사소통할 수 있다
객체는 수신된 메시지에 따라 적절히 행동하고 그 결과로 자신의 상태를 변경한다
또한 다른 객체의 상태 변경도 유발할 수 있다

따라서 객체의 행동으로 인한 결과는
다음 두 가지 관점의 부수효과를 명확히 서술해야 한다

  • 객체 자신의 상태 변경
  • 행동 내에 협력하는 다른 객체에 대한 메시지 전송
행동은 외부의 요청 혹은 메시지에 응답하기 위해 동작하고 반응 하는 것
행동의 결과로 자신의 상태를 변경하거나 다른 객체에 메시지를 전송할 수 있다
객체는 행동을 통해 다른 객체와의 협력에 참여하므로
객체의 행동은 외부에 가시적이어야 한다

상태 캡슐화

현실 세계와 객체지향의 중요한 차이는
현실에서는 물체를 조절하는 것이 항상 사람의 역할이지만
객체지향에서는 객체 스스로 자신의 상태를 관리하는 자율적 존재라는 점이다

객체는 상태를 캡슐 안에 감춰두어 외부로 노출하지 않는다
객체가 외부에 노출하는 것은 행동 뿐이고, 외부에서 유일하게 접근할 수 있다

객체의 행동을 유발하는 것은 메시지이지만 상태를 변경할지 여부는 스스로 결정한다
메시지를 전달하는 객체는 이를 알지 못한다

상태를 외부에 노출시키지 않는 캡슐화는 객체의 자율성을 높인다
객체의 자율성이 높아질수록 협력은 유연하고 간결해진다
이것이 캡슐화의 이유다

식별자

식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정 프로퍼티가 객체 안에 존재한다는 의미다
이 프로퍼티를 식별자라고 한다
객체가 가진 단순한 값은 식별자를 가지지 않는다
단순한 값과 객체의 차이를 명확하게 구분하고 명시적으로 표현하는 것이 중요하다

값은 숫자, 문자열 등과 같이 변하지 않는 양을 모델링 한다
흔히 값의 상태는 변하지 않기 때문에 불변 상태(immutable state)를 가진다고 한다

값의 경우 두 인스턴스의 상태가 같다면 같은 것으로 판단한다
두개의 1을 비교했을 때 서로 동일하다고 평가하는 것과 같다
이처럼 두 값이 같은지 평가할 수 있는 것을 동등성이라고 한다

객체는 시간에 따라 변경되는 상태를 포함하며 행동을 통해 상태를 변경한다
객체는 가변 상태(mutable state)를 가진다고 말한다

두 객체의 상태가 완전히 같더라도 두 객체는 독립적인 별개의 객체로 다뤄야 한다

두 객체의 상대가 다르더라도 식별자가 같다면 두 객체를 같은 객체로 판단할 수 있다 이를 동일성 이라고 한다

상태를 기반으로 객체의 동일성을 판단할 수 없는 이유는 시간의 흐름 혹은 동작에 따라 객체의 상태가 변할 수 있기 때문이다

대부분의 경우 값과 객체의 차이점을 혼란스러워 하는데
보통 둘 다 클래스를 이용해 구현되기 때문이다

오해의 소지를 줄이기 위해
참조 객체 또는 엔티티라는 이름으로 객체를 부르고
값 객체는 식별자를 가지지 않는 값을 부를 때 사용한다

객체 식별자의 개념은 상속, 캡슐화, 다형성과 같은 두드러진 개념에 비해 간과하기 쉽다
하지만 식별자는 객체지향 패러다임의 표현력을 높이는 데 중요한 역할을 한다

  • 객체는 상태를 가지며 상태는 변경 가능하다
  • 객체의 상태를 변경시키는 것은 객체의 행동이다
    - 행동의 결과 상태는 상태에 의존적이며 상태를 이용해 서술할 수 있다
    - 행동의 순서가 결과에 영향을 미친다
  • 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다

기계로서의 객체

일반적으로 객체의 상태를 조회하는 것을 쿼리
객체의 상태를 변경하는 작업을 명령이라고 한다
객체가 외부에 제공하는 행동의 대부분은 쿼리와 명령으로 구성된다

객체에 접근할 수 있는 유일한 방법은 행동이고
객체가 제공하는 명령 버튼과 쿼리 버튼으로 구성된
인터페이스를 통해서만 객체에 접근할 수 있다
이는 캡슐화를 말한다

행동이 상태를 결정한다

안타깝게도 상태를 먼저 결정하고 행동을 결정하는 방법은 설계에 나쁜 영향을 미친다

  • 상태를 먼저 결정할 경우 캡슐화 저해 가능성이 있다
  • 객체를 협력자가 아닌 고립된 섬으로 만든다 어플리케이션 문맥 내에서 다른 객체와 협력을 해야한다
  • 객체의 재사용성이 저하된다 재사용성은 다양한 협력에서 나온다

협력에 참여할 수 있는 객체를 만드는 것은 행동에 초점을 맞춰 설계하는 것이다
객체는 다른 객체와 협력하기 위해 존재한다
객체가 적합한지 결정하는 것은 상태가 아니라 행동이다

객체지향 설계는 애플리케이션에 필요한 협력을 생각하고
협력에 필요한 행동, 행동을 수행할 객체를 선정하는 방식으로 수행된다

따라서 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다
책임 주도 설계 (RDD) 가 되어야 한다
협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써
응집도 높고 재사용 가능한 객체를 만들 수 있게 한다

은유와 객체

객체 지향은 현실 세계의 모방이 아니다
흔히 추상화라고 하는데
객체지향 세계는 단순한 현실 세계의 모방이 아니다
무슨 의미에서 이야기하는 것인지는 알겠지만
단순히 문과적 사고와 이과적 사고에 대한 충돌로만 보인다

주로 이런 이야기다
문: 그래서 결론이 뭔데?
이: 그러니까 결론이.. 0에서 시작해서 1을 더했고 2를 더했으니까 3이야
문: 그럼 3이니까 저 3이랑 같네?
이: 아니지 저건 2부터 시작해서 1과 0을 더한거잖아
문: 그래서 3이랑 3이 같잖아?
이: 아.. 같긴 같은데..

이런 식의 내용이다
문과적 사고는 보통 얕은 비교를 한다
이과적 사고는 깊은 비교를 한다
문과가 추상화 정도를 얼만큼 했냐에 따라
이야기가 달라진다

아무튼 이 책에서 말하고자 하는 다른점

의인화

객체가 자신의 상태를 자율적으로 변경하는 행동을 갖는다는 것
현실의 객체가 하지 못하는 일을 스스로 한다는 점이다
사실 스스로 하는게 아니라 그냥 거기서 일어나는 정의를 해당 객체 내부에서
할 뿐인데 저자는 진정한 의미에서 의인화를 하고있다...

아무튼 객체는 내부에 정의된 메소드를 통해 스스로의 상태를 바꾼다는 점만
기억하면 된다

은유

현실과 객체지향 사의를 조금 더 명확히 표현할 수 있는 단어는 은유다
현실 속 객체의 의미 일부가 소프트웨어 객체로 전달되기 때문에
프로그램 내의 객체는 현실속 객체의 은유라고 볼 수 있다
이걸 보통 사람들은 추상화라고 부른다..
이정도면 반대를 위한 반대가 아닐까 싶지만..

실제 객체와 소프트웨어 객체의 차이를 표현적 차이 라고 볼 수 있다
은유 관계에 있는 실제 객체 이름을 소프트웨어 객체의 이름으로 사용하면
표현적 차이를 줄일 수 있다
모든 객체지향 지침서에는 현실 세계의 도메인에서 사용되는 이름을
객체에 부여하도록 한다

이상한 나라를 창조하라

이 부분에서 저자를 이해할 수 있게 되었다

객체지향의 목적은 현실을 그대로 모방하는 것이 아니라
행동이 현실과 완전히 다르더라도 협력을 통해 목적을 달성하면 된다는 뜻 같다
현실 객체의 행동에 매몰되어서 프로그램을 안좋게 만들지 말자는 이야기

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글