본문 바로가기
객체지향

오브젝트 - 객체, 설계

by Heesu.lee 2021. 4. 14.

로버트 마틴 - <클린 소프트웨어: 애자일 원칙과 패턴, 그리고 실천 방법>

모든 소프트웨어 모듈에는 세가지 목적이 존재
1. 실행 중에 제대로 동작하는 것 - 모든 모듈의 존재 이유
2. 변경을 위해 존재하는 것 - 간단한 작업만으로도 모듈은 변경이 가능해야 한다.
3. 코드를 읽는 사람과 의사소통하는 것 - 개발자가 쉽게 읽고 이해할 수 있어야 한다.

즉, 모든 모듈은 제대로 실행되야 하고, 변경이 용이해야 하며, 이해하기 쉬어야 한다.

 

변경에 취약한 코드

변경에 취약한 대부분의 코드는 객체 사이의 의존성과 관련된 문제

어떤 객체가 변경될 때 그 객체에게 의존하는 다른 객체도 함께 변경될 수 있다는 사실이 내포돼 있다.

객체지향 설계는 서로 의존하면서 협력하는 객체들의 공동체를 구축하는 것
따라서, 우리의 목표는 애플리케이션의 기능을 구현하는 데 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거하는 것

 

객체 사이의 의존성이 과한 경우를 가리켜 결합도가 높다고 말함,

반대로 합리적인 의존성만 존재하는 경우 결합도가 낮다고 말함

 

결합도는 곧 의존성과 연관되며 이는 변경 가능성과도 밀접하다.

따라서 설계의 목표는 객체 사이의 결합도를 낮춰 변경이 용이한 설계를 만드는 것이야 한다.

 

자율성을 높이자

캡슐화

자신의 역할, 책임을 제외한 나머지는 외부로부터 숨기자

개념적이나 물리적으로 내우븽 세부적인 사항을 감추는 것을 캡슐화라고 한다.

 

캡슐화의 목적은 변경하기 쉬운 객체를 만드는 것

캡슐화를 통해 객체 내부로의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있다.

 

외부에서는 오로지 필요한 다른 객체의 인터페이스만 의존한다.

어떤 필드와 인스턴스를 가지고 있는지 등 이는 구현의 영역에 속한다.

객체를 인터페이스와 구현으로 나누고 인터페이스만을 공개하는 것은 객체 사이의 결합도를 낮추고 변경하기 쉬운 코드를 작성하기 위해 따라야 하는 가장 기본적인 설계 원칙

 

캡슐화와 응집도

밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도가 높다고 말한다.

자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면,
결합도를 낮출 수 있을뿐더러 응집도를 높일 수 있다.

 

객체의 응집도를 높이기 위해서는 겍체 스스로 자신의 데이터를 책임져야 한다.

즉, 객체는 자신의 데이터를 스스로 처리하는 자율적인 존재여야 한다. 이것이 바로 응집도를 높이는 첫 걸음이다.

외부의 간섭을 최대한 배제하고 메시지를 통해서만 협력하는 자율적인 객체들의 공동체를 만드는 것
이것이 바로 훌륭한 객체지향 설계를 얻을 수 있는 지름길

 

절차지향과 객체지향

프로세스데이터를 별도의 모듈에 위치시키는 방식을 절차적 프로그래밍이라 일컫는다.

특정 기능 혹은 로직을 수행하는 절차를 구현한 것들을 프로세스라 부르며,

해당 로직 수행에 필요한 정보를 제공하는 것들을 데이터를 의미한다.

 

이와 반대로 데이터프로세스동일한 모듈 내부에 위치하도록 프로그래밍하는 방식을 객체지향 프로그래밍이라 부른다.

 

훌륭한 객체지향 설계의 핵심은 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮추는 것

객체지향 코든느 자신의 문제를 스스로 처리해야 한다는 우리의 예상을 만족시켜주기 때문에 이해하기 쉽고,
객체 내부의 변경이 객체 외부에 파급되지 않도록 제어할 수 있기 때문에 변경하기가 수월하다.

 

책임의 이동

절차지향과 객체지향 사이에 근본적인 차리를 만드는 것은 책임의 이동이다.

※ 책임을 기능을 가리키는 객체지향 세계의 용어로 생각해도 무방하다.

 

객체지향 설계에서는 독재자(모든 책임을 가진)가 존재하지 않고 각 객체에 책임이 적절하게 분배된다.

따라서 객체는 자신을 스스로 책임진다. 

 

여기서 나아가 더 중요한 점은 적절한 객체에 적절한 책임을 할당하는 것이다.

이는 변경에 탄력적으로 대응할 수 있는 견고한 설계를 얻을 수 있게 한다.

 

적절한 객체에 적절한 책임 (기능) 을 할당함으로써 필요한 인터페이스만 제공하고 (캡슐화)

이를 통해 의존성과 결합도를 낮춰 (최소한의 의존성 ∙ 결합도) 객체의 자율성과 응집도를 높이자 (높은 자율성 ∙ 응집도

이는 훌륭한 객체지향 설계의 첫걸음이다.

 

참고

  • 해당 게시글은 조영호님의 "오브젝트" 책을 정리한 글 입니다.
  • 보다 자세한 내용을 책을 구매하시길 권장합니다.

'객체지향' 카테고리의 다른 글

오브젝트 - 역할, 책임, 협력  (0) 2021.04.24
오브젝트 - 객체지향 프로그래밍  (0) 2021.04.22
객체 지향 설계의 5가지 원칙  (0) 2020.11.04

댓글