2장. 이상한 나라의 객체
객체지향 패러다임은 지식을 추상화 하고 추상화한 지식을 객체 안에 캠슐화 함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다. 객체를 발견하고 창조하는 것은 지식과 행동을 구조화 하는 문제다. - 레베카 워프스브룩
객체지향은 인간의 기본적인 인지 능력에 기반을 두고 이해를 돕기 때문에 현실 세계를 참조 하고 있는 것이다.
[ 객체지향과 인지 능력 ]
소프트웨어 세계는 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음으로 출발한다.
인간의 인지 능력은 물리적인 것 뿐 아니라 추상적인 사물 까지도 객체로 인식 할 수 있는 능력이 있다.
"주문"과 "계좌 이체" 는 비록 물리적인 실체가 아니지만 인간은 하나의 객체로 분류 하여 다룰 수 있다.
💡 객체지향 패러다임의 목적은 현실 세계를 모방 하는 것이 아닌 이해 할 수 있는 정보들로 소프트웨어 세계를 재 탄생 시키는 것이다. 인간은 추상화 된 개념을 인지 할 때 현실 세계에 있는 내용을 참조 하여 이해하려 할 것이다.
[ 객체, 그리고 이상한 나라 ]
"이상한 나라의 엘리스" 의 내용 중
엘리스는 아름다운 정원을 들어가기 위해 음료를 마시거나, 부채질을 하거나 여러가지 행동으로 자신의 몸집을 줄였다 키웠다 하여 문 크기에 몸집을 맞춰 통과 한다.
[ 객체, 그리고 소프트웨어 나라 ]
객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다.
상태
"상태는 왜 필요한가?"
상태를 이용 하면 과거의 모든 행동 이력들을 기억 하지 않더라도 자율적인 행동을 만들어 낼 수 있다.
만약, 엘리스가 키를 줄이기 위해 음료를 마시거나 부채질을 하거나 버섯을 먹었거나 등 여러가지 행동을 한 뒤 키가 작아진다면 우리는 "음료", "부채질", "버섯"을 바탕으로 세 가지 행동으로 상태를 변경 시킬 수 있다.
하지만, "키를 줄이는 행동을 했는가?" 라고 상태를 저장한 뒤 그 행동을 했다면 상태를 변경 하는 방식으로 접근 하여 복잡성을 줄이고 인지 과부하(키를 줄이기 위한 과거 행동 이력)을 줄이는데 중요한 개념이다.
행동
"객체의 상태는 스스로 변하지 않는다.
엘리스의 세계로 다시 돌아가보자. 엘리스는 음료를 마시거나, 부채질 등 다양한 행동을 통해 자신의 키를 줄이거나 키울 수 있었다. 여기서 "키"는 중요한 엘리스의 상태 정보이다.
그렇다면 엘리스는 무언가 행동을 한 뒤 "키"가 변할 수 있는 것이다. 이렇게, 상태를 이용하면 복잡한 객체의 행동을 쉽게 이해 할 수 있다.
그러나, 객체지향 세계에서는 자신의 상태를 스스로 관리하는 존재이며 엘리스의 키를 작게 만드는 것이 엘리스 자신인 것 처럼 다른 객체가 직접적으로 다른 객체의 상태를 변경 할 수 없고 메시지를 보내 객체가 상태를 변하도록 만들어야 한다.
객체간 협력 규칙
다른 객체와 협력하는 유일한 방법은 객체에게 요청을 보내는 것이다.
직접적으로 다른 객체에게 접근 하는 것이 아닌 메시지를 보내 의사소통 할 수 있다.
식별자
값과 객체의 가장 큰 차이점은 값은 식별자를 가지지 않지만 객체는 식별자를 가진다는 점이다.
식별자를 가진 객체(Entity)
동명이인인 앨리스가 있고, 이 둘은 키도 같고 이름도 같다. 과연 이 두 앨리스를 같은 사람이라고 볼 수 있을까?
이처럼 상태는 완전히 같지만 식별자가 다른 경우는 다른 객체라고 인식 할 수 있다. 이렇게 식별자를 기반으로 같은지를 판단하는 성질인 동일성을 이용한다.
식별자를 가지지 않는 객체(Value)
숫자 1이라는 글씨 2 개가 종이 위에 있을 때 모든 사람이 두 숫자는 동일 하다고 인식 하며 그 결과를 의심하지 않는다. 이렇게 상태가 같은지 판단 하는 성질인 동등성을 이용한다.
[ 기계로서의 객체 ]
엘리스 객체를 기계로 표현 한다면 위와 같은 이미지의 형태를 띌 것이다.
위 이미지를 객체로 의인화 하며 생각 해보자. 객체가 갖고 있는 행동을 취하려면 기계가 나타내고 있는 버튼을 누르면 된다. 그 어떠한 이유로든 이 기계를 분해 하여 내부를 살피지 않을 것이다.
💡 즉, 사용자는 객체가 제공하는 명령 버튼과 쿼리 버튼으로 구성된 인터페이스를 통해서만 객체에 접근 할 수 있다. 이 것은 객체의 캡슐화를 강조하는 조건이다.
상태를 먼저 결정하고 행동을 나중에 결정하는 객체 설계의 나쁜 영향
상태를 먼저 결정할 경우 캡슐화 저해
객체가 상태를 갖는 이유는 객체의 과거 행동 이력을 저장 하지 않고도 공통된 메서드로 상태를 변경 시킬 수 있었다. 만약 상태를 먼저 설계 했다면 그 상태를 변경 하기 위한 행동들이 나타날 것이고 그 경우 인터페이스에 모든 메서드가 그대로 노출 되어 깔끔하지 못한 캡슐화가 나타날 것이다.
객체간 협력이 아닌 전지전능한 객체 생성
상태를 스스로 변경 시키려 할 것이며 객체는 그러한 이유로 다른 객체의 도움 없이 스스로 모든 행동을 만들어 낼 것이다. 그렇다면 객체 내부에서 엄청난 과부하가 생기게 될 것이다.
객체의 재사용성 저하
상태에 중점이 된 객체는 오로지 그 상태를 해결 하기 위해 생성된 객체나 다름 없다. 그렇기 때문에 다른 객체와의 협력이 없을테고 다른 패키지에서 해당 객체를 불러올 이유가 사라진다. 그 객체는 전지전능한 신이기 때문이다.
가장 중요한 덕목은 상태가 아니라 행동에 초점을 맞추는 것이다. 즉, 행동이 상태를 결정한다.
[ 은유와 객체 ]
누누히 말했듯, 객체지향 세계는 현실 세계의 "단순한" 모방이 아니다. 이 내용을 뒷받침 하는 근거를 살펴보자.
의인화: 현실 속 수동적인 존재가 소프트웨어의 객체에선 능동적으로 변한다
20세 남성 A가 월급 급여를 받아 계좌 정보를 조회 하고자한다고 가정해보자.
계좌 객체에서 급여 내역을 확인 할 수 있도록 메서드를 제공 하는데, 이 메서드는 사람에 의해, 어떠한 은행이며, 어떠한 방식으로 등 아무런 행동의 구체화 없이 "계좌 조회" 라는 메서드로 데이터를 제공 할 것이다.
이렇게 눈에 보이지 않는 공기나 바람도 소프트웨어 객체의 세계에서는 시각적인 형태를 갖도록 만들 수 있는데, 이 것이 결국 현실의 모습을 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 만드는 것 이다.
은유
현실에서 전화기라는 개념을 이용해 소프트웨어 객체를 묘사 한다면 "전화기" 객체에 바로 전화를 걸 수 있도록 "전화 걸기" 메서드가 등장 하여 인간은 이 전화기 객체는 전화를 걸 수 있다는 사실을 쉽게 이해 하고 기억 할 수 있다.
소프트웨어 객체에 대한 현실 세계의 은유를 효과적으로 사용하면 이해하기 쉽고 유지보수가 용이한 객체 세계를 만들어낼 수 있다.
Last updated