본문 바로가기
객체지향

[객체지향의 사실과 오해] 2장 이상한 나라의 객체

by 근즈리얼 2024. 3. 16.
728x90

객체지향과 인지 능력

 

많은 사람들이 객체지향을 직관적이고 이해하기 쉬운 패러다임이라고 말하는 이유

-> 객체지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 기본적인 인지능력에 기반을 두고 있기 때문

 

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

 

객체지향 프로그램 : 소프트웨어의 세계 역시 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음에서 시작

 

그러나,

객체지향 패러다임의 목적

  • 현실 세계 모방 x
  • 현실 세계를 기반으로 새로운 세계를 창조

-> 소프트웨어 세계에서 살아가는 객체는 현실 세계에 존재하는 객체와는 전혀 다른 모습을 보이는 것이 일반적!

 

예시)

  • 스스로 전원을 킬 수 있는 전구
  • 주문 객체가 자신의 금액을 결제
  • 자동차가 스스로 시동을 검

실행중인 소프트웨어 세계안에서는 우리가 알고 있는 세계와 매우 유사해 보이지만 본질적으로는 매우 이질적이다!

 

객체라는 것은 인간이 인지하고 구별할 수 있는 경계가 있는 무언로 정의할 수 있을 것 같습니다.

계속 책을 읽으면서 느끼는 것은 현실 세계를 모방하지 않는 것! 이라고 하기 보다는 현실 세계와 비슷하게 그리지만 그 안에서 이질적인 차이가 있구나 라는 생각이 듭니다.

이질적인 차이는 계속 책을 읽으면 더 명확해지겠지만 객체 스스로 무언가를 할 수 있다는 것이 가장 큰 것 같습니다!

자율적인 객체!

 

객체, 그리고 이상한 나라

이상한 나라의 앨리스

이상한 나라의 앨리스 이야기가 나옵니다.

그중에서 앨리스의 키가 작아졌다 커졌다 하는 이야가 나옵니다.

 

케이크나 버섯을 먹거나 부채질을 하면 키가 커지거나 작아질 수 있습니다. 또한 앨리스는 복도에 있거나 정원으로 이동할 수 있습니다.

 

앨리스 객체

앨리스의 상태 : 키, 위치

앨리스의 행동 : 부채질을 하거나, 음료를 마시거나, 버섯을 먹거나~

 

-> 앨리스의 키를 변화시키는 것은 앨리스의 행동

-> 앨리스의 행동에 따라 앨리스의 상태가 변화

 

-> 앨리스의 상태를 결정짓는 것은 행동이지만 행동의 결과를 결정하는 것은 상태

-> 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적

ex) 앨리스가 정원에 도달하기 위해 문을 통과한다 -> 앨리스가 문을 통과할 수 있는 것은 앨리스의 키가 얼마인가에 달렸다 -> 문을 통과한다는 행동은 앨리스의 키인 상태에 의존

 

행동에 의해 상태가 변경되더라도 앨리스가 앨리스라는 사실은 변하지 않는다.

-> 앨리스는 상태 변경과 무관하게 유일한 존재로 식별 가능

 

앨리스 요약

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

앨리스 이야기를 꺼낸 이유는 객체지향의 객체들과 중요한 공통점 몇가지를 공유하기 때문이다.

 

1장에서 말했던 내용과 비슷하게 상태, 행동, 식별 이라는 단어가 나왔습니다.

이 단어들을 좀 더 주의하면서 다음 장을 읽어보겠습니다!

다음 장에 앨리스를 이용해서 좀 더 객체지향의 세계를 설명해줄 것 같습니다!

 

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

독립적인 하나의 단위로 인식할 수 있는 모든 사물은 객체이다.

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

앨리스는 상태, 행동, 식별자를 지닌 실체다.

 

이 책에서는 객체를 다음과 같이 정의한다.

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

 

상태

왜 상태가 필요한가

  • 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있음
  • 앨리스의 키와 문의 높이라는 두 가지 상태만 알면 문을 통과하는 행동의 결과를 쉽게 예측할 수 있음
  • 상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념

