본문 바로가기
독서

객체지향의 사실과 오해 (Chapter 1, 2)

by graygreat 2021. 3. 29.
728x90
반응형

www.coupang.com/vp/products/3703599?itemId=18239473&vendorItemId=3026816827&q=%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98+%EC%82%AC%EC%8B%A4+%EC%98%A4%ED%95%B4&itemsCount=3&searchId=f4fef6e7f46c484f880414144e01fc9e&rank=0&isAddedCart=

 

객체지향의 사실과 오해 : 역할 책임 협력 관점에서 본 객체지향

COUPANG

www.coupang.com

얼마 전, 존경하는 형에게 여러가지 조언을 구했다.
그러던 중 형은 "객체지향이 뭐야?"라는 질문을 던졌고 나는 얼타며 생각나는 것을 대답했다.
나의 대답은 정확하지 않았고, 형은 '객체지향의 사실과 오해'라는 책을 추천해주었다.
형의 질문은 백엔드 자바 개발자 취준생으로서 객체지향에 대해 대답하지 못한 나를 되돌아볼 수 있게 해주었고 더 많은 책과 공부를 하고 싶은 의지를 만들어주었다.

이 책은 총 7개 챕터로 나누어져있다.
나는 책 읽는 시간을 좋아하지만 기억력이 나빠 내용을 잘 기억하지 못한다.
그래서 2개의 챕터씩 읽고 블로그에 정리할 생각이다.

읽으면서 기억에 남는 문장들을 마구잡이로 적을 생각이라 흐름이 없을 것이다.
내가 공부하기 위한 노트이다.

'기억보단 기록을'

 

  • Chapter 1. 협력하는 객체들의 공동체
  • Chapter 2. 이상한 나라의 객체

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

나는 객체지향이 실세계를 모방한다고 생각했는데 아니였다. 책에서는 오히려 새로운 세계를 창조한다고 말한다.

역할, 책임, 협력은 객체지향에서 가장 중요한 개념이라고 할 수 있다.
책에서는 카페에 빗대어 객체지향을 설명한다.

손님, 캐시어, 바리스타는 역할,
커피를 주문하고 주문 받고 커피를 제조하는 것은 각자의 책임,
마지막으로 모든 과정 속에서의 요청과 응답을 통한 암묵적인 협력 관계가 존재한다.

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

사람의 역할에 중요한 개념이 몇가지 있다.

  • 여러 사람이 동일한 역할을 수행할 수 있다.
  • 역할은 대체 가능성을 의미한다.
  • 책임을 수행하는 방법은 자율적으로 선택할 수 있다. (다형성)
  • 한 사람이 동시에 여러 역할을 수행할 수 있다.

위의 카페 이야기를 객체지향 이야기로 바꾸게 되면 아래와 같다.

사람 = 객체
요청 = 메시지
요청을 처리하는 방법 = 메서드

객체는 자신에게 주어진 역할과 책임을 다하는 동시에 시스템의 더 큰 목적을 이루기 위해 다른 객체와도 적극적으로 협력한다.

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

위에 적은 사람의 역할 4가지와 비슷하게 객체의 역할은 다음과 같다.

  • 여러 객체가 동일한 역할을 수행할 수 있다.
  • 역할은 대체 가능성을 의미한다.
  • 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

객체는 다른 객체가 '무엇'을 수행하는지는 알 수 있지만 '어떻게' 수행하는지에 대해서는 알 수 없다.

바리스타로 전달된 커피 제조 요청은 메시지, 커피를 제조하는 구체적인 방법은 메소드.
커피를 제조하는 방법은 언제든지 바뀔 수 있다. ==> 다형성

객체지향이란 무엇인가?

시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
여기서 자율적인 객체란 상태와 행위를 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.

객체지향의 핵심은 클래스가 아니다. 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.

클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중해라.

내 생각

나는 객체지향을 전혀 몰랐던 것 같다. 역할, 책임, 협력을 나눠서 생각한 적이 없고 그냥 클래스만 연관시켜서 생각했다. 민성이형이 괜히 내 답변이 틀렸다고 한게 아니였군... 생각이 든다!

이번 장에 대한 내 생각을 정리하자면, 객체는 각자의 역할이 있고 역할에는 책임이 있다. 그리고 그 역할들은 서로 협력한다.

나는 학생의 역할을 하고 열심히 공부해야 하는 책임이 있다. 교수님은 교수라는 역할을 가지고 학생을 가르쳐야 하는 책임이 있다. 또한 학생의 역할을 맡은 사람과 협력하여 수업을 한다.

이번 장을 통해 객체지향이 어떻게 구성되어 있는지 조금 알 것 같다.

2. 이상한 나라의 객체

객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. 그렇기에 객체지향이 실세계를 모방한다는 것은 잘못되었다.

객체의 다양한 특성을 효율적으로 설명하기 위해서는 객체를 상태(State), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다.

객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.

객체와 객체 사이에는 링크라는 것이 존재하는데 이 링크가 존재해야만 요청을 주고 받을 수 있다.
즉, 객체의 링크를 통해서만 메시지를 주고 받을 수 있다.

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

객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공한다.
객체가 어떤 행동을 하도록 만드는 것은 객체가 외부로부터 수신한 메시지다.

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

캡슐화

객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.

객체의 행동을 유발하는 것은 외부로부터 전달된 메시지지만 객체의 상태를 변경할지 여부는 개체 스스로 결정한다. 객체에게 메시지를 전달하는 외부 객체는 메시지를 수신하는 객체의 상태가 변경된다는 사실조차 모른다. 이것을 캡슐화라고 할 수 있다.

캡슐화 하는 것은 객체의 자율성을 높이고 협력을 단수하고 유연하게 만들어준다.

식별자

값과 객체의 가장 큰 차이점은 값은 식별자를 가지지 않지만 객체는 식별자를 가진다는 점이다.

값은 변하지 않는 양을 모델링하며 불변 상태를 가진다고 말한다.
값을 비교할 때, 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)이라 한다.

반면, 객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다. 따라서 가변 상태를 가진다고 말한다.

객체는 두 객체를 동일하거나 다르다고 판단할 수 있는 프로퍼티를 가진다.
식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라 한다.


객체의 특성은 다음과 같다.

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

//thumbnail10.coupangcdn.com/thumbnails/remote/492x492ex/image/vendor_inventory/410c/b3437f0d3d4a68c0069b01691294e49a84aaf7e638bd38429418bdf85abc.jpg 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는 데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다. 객체의 행동은 결국 협력에 참여하면서 완수해야 하는 책임을 의미한다.

내 생각

이번 장도 역시나 충격적이다.
내가 알고 있다고 생각한 내용들은 대부분이 잘못되었다.
캡슐화, 식별자에 대한 개념을 새롭게 잡을 수 있었고, 객체에서 중요한 상태, 행동, 식별자에 대해서도 알 수 있었다.

어렵다... 재밌는데 어렵다... 두 번은 더 읽어야 조금 알 것 같다.
그래도 꾸준히 읽고 공부하자! 그러면 잘 알게 되겠지...

반응형

댓글