1장. 객체, 설계
1장. 객체, 설계
❐ 0. 개요
🌀 0-1. 들어가기 앞서
이론 vs 실무
- 소프트웨어 설계와 유지보수에 중점을 두려면 이론이 아닌 실무에 초점을 마추는 것이 효과적
- 추상적인 개념과 이론은 훌륭한 코드를 작성하는 데 필요한 도구일 뿐
❐ 1. 티켓 판매 애플리케이션 구현하기
🌀 1-1. 요구사항
- 이벤트에 당첨된 관람객과 그렇지 못한 관람객을 구분해야 한다.
- 이벤트에 당첨된 관람객 : 초대장을 티켓으로 교환해야 입장할 수 있다.
- 이벤트에 당첨되지 않은 관람객 : 티켓을 구매하고 입장할 수 있다.
🌀 1-2. V1 구현
❐ 2. 무엇이 문제인가
🌀 2-1. 예상을 빗나가는 코드
위 코드의 문제점
- 관람객과 판매원이 소극장의 통제를 받는 수동적인 존재라는 점
- 소극장에서 관람객의 가방을 뒤저서 티켓 및 초대장 여부를 확인함.
- 즉, 이해 불가능한 코드다.
- 이해 가능한 코드란, 그 동작이 우리의 예상에서 크게 벗어나지 않는 코드
- 이 코드를 이해하기 위해서는 아래의 세부적인 내용을 한꺼번에 알아야 한다.
- Theater의
enter메소드를 이해하기 위해서는Audience가Bag를 가지고 있어야 한다. Bag안에는 amount, invitation, ticket이 들어있다.TicketSeller가TicketOffice에서 티켓을 판매한다.TicketOffice안에 돈과 티켓이 보관돼 있다.
- Theater의
🌀 2-2. 변경에 취약한 코드
위 코드의 문제점
- Audience와 TicketSeller를 변경하면? Theater도 변경해야 함.
- 만약에 Bag에 현금이 없고 카드가 있다면?
이것은 객체 사이의 의존성에 관련된 문제
- 객체 사이의 의존성을 완전히 없애는 것이 정답은 아님.
- 객체지향 설계는 서로 의존하면서 협력하는 객체들의 공동체를 구축하는 것.
- 따라서 애플리케이션의 기능을 구현하는 데 필요한 최소한의 의존성만 갖도록 해야한다.
결합도 (coupling)
- 결합도는 의존성과 관련돼 있기 때문에 결합도 역시 변경과 관련이 있다.
- 객체 사이의 의존성이 과한 경우를 가리켜 결합도가 높다고 한다.
🌀 2-3. 정리
- 의도를 정확하게 의사소통하지 못하기 때문에 코드가 이해하기 어려워졌다.
- 객체각 강격합되어 있기 때문에 변경에 취약해졌다.
❐ 3. 설계 개선하기
🌀 3-1. 자율성을 높이자.
- 설계를 변경하기 어려운 이유는 다른 클래스의 세부까지 마음대로 접근할 수 있기 때문이다.
- 햬결 방법은 각각의 객체가 직접 처리하는 자율적인 존재가 되도록 설계를 변경하는 것이다.
캡슐화
- 이 처럼 개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것을 캡슐화라고 한다.
- 캡슐화의 목적은 변경하기 쉬운 객체를 만드는 것이다.
- 캡슐화를 통해 객체 내부로의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있다.
구현과 인터페이스
- 객체를 인터페이스와 구현으로 나누고 인터페이스만을 공개하는 것은
객체 사이의 결헙도를 낮추고 변경하기 쉬운 코드를 작성하기 위해 따라야 하는 가장 기본적인 설계 원칙이다.
🌀 3-2. 캡슐화와 응집도
핵심
- 객체 내부의 상태를 캡슐화하고, 객체 간에 오직 메시지를 통해서만 상호작용 하게 만드는 것.
- 응집도(cohesion)이 높다라는 말의 의미는
- 밀접하게 연관된 작업만을 수행하고, 연관성없는 작업은 다른 객체에게 위임하는 객체를 가리키는 말.
- 객체의 응집도를 높이기 위해서는 자신의 데이터를 스스로 처리하는 자율적인 존재가 되어야한다.
🌀 3-3. 절차지향과 객체지향
절차적 프로그래밍
- 프로세스와 데이터를 별도의 모듈에 위치시키는 프로그램이 방식
- 이 방식은
- 우리의 직관에 위배된다. ➔ 원활한 의사소통이 어려움.
- 변경에 취약함.
객체지향 프로그래밍
- 프로세스와 데이터가 동일한 모듈 내부에 위치하도록 프로그래밍하는 방식
- 이 방식은
- 적절히 통제된 의존성과 변경 전파를 억제하는데 효과적
- 객체 간 결합도가 낮기 때문에, 절차지향에 비해 변경에 좀 더 유연함.
🌀 3-4. 절차지향과 객체지향의 근본적인 차이는? “책임”
| 절차지향 | 객체지향 |
|---|---|
| 한 클래스가 독재적인 책임을 가지고 있음. | 책임이 여러 객체에 분산되어 있음. |
🌀 3-5. 정리 및 꼭 기억할 것
- 객제지향 설계의 핵심은 적절한 객체에 적절한 역할(책임)을 부여하는 것.
- 설계를 어렵게 만드는 것은 의존성이다.
- 따라서, 불필요한 의존성을 제거함으로써, 객체 사이의 결합도를 낮추는 것이 중요하다.
- 불필요한 세부사항을 객체 내부로 캡슐화 함으로써,
객체의 자율성을 높이고 응집도 높은 객체들의 공동체를 창조할 수 있다.
이 기사는 저작권자의
CC BY 4.0
라이센스를 따릅니다.