책 「오브젝트」 1장 객체, 설계를 읽고 작성한 내용입니다.
객체지향은 뭘까?
처음 프로그래밍을 시작했을 때, C언어를 통해 절차지향적 접근을 배웠다.
이후 C++를 학습하면서 객체지향적인 개념을 습득하고, 객체지향 프로그래밍이 무엇인지에 대한 감을 익힐 수 있었다.
하지만 실제로 객체지향적인 코드를 설계하고 작성하는 것은 훨씬 어려웠다.
이 책의 목적은 객체지향 패러다임이 제시하는 프로그래밍 패러다임을 설명하는 것이다.
가능하면 개발자인 우리가 가장 잘 이해할 수 있고 가장 능숙하게 다룰 수 있는 코드를 이용해 객체지향의 다양한 측면을 설명하려고 노력할 것이다.
이 책을 통해 객체지향 패러다임에 대해 이해할 수 있을 것 같아 기대가 된다.
코드를 통해 이해할 수 있다는 점이 가장 마음에 들었다.
이 책을 완독한 후에는 객체지향에 대한 이해도가 향상되었으면 좋겠다.
설계가 왜 필요한가
개발자는 구체적인 코드를 만지며 손을 더럽힐 때 가장 많은 것을 얻어가는 존재다.
설계란 코드를 배치하는 것이다[Metz12].
설계를 구현과 떨어트려서 이야기하는 것은 불가능하다. 설계는 코드를 작성하는 매 순간 코드를 어떻게 배치할 것인지를 결정하는 과정에서 나온다. 설계는 코드 작성의 일부이며 코드를 작성하지 않고서는 검증할 수 없다.
우리는 오늘 완성해야 하는 기능을 구현하는 코드를 짜야하는 동시에 내일 쉽게 변경할 수 있는 코드를 짜야한다[Metz12].
좋은 설계란 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다.
설계는 왜 필요할까? 설계의 중요성에 대해 처음에는 와닿지 않았다. 설계 없이도 기본적인 기능 구현이 가능하다.
그러나 이런 방식으로 개발을 진행하다 보면, 코드가 복잡하게 꼬여 스파게티 코드가 되는 경우가 많다.
요구사항은 항상 변경된다.
요구사항은 항상 변경된다. 따라서 오늘 완벽한 설계를 해냈다고 하더라도, 내일 코드가 수정될 수 있다.
직접 개발할 때도 이러한 상황을 경험했다. 스파게티 코드에 변경 사항을 적용하려다 보면, 코드가 더욱 복잡해지고, 심지어는 작성자인 나조차도 이해하기 어려운 코드가 되곤 했다. 또한, 설계를 완벽히 하려다 보니, 실제 구현에는 손을 대지 못하고 힘들어하는 경우도 있었다. 코드 수정이 불편하다 보니, 설계를 최대한 완벽하게 하려는 경향이 있었던 것 같다. 이 책에서도 비슷한 이유를 언급했다.
하지만 생각하지 못했던 경우의 수가 생기고, 코드의 로직이 변경되어야 하는 상황이 불가피하게 발생했다. 완벽하게 모든 기능을 알고 구현하는 것은 불가능하기 때문에, 변경은 필연적으로 발생하게 되는 것 같다.
그래서 최대한 변경에 유연하게 대응할 수 있는 코드를 작성하기 위해 노력해야 하고, 따라서 변경에 용이한 설계가 필요하다.
객체지향 설계가 변경에 유연하게 대응하도록 가능성을 높여줄 수 있다.
객체지향 프로그래밍은 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공함으로써 요구사항 변경에 좀 더 수월하게 대응할 수 있는 가능성을 높여준다.
객체지향의 세계에서 애플리케이션은 객체들로 구성되며 애플리케이션의 기능은 객체들 간의 상호작용을 통해 구현된다.
애플리케이션의 기능을 구현하기 위해 객체들이 협력하는 과정 속에서 객체들은 다른 객체에 의존하게 된다. 메시지를 전송하기 위한 이런 지식이 두 객체를 결합시키고 이 결합이 객체 사이의 의존성을 만든다.
의존성은 변경에 대한 영향을 암시한다. 의존성이라는 말 속에는 어떤 객체가 변경될 때 그 객체에게 의존하는 다른 객체도 함께 변경될 수 있다는 사실이 내포돼 있다.
애플리케이션의 기능은 객체들 간의 상호작용을 통해 구현된다. 이 과정에서 객체 사이의 의존성(dependency)은 당연히 생길 수 밖에 없다. 이 객체들 사이의 의존성을 적절히 조절함으로써 변경에 용이한 설계로 만들어가나는 과정이 필요하다.
그렇다고 해서 객체 사이의 의존성을 완전히 없애는 것이 정답이 아니다.
애플리케이션의 기능을 구현하는 데 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거하는 것이다.
협력하는 객체들 사이의 의존성을 적절하게 조절함으로써 변경에 용이한 설계를 만드는 것이다.
객체를 자율적인 존재로 만들자!
훌륭한 객체지향 설계란 소프트웨어를 구성하는 모든 객체들이 자율적으로 행동하는 설계를 가리킨다.
각 객체는 자신을 스스로 책임진다.
설계를 어렵게 만드는 것은 의존성이다. 의존성이 높으면 결합도가 높고 변경이 어렵다.
불필요한 의존성을 제거하기 위한 방법으로 캡슐화가 있다.
개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것은 캡슐화(encapsulation)라고 부른다.
캡슐화를 통해 객체 내부로의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있게 된다.
핵심은 객체 내부의 상태를 캡슐화하고 객체 간에 오직 메시지를 통해서만 상호작용하도록 만드는 것이다.
밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에 위임하는 객체를 가리켜 응집도(cohesion)가 높다고 말한다.
자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면 결합도를 낮출 수 있을 뿐더러 응집도를 높일 수 있다.
요약해보자면
- 요구사항은 변경되기 때문에 변경에 용이한 설계를 해야한다. 객체지향 설계가 이를 도와줄 수 있다.
- 객체들 사이의 의존성을 적절히 조절함으로써 변경에 용이한 설계를 만들어야 한다.
- 불필요한 의존성을 제거하고 객체를 자율적으로 행동하도록 만들어 결합도를 낮추고 응집도를 높이자.
'study > CS' 카테고리의 다른 글
[CS/책] 「오브젝트」6장 - 메시지와 인터페이스 (0) | 2024.04.10 |
---|---|
[CS/책] 「오브젝트」5장 - 책임 할당하기 (0) | 2024.03.26 |
[CS/책] 「오브젝트」4장 - 설계 품질과 트레이드오프 (0) | 2024.03.21 |
[CS/책] 「오브젝트」3장 - 역할, 책임, 협력 (0) | 2024.03.10 |
[CS/책] 「오브젝트」2장 - 객체지향 프로그래밍 (0) | 2024.03.03 |