2장. 이상한 나라의 객체

객체지향 패러다임은 지식을 추상화 하고 추상화한 지식을 객체 안에 캠슐화 함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다. 객체를 발견하고 창조하는 것은 지식과 행동을 구조화 하는 문제다. - 레베카 워프스브룩

객체지향은 인간의 기본적인 인지 능력에 기반을 두고 이해를 돕기 때문에 현실 세계를 참조 하고 있는 것이다.

[ 객체지향과 인지 능력 ]

소프트웨어 세계는 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음으로 출발한다.

  • 인간의 인지 능력은 물리적인 것 뿐 아니라 추상적인 사물 까지도 객체로 인식 할 수 있는 능력이 있다.

  • "주문"과 "계좌 이체" 는 비록 물리적인 실체가 아니지만 인간은 하나의 객체로 분류 하여 다룰 수 있다.

💡 객체지향 패러다임의 목적은 현실 세계를 모방 하는 것이 아닌 이해 할 수 있는 정보들로 소프트웨어 세계를 재 탄생 시키는 것이다. 인간은 추상화 된 개념을 인지 할 때 현실 세계에 있는 내용을 참조 하여 이해하려 할 것이다.

정리 하기

객체 지향은 인간이 사고 하기 쉽게 현재 놓인 상황과 대입하여 새로운 세계를 만들어 낸다.

  • 수행 해야 하는 "절차"를 제외한 행동과 상태가 전부인 객체들을 만들기 때문이다.

[ 객체, 그리고 이상한 나라 ]

"이상한 나라의 엘리스" 의 내용 중

엘리스는 아름다운 정원을 들어가기 위해 음료를 마시거나, 부채질을 하거나 여러가지 행동으로 자신의 몸집을 줄였다 키웠다 하여 문 크기에 몸집을 맞춰 통과 한다.

스스로 설계 해 보는 엘리스 객체
public class Alice {
    
    private int height = 130;
    private Place place; 
    
    public void heightUpByAction(Action action) {
        height += action.do().getStat()
    }
    
    public void heightDownByAction(Action action) {
        height += action.do().getStat()
    }
    
    public void openDoor(Garden garden) {
        place = garden.open()
    }
}

객체 특징 정리하기

  • 객체는 상태를 가지며 변경이 가능하다.

  • 상태를 변경 시키는 것은 객체가 외부 에서 사용 할 수 있도록 허용한 행동이다.

  • 객체는 시간의 흐름에 따라 변하더라도 유일하게 식별이 가능한 객체이다.

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

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

상태

"상태는 왜 필요한가?"

상태를 이용 하면 과거의 모든 행동 이력들을 기억 하지 않더라도 자율적인 행동을 만들어 낼 수 있다.

만약, 엘리스가 키를 줄이기 위해 음료를 마시거나 부채질을 하거나 버섯을 먹었거나 등 여러가지 행동을 한 뒤 키가 작아진다면 우리는 "음료", "부채질", "버섯"을 바탕으로 세 가지 행동으로 상태를 변경 시킬 수 있다.

하지만, "키를 줄이는 행동을 했는가?" 라고 상태를 저장한 뒤 그 행동을 했다면 상태를 변경 하는 방식으로 접근 하여 복잡성을 줄이고 인지 과부하(키를 줄이기 위한 과거 행동 이력)을 줄이는데 중요한 개념이다.

행동

"객체의 상태는 스스로 변하지 않는다.

엘리스의 세계로 다시 돌아가보자. 엘리스는 음료를 마시거나, 부채질 등 다양한 행동을 통해 자신의 키를 줄이거나 키울 수 있었다. 여기서 "키"는 중요한 엘리스의 상태 정보이다.

그렇다면 엘리스는 무언가 행동을 한 뒤 "키"가 변할 수 있는 것이다. 이렇게, 상태를 이용하면 복잡한 객체의 행동을 쉽게 이해 할 수 있다.

그러나, 객체지향 세계에서는 자신의 상태를 스스로 관리하는 존재이며 엘리스의 키를 작게 만드는 것이 엘리스 자신인 것 처럼 다른 객체가 직접적으로 다른 객체의 상태를 변경 할 수 없고 메시지를 보내 객체가 상태를 변하도록 만들어야 한다.