상태와 프로퍼티

  • 앨리스 뿐만 아니라 버섯, 케이크, 토끼, 문 모든 것이 객체이다.
  • 그러나, 세상에 존재하는 모든 것이 객체는 아니다. -> 앨리스의 '키'와 '위치'는 객체가 아니다.
  • 숫자, 문자열, 양, 속도 등등 단순한 값들은 객체가 아니다. -> 객체의 상태를 표현하기 위한 중요한 수단
  • 객체는 단순한 값들과 객체들과 연결을 통해 표현할 수 있다.
  • 객체의 상태를 구성하는 모든 특징을 통틀어 프로퍼티라고 함
    • 키, 위치, 음료가 앨리스의 프로퍼티
    • 변경되지 않고 고정되기 때문에 정적이라고 표현
  • 프로퍼티의 값
    • 시간에 따라 변경되기 때문에 동적
    • 앨리스의 키는 음료를 먹으면 작아지고, 문을 통과하면 정원으로 위치가 변함

객체와 객체 사이에 의미있는 연결을 링크라고 하며 링크가 존재해야 요청을 보내고 받을 수 있음

-> 객체의 링크를 통해서만 메시지를 주고받음

 

이 책에서 객체의 상태를 다음과 같이 정의함

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

 

객체는 자율적인 존재라는 것을 명심해야 한다.

객체지향의 세상에서 다른 객체의 상태를 직접적으로 접근할 수도 변경할 수도 없다.

 

그렇다면, 간접적으로 객체의 상태를 변경하거나 조회할 방법이 무엇이 있을까?

이때, 행동이 등장한다.

행동은 다른 객체로 하여금 간접적으로 객체의 상태를 변경하는 것을 가능하게 한다.

 

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

 

이번 정리에서는 상태에 대해서 좀 더 깊에 설명을 했습니다. 상태가 무엇인지 설명하고 있지만.. 저는 가장 중요한 부분은 다음 주제로 나오는 행동과 행동을 통해서 상태를 어떻게 간적접으로 변경하는지가 객체지향에서 매우 중요할 것 같습니다.

 

즉, 객체는 자율적인 존재로 각각 상태를 가지고 있는데 다른 객체의 상태를 직접적으로 영향을 줄 수 없는 자율적인 존재다. 간접적으로 영향을 주기 위해서는 객체의 행동이 필요하고 이제 한번 알아보자! 라고 정리할 수 있겠습니다.

행동

상태와 행동

 

객체의 상태는 저절로 변경되지 않는다

-> 객체의 상태를 변경하는 것은 자발적인 행동

 

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

 

상태와 행동 사이에는 다음과 같은 관계가 있다

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

앨리스 예시

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

협력과 행동

 

객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공한다.

객체는 다른 객체와 적극적으로 상호작용하며 '협력하는 객체들의 공덩체'에 참여하기 위해 노력한다.

 

다른 객체와 협력하는 유일한 방법 : 요청

-> 요청을 받은 객체는 행동함 -> 행동 : 협력에 참여할 수 있는 유일한 방법

 

객체는 수신된 메시지에 따라 적절히 행동하면서 협력에 참여하고 그 결과로 자신의 상태를 변경

 

객체의 행동으로 발생하는 결과

  • 객체 자신의 상태 변경
  • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송

이 책에서는 행동을 다음과 같이 정의한다.

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

 

상태 캡슐화

 

객체지향의 세계에서

모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재

 

앨리스가 음료를 마시고 키를 작게 만드는 것은 앨리스 자신이다

-> 음료를 마신것은 앨리스이지만 음료이 양을 줄어들게 하는 것은 음료 자신이 되어야 한다.

-> 앨리스는 직접적으로 음료의 상태를 변경할 수 없고 음료에게 메시지를 보낼 뿐이다.

 

메시지 송신자 (앨리스 객체)는 메시지 수신자(음료)의 상태 변경에 대해서는 전혀 알지 못한다.

