객체지향 패러다임 관점에서 핵심은 역할, 책임, 협력이다.

어플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 협력이라 한다. 협력에 참여하기 위해 수행하는 로직은 책임이다. 객체들이 협력안에서 수행하는 책임들이 모여 객체가 수행하는 역할을 구성한다.

협력

자동차 게임에서 자동차는 지정한 숫자보다 크면 앞으로 전진하고 작으면 멈추는 간단한 프로그램을 개발해보자. 그럼 다음과 같이 구현할 수 있다.

public class Car {
    private int position;

    public Car(int position) {
        this.position = position;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }
}
public class RacingGame {
    private Car car;

    public RacingGame(Car car) {
        this.car = car;
    }

    public void race(int number) {
        int position = car.getPosition();
        if (number > 4) {
            car.setPosition(position++);
        }
    }
}

위와 같은 코드에서 Car는 자율성이 훼손되었다. 자율적인 객체란 자신의 상태를 직접 관리하고 스스로의 결정에 따라 행동하는 객체이다. 객체의 자율성을 보장하기 위해서는 필요한 정보와 정보에 기반한 행동을 같은 객체 안에 모아놓아야 한다. Car는 자율적인 존재가 아니라 수동적인 존재가 되었다.

Car가 자율적인 존재가 되려면 자신의 정보를 스스로 변경할 줄 알아야 한다. Car에게 움직이도록 위임을 하게 되면 협력에 참여하는 객체들의 전체적인 자율성을 향상시킬 수 있다. 객체를 자율적으로 만드는 가장 기본적인 방법이 캡슐화다. 캡슐화가 되어있으면 수정에 용이하므로 자율적인 객체는 변경하기도 쉬워진다. 현재 RacingGame이 Car의 내부 구현에 직접 접근하는 것은 캡슐화를 위반한다. Car에 변경이 일어나면 RacingGame에도 영향을 줄 가능성이 높다. Car가 스스로 움직이도록 구현하면 결합도를 느슨하게 유지하여 변경이 일어나도 RacingGame에 큰 영향을 미치지 않는다. 그럼 Car가 자율적인 객체가 되도록 변경해보자.

public class Car {
    private int position;

    public Car(int position) {
        this.position = position;
    }
    
    public void move(int number) {
        if (number > 4) {
            position++;
        }
    }
}
public class RacingGame {
    private Car car;

    public RacingGame(Car car) {
        this.car = car;
    }

    public void race(int number) {
        car.move(number);
    }
}

이제 Car는 자신의 상태를 스스로 변경할 수 있고 자율적인 객체가 되었다. 객체지향 시스템은 자율적인 객체들의 공동체다. 협력은 객체지향에서 기능을 구현할 수 있는 유일한 방법이다. 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단은 메시지 전송이다. 객체는 다른 객체의 내부 구현에 직접 접근할 수 없기 때문에 오직 메시지를 통해서만 자신의 요청을 전달할 수 있다.

무제.drawio (1).png

이제 RacingGame이 메시지를 전송해서 Car와 협력하게 되었다. 메시지를 수신한 객체는 메서드를 실행하여 요청에 응답한다. 외부의 객체는 메시지만 전송할 수 있으며 어떻게 처리할지는 메시지를 수신한 객체가 직접 결정한다. move라는 메시지를 보냈고 Car는 메시지를 수신하여 움직임을 스스로 결정한다.

협력이 설계를 위한 문맥을 결정한다.

객체는 상태와 행동을 함께 캡슐화하는 실행 단위이다. 객체가 가지는 상태와 행동은 어떤 기준으로 결정하는지 알아보자. 어플리케이션에 어떤 객체가 필요하다면 그 이유는 단 하나여야한다. 그 객체가 어떤 협력에 참여하고 있고, 객체가 협력에 참여할 수 있는 이유는 협력에 필요한 적절한 행동을 가지고 있기 때문이다.

협력은 객체의 행동을 결정한다. 협력이 바뀌면 행동도 바뀌어야한다. 협력은 객체가 필요한 이유와 객체가 수행하는 행동의 동기를 제공한다.