객체간 협력 규칙

  1. 다른 객체와 협력하는 유일한 방법은 객체에게 요청을 보내는 것이다.

  2. 직접적으로 다른 객체에게 접근 하는 것이 아닌 메시지를 보내 의사소통 할 수 있다.

식별자

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

식별자를 가진 객체(Entity)

동명이인인 앨리스가 있고, 이 둘은 키도 같고 이름도 같다. 과연 이 두 앨리스를 같은 사람이라고 볼 수 있을까?

이처럼 상태는 완전히 같지만 식별자가 다른 경우는 다른 객체라고 인식 할 수 있다. 이렇게 식별자를 기반으로 같은지를 판단하는 성질인 동일성을 이용한다.

식별자를 가지지 않는 객체(Value)

숫자 1이라는 글씨 2 개가 종이 위에 있을 때 모든 사람이 두 숫자는 동일 하다고 인식 하며 그 결과를 의심하지 않는다. 이렇게 상태가 같은지 판단 하는 성질인 동등성을 이용한다.

정리 하기

상태 객체지향의 세계에서 객체는 다른 객체의 상태에 직접적으로 접근 하거나 변경 시킬 수 없으며 객체 스스로 자신의 상태를 책임져야 한다.

행동 객체의 상태는 스스로 변하지 않는다. 그렇기 때문에 객체에게 메시지를 보내 객체의 상태가 변하도록 만들어야 한다.

식별자 객체는 시간에 따라 변경 되는 상태를 포함 하고, 행동을 통해 상태가 변한다. 값은 "숫자", "문자열" 등 변하지 않는 불변 상태를 갖는다.

[ 기계로서의 객체 ]

엘리스 객체를 기계로 표현 한다면 위와 같은 이미지의 형태를 띌 것이다.

위 이미지를 객체로 의인화 하며 생각 해보자. 객체가 갖고 있는 행동을 취하려면 기계가 나타내고 있는 버튼을 누르면 된다. 그 어떠한 이유로든 이 기계를 분해 하여 내부를 살피지 않을 것이다.

💡 즉, 사용자는 객체가 제공하는 명령 버튼과 쿼리 버튼으로 구성된 인터페이스를 통해서만 객체에 접근 할 수 있다. 이 것은 객체의 캡슐화를 강조하는 조건이다.

[ 은유와 객체 ]

누누히 말했듯, 객체지향 세계는 현실 세계의 "단순한" 모방이 아니다. 이 내용을 뒷받침 하는 근거를 살펴보자.

의인화: 현실 속 수동적인 존재가 소프트웨어의 객체에선 능동적으로 변한다

20세 남성 A가 월급 급여를 받아 계좌 정보를 조회 하고자한다고 가정해보자.

  • 계좌 객체에서 급여 내역을 확인 할 수 있도록 메서드를 제공 하는데, 이 메서드는 사람에 의해, 어떠한 은행이며, 어떠한 방식으로 등 아무런 행동의 구체화 없이 "계좌 조회" 라는 메서드로 데이터를 제공 할 것이다.

이렇게 눈에 보이지 않는 공기나 바람도 소프트웨어 객체의 세계에서는 시각적인 형태를 갖도록 만들 수 있는데, 이 것이 결국 현실의 모습을 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 만드는 것 이다.

은유

현실에서 전화기라는 개념을 이용해 소프트웨어 객체를 묘사 한다면 "전화기" 객체에 바로 전화를 걸 수 있도록 "전화 걸기" 메서드가 등장 하여 인간은 이 전화기 객체는 전화를 걸 수 있다는 사실을 쉽게 이해 하고 기억 할 수 있다.

소프트웨어 객체에 대한 현실 세계의 은유를 효과적으로 사용하면 이해하기 쉽고 유지보수가 용이한 객체 세계를 만들어낼 수 있다.

이상한 나라를 창조하라

  • 현실을 모방 하는 것이 아니다.

  • 객체의 특성을 쉽게 이해할 수 있도록 현실 세계를 이용 하여 묘사하라.

  • 그렇지 않다면 새로운 세계를 창조하라.

  • 현실과 똑같아야 한다는 어떠한 제약이나 구속도 없다.

Last updated