-> 캡슐화를 의미

-> 객체의 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.

-> 객체가 외부로 노출하는 것은 행동뿐, 외부에서 객체에 접근할 수 있는 유일한 방법은 행동 뿐

행동을 경계로 캡슐화하는 것은 결과적으로 객체의 자율성을 높인다.

자율적인 객체 -> 스스로 판단, 스스로 결정 -> 객체의 지능이 높아짐 -> 협력은 유연하고 간결해짐

 

결론))

상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.

-> 상태를 캡슐화해야 하는 이유

 

이번 정리에서 캡슐화를 왜 해야하는지에 대해서 더욱 알게 된 것 같습니다. 행동을 기준으로 외부와 내부를 나눈다는 점이 매우 중요한 개념인거 같습니다!

 

식별자

객체 : 인간의 인지 능력을 이용해 식별 가능한 경계를 가진 모든 사물

-> 식별 가능한 특정한 프로퍼티가 존재 -> 식별자

 

식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성이라고 한다.

 

식별자는 객체지향 패러다임의 표현력을 높이는데 중요한 역할을 한다.

객체지향의 세계는 상태가 변하지 않는 값상태가 변하는 객체들이 서로 균형을 맞추며 조화를 이루는 사회여야 한다.

 

기계로서의 객체

객체지향의  세계를 창조하는 개발자들의 주된 업무 -> 객체의 상태를 조회하고 객체의 상태를 변경하는 것

객체 상태 조회 : 쿼리

객체 상태 변경 : 명령

 

객체의 예시로 기계를 들 수 있다.

  • 기계를 분해하지 않는 한 내부를 알 수 없음
  • 사각형 모양의 버튼을 누르면 객체의 상태를 변경할 수 있음
  • 사각형 버튼을 누른 시점에는 변경된 상태를 직접 눈으로 볼 수 없음
  • 원 모양의 버튼을 눌러서 객체 상태를 조회할 수 있음

사용자가 버튼을 누르는 것 == 메시지를 전송

-> 상태를 변경하거나 상태를 조회하는 것

 

버튼을 누르는 것은 사용자이지만, 동작할지는 기계가 스스로 결정

-> 전달된 메시지에 따라 스스로 판단하고 결정하는 자율적인 객체의 특성

 

어떤 사용자도 직접 기계를 열어 기계 내부의 상태를 직접 접근하려고 하지 않음

-> 사용자는 명령 버튼과 쿼리 버튼으로 구성된 인터페이스를 통해서만 객체에 접근

 

객체를 기계로 설명할 때 가장 큰 장점은 객체 캡슐화를 직관적이고 시각적으로 묘사한다는 것이다.

  • 상태는 버튼에 의해 유발되는 행동에 의해서만 접근 가능
  • 상태와 행동이 하나의 단위로 캡슐화된다는 객체의 정의를 효과적으로 설명

또한, 식별자 역시 효과적으로 설명 가능

똑같은 버튼과 똑같은 상태를 갖은 기계가 두 개 있더라도

두 기계를 동일한 기계로 보는 사람은 없을 것이다.

 

기계로써의 객체를 정리하면

-> 상태, 행동, 식별자에 대한 시각적인 이미지를 제공하고 캡슐화와 메시지를 통한 협력 관계를 매우 효과적으로 설명한다.

 

객체를 기계로 설명하는 것은 구체적인 좋은 예시가 될 수 있는 것 같습니다.

버튼을 통해서 객체 내부에 간접적인 메시지를 전달할 수 있으며 기계의 내부를 직접 찾아보지 않는다는 점은 캡슐화를 이해하는데 시각적으로 매우 좋은 예시인것 같습니다.

 

행동이 상태를 결정한다.

객체지향을 막 시작한 사람들이 쉽게 빠지는 함정 : 상태를 중심으로 객체를 바라보는 것

 

초보자들 : 객체에 필요한 상태가 무엇인지를 결정하고 그 상태에 필요한 행동을 결정

