객체의 책임 수행
객체지향 설계를 통해 각 객체에 책임을 할당하는 것까지 살펴보았다. 이제는 객체에 할당된 책임을 수행하기 위해 필요한 것을 살펴볼 차례다. 앞서 객체의 책임을 '객체가 수행해야 할 행동'이라고 정의하였고, 이러한 행동은 다른 객체로부터 요청 메시지를 받아서 수행된다고 했다.
메시지와 메소드
객체는 요청 메시지를 받아서 책임을 수행하는데, 이 때 객체 내부에 모든 정보가 있다면 자체적으로 해결할 수 있지만 그렇지 않은 경우도 존재한다. 이러한 경우, 다른 객체에 요청할 수도 있지만, 메시지와 함께 필요한 정보를 받을 수도 있다. 이렇게 추가적으로 필요한 정보를 인자(argument)라고 하며, 메시지는 메시지 이름과 인자들의 결합으로 구성된다. 예를 들어, 계좌이체를 하는 경우, 내 계좌에 다음과 같은 메시지를 보낼 수 있을 것이다.
송금하라(비밀번호, 계좌번호, 금액)
메시지를 정의할 때는 대상 객체가 책임을 '어떻게' 수행할지가 아니라 '무엇을' 해야하는지를 정의해야한다. 예를 들어, 어떤 사람 객체가 있을 때, '부산에 가라'라는 메시지는 '무엇을' 수행해야 하는지를 정의하는 메시지다. 반면, '버스를 타고 부산에 가라'라는 메시지는 객체가 '어떻게' 책임을 수행해야 하는지를 정의하고 있다. 따라서 메시지를 받은 객체는 부산에 가는 방법을 자율적으로 선택하지 못하는 종속적인 객체가 될 것이다. 이러한 경우에 'KTX를 타고 가라'는 요구사항이 추가된다고 하면, 메시지를 보내는 모든 객체가 수정되어야 하는 문제가 발생한다.
요청 메시지를 받은 객체는 내부적으로 책임을 '어떻게' 수행할지 결정해서 적절한 메소드를 실행한다. 메소드는 책임을 수행하기 위한 구체적인 절차를 코드로 구현한 것이다. 객체는 자율적인 존재이므로 실행할 메소드를 런타임에 결정한다는 것이 객체지향 언어의 특징이다. 이 말은 같은 메시지를 받더라도 서로 다른 결과를 응답받을 수 있다는 뜻이다. 이것이 객체지향의 핵심 개념인 '다형성'이다.
다형성 덕분에 요청 메시지를 보내는 객체는 받는 객체가 무엇인지 알 필요가 없다. 단지 필요한 행동을 할 수 있는 객체가 있으면 요청을 보내고 결과를 받을 뿐이다. 이러한 특징 덕분에 유연한 협력 관계가 가능해진다. 또한, 해당 메시지를 받아서 책임을 수행할 수 있다면 새로운 객체를 추가하는 것이 가능하다. 이것은 시스템의 확장 가능성을 보장해준다. 마지막으로 각 객체는 독립적이고 자율적으로 행동하기 때문에 책임을 수행하는 객체가 바뀌더라도 다른 객체에는 영향을 미치지 않는다. 이것은 코드를 재사용 할 수 있다는 것을 의미한다.
인터페이스
위에서 살펴본 것을 종합하면, 결국 중요한 것은 메시지이다. 같은 메시지를 처리할 수 있는 여러 객체들은 하나의 그룹으로 묶어서 관리할 수 있고, 이것을 인터페이스라고 한다. 인터페이스는 객체지향 뿐만 아니라 두 영역의 경계에서 상호작용할 수 있도록 이어주는 곳에서 일상적으로 사용되는 용어이다. 객체지향에서는 위에서 살펴본 것처럼 메시지를 보내는 객체와 받는 객체가 상호작용할 수 있도록 이어주는 역할을 한다.
인터페이스를 사용하면 위에서 살펴본 것처럼 재사용성과 확장성을 극대화할 수 있다. 또한, 인터페이스로 정의된 메시지를 보는 것 만으로도 객체가 수행하는 역할을 쉽게 파악할 수 있다는 것도 장점이다. 예를 들어, 기름을 넣을 수 있고 운전할 수 있는 인터페이스가 있다면 그것은 자동차를 나타내기 위한 인터페이스일 것이다. 자동차 인터페이스를 구현한 객체가 현대, 테슬라, 벤츠 등으로 바뀌어도 인터페이스는 변하지 않을 것이다.
인터페이스를 정의할 때는 가능한 추상적인 메소드를 사용해야한다. 이것은 '어떻게'가 아니라 '무엇을' 해야하는지를 정의하는 것으로 충분하다. 예를 들어, 자동차 인터페이스에서 '열쇠를 돌려서 시동을 걸어라'라고 메소드를 정의하면 버튼을 눌러서 시동을 거는 자동차는 사용할 수 없다. 따라서 '시동을 걸어라'와 같이 추상적인 메소드를 사용해야 재사용성이 높아진다. 또한, 하나의 인터페이스는 최소한의 메소드를 포함해야한다. 요청을 보내는 객체는 받는 객체가 메소드를 구현하고 있는지 알 수가 없다. 따라서 인터페이스를 구현하는 객체들은 구현하지 않을 메소드를 포함하지 않도록 인터페이스를 최소한으로 나누는 것이 중요하다. 이것을 인터페이스 분리 원칙이라고도 한다.
3줄 요약
- 객체가 가지는 책임이란 어떤 메시지를 처리할 수 있는가를 말한다
- 같은 메시지를 여러 객체가 다른 방식으로 처리할 수 있는데, 이것을 다형성이라고 한다
- 같은 메시지를 처리하는 객체들을 인터페이스로 묶어서 관리할 수 있다
'Programming > 객체지향의 사실과 오해' 카테고리의 다른 글
[Programming] 객체지향의 사실과 오해(6) - 기능과 구조 (0) | 2023.05.30 |
---|---|
[Programming] 객체지향의 사실과 오해(4) - 객체지향 설계 기법 (0) | 2023.05.21 |
[Programming] 객체지향의 사실과 오해(3) - 추상화 (0) | 2023.05.18 |
[Programming] 객체지향의 사실과 오해(2) - 객체의 구성요소 (0) | 2023.05.11 |
[Programming] 객체지향의 사실과 오해(1) - 객체지향 (0) | 2023.05.07 |