[오브젝트] 3일차

da__ell·2023년 8월 2일
0

독서 - 오브젝트

목록 보기
3/25
post-thumbnail

설계 개선하기

소극장은 관람객과 티켓을 판매하는 과정을 알필요가 없다.

따라서 관람객이 스스로 가방안의 현금과 초대장을 처리하고, 판매원이 스스로 매표소의 티켓과 판매요금을 다루게 하면 문제를 해결할 수 있다.

→ 자율적인 존재로 만든다.

캡슐화를 통해 객체간의 결합도를 낮춘다.

캡슐화 : 개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것. 캡슐화를 통해 객체 내부로의 접근을 제한함으로써 객체 간의 결합도를 낮춤 → 변경하기 쉬운 객체가 된다.

객체를 인터페이스와 구현으로 나누고 인터페이스만을 의존하도록 설계하고 내부 구현을 캡슐화를 진행하면 구현체의 구현이 수정되더라도, 의존하는 것은 인터페이스이기 때문에 다른 클래스에 영향을 미치지 않게된다.

이렇듯 캡슐화 개선을 통해 객체들의 내부구현을 외부에 노출하지 않고 자신의 문제를 스스로 책임지고 해결하게 함으로써 자율적인 존재로 구현할 수 있다.

위와 같이 객체 사이의 결합도를 낮추고 변경하기 쉬운 코드를 작성하기 위해 따라야 하는 가장 기본적인 설계 원칙이다.

→ 캡슐화를 통해 결합도를 낮춘 코드는 내부 구현이 변경되더라도 다른 클래스에 영향을 미치지 않게 된다는 점에서 변경이 용이하고, 객체들이 자신의 문제를 스스로 해결하고 있다는 점에서 코드에 대한 이해가 쉬워진다. / 로버트 마틴의 소프트웨어 모듈의 기능 충족

캡슐화와 응집도

객체 내부의 상태를 캡슐화하고 객체간에 오직 메시지를 통해서만 상호작용하도록 만드는 것이다. 각 객체는 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임시키는 것을 응딥도가 높다.

이렇게 캡슐화를 통해 자신의 데이터를 스스로 처리하는 자율적인 객체를 만듦으로써 외부의 간섭을 최대한 배제하고 메시지를 통해 소통하는 응집도 높은 객체들의 공동체로 이루어진 설계가 훌륭한 객체시향 설계이다.

절차지향과 객체 지향

모든 처리가 하나의 클래스(프로세스) 안에 위치하고 나머지 클래스는 데이터의 역할을 수행하는 것은 절차적 방식 프로그래밍의 전형. 절차적 프로그래밍은 프로세스와 데이터를 별도의 모듈에 위치시키는 방식이다.

절차적 프로그래밍에서는 프로세스가 모든 처리를 진행하고 데이터 객체는 수동적인 존재이다. 그렇기 때문에 코드에 대한 이해가 원활하지 못한 문제를 가진다. 또한 데이터의 변경으로 인한 영향이 다른 클래스에 미친다. 데이터의 변화는 프로세스에 영향을 미치기 때문에 데이터 클래스 내부구현의 변화는 프로세스 클래스의 구현의 변경까지 이뤄지도록 한다. → 변경의 어려움

객체지향 프로그래밍에서는 데이터를 사용하는 프로세스가 데이터를 소유하는 클래스 내부에 위치한다. → 데이터와 프로세스가 동일한 모듈 내부에 위치
캡슐화를 통해 의존성을 적절히 관리함으로써 객체 간의 결합도를 낮춤으로써 객체 내부의 변경이 객체 외부에 영향을 미치지 않도록 제어할 수 있고 이는 변경의 용이함으로 이어진다.

책임의 이동

절차지향과 객체지향 프로그래밍의 근본적 차이는 책임의 이동이다. 객체지향 관점에서 책임은 곧 기능으로 이해할 수 있다.

절차지향 설게에서는 기능에 대한 제어 흐름이 하나의 객체에 집중되어 있다.

객체지향 설계에서는 기능에 대한 제어 흐름이 각 각체에 적절하게 분산되어 있다. → 하나의 기능을 완성하는 책임이 여러 객체에 분산.

이렇게 하나의 객체에 몰려있는 책임이 여러 개별 객체로 이동하는 것이 책임의 이동이다.

책임이 이동하면서 각 객체는 적절하게 분배된 책임을 수행한다. 객체지향 어플리케이션은 이렇게 각 책임을 스스로 수행하는 자율적 객체들의 공동체의 구성이라고 할 수 있다.

정리

객체지향 설계는 불필요한 의존성을 제거하여 객체 사이의 결합도를 낮추는 것이다. 책에서는 각 객체를 캡슐화하여 불필요한 세부사항을 숨김으로써 객체의 자율성과 응집도를 높이고 객체간의 결합도를 낮추는 것이 훌륭한 객체지향 설계라고 이야기한다.

하지만 객체의 자율성을 높이는 것이 전체 설계의 관점에서는 결합도가 상승하는 경우도 존재한다. 반대로 결합도를 높이는 것이 오히려 객체의 자율성을 높이는 설계가 존재하기도 한다. 이렇듯 설계의 방법은 여러가지가 존재할 수 있고, 결국 각 방법은 트레이드오프를 가진다.

훌륭한 객체지향 설계란 소프트웨어를 구성하는 모든 객체들이 자율적으로 행동하는 것이다. 실제 현실에서는 수동적인 존재라더라도, 객체들은 객체지향 프로그래밍 체계에서는 능동적이고 자율적인 존재로 인식하는 것이 필요하다.

profile
daelkdev@gmail.com

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기