이러한 행동들은 설계에 나쁜 영향을 줌

 

나쁜 영향~

  • 캡슐화 저해
    • 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되버릴 확률이 높아짐
  • 객체가 협력자가 아닌 고립된 섬이 되어버림
    • 상태를 먼저 고려하는 방식은 협력이라는 문맥에서 멀리 벗어나 버림
  • 재사용성 저하
    • 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어려움 -> 재사용성 저하

협력에 참여하는 훌륭한 객체 시민을 양성 방법 -> 행동에 초점을 맞추자

객체가 적합한지를 결정하는 것은 그 객체의 상태가 아니라 행동이다!

-> 우리가 애플리케이션 안에서 어떤 행동을 원하느냐가 어떤 객체가 적합한지를 결정

-> 객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동!

 

어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 함 -> 책임-주도 설계

-> 협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.

 

이 부분의 글을 읽으면서 과연 직접적인 개발을 할 때 상태가 아닌 행동에 초점을 맞춘 객체를 만들었을까? 라는 생각을 하게 되었습니다.

행동을 위해서 만든 객체도 있던 반면에 상태만을 위한 객체도 만들었던 기억이 있습니다..

이제부터 의식적으로라도 행동에 초점을 맞춘 객체를 만들 수 있도록 노력해야겠습니다 ㅎㅎ

 

은유의 객체

객체지향을 현실의 모방이라고 하는 것이 과연 올바른 생각일까요??

 

소프트웨어 객체의 특징을 의인화라고 부를 수 있을것 같습니다.

객체들은 현실세계에서는 할 수 없는 것들도 할 수 있습니다.

가령, 스스로 전원을 킬 수 있는 전구 혹은 스스로 자신의 양을 줄일 수 있는 음료가 있습니다.

즉, 객체지향 세계의 거리는 현실 속의 객체보다 더 많은 특징과 능력을 보유한 객체들로 넘친다고 할 수 있습니다.

 

또한,

현실 세계와 객체지향 세계 사이의 관계를 좀 더 정확하게 설명할 수 있는 단어는 은유가 있습니다.

실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있습니다.

-> 소프트웨어 객체에 대한 현실 객체의 은유를 효과적으로 사용할 경우 표현적 차이를 줄일 수 있음

-> 이해하기 쉽고 유지보수가 용이한 소프트웨어를 만들 수 있음

-> 객체지향 지침서에서는 현실 세계인 도메인에서 사용되는 이름을 객체에게 부여하라고 가이드함

 

결론적으로,

객체지향 설계자로서 우리의 목적은 현실을 모방하는 것이 아닙니다. 단지 이상한 나라를 창조하는 것입니다.

 

새롭게 만들어낸 객체의 특성을 상기시킬 수 있다면 현실 속의 객체의 이름을 이용하면 됩니다.

 

이번 단락 정리는 뭔가... 좀 저의 언어 그리고 저의 생각으로 정리를 하게 되었습니다.. ㅎㅎ

그래서 간단하게 저의 생각정리를 하고 넘어가려고 합니다.

우선, 가장 핵심은 객체지향은 현실의 모방이 아니다 입니다.

처음에는 무슨 말이지 싶었지만! 책을 읽으면서 점점 개념이 명확해지는 느낌을 받고 있습니다!

소프트웨어의 객체는 현실 객체보다 훨씬 더 많은 일을 수행할 수 있습니다. 그러면서 현실 객체의 이름으로 다른 사람들도 객체에 대한 이해도가 높아집니다. 표현적 차이가 줄었기 때문이죠

따라서, 현실 세계에 국한된 소프트웨어 세계가 아닌 더 이상한(자율적인 객체들이 있는) 소프트웨어 세상을 만드는 것이 중요한 것 같습니다.

 

https://www.yes24.com/Product/Goods/18249021

 

객체지향의 사실과 오해 - 예스24

『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝게도 많은 사람들이 객체지향의 본질을 오해하고 있다. 가장

www.yes24.com

 

728x90

댓글