객체지향이라는 개념에 대한 정립이 필요했는데 "오브젝트"스터디 기회를 통해 공부해보려고 합니다.
부족해서 깊이있는 이해는 힘들지만, 최대한 많이 배울 수 있도록 노력하겠습니다.
챕터1은 티켓 판매 애플리케이션을 예시로 설명합니다.
모듈의 세 가지 목적
실행 중에 제대로 동작하는 것.
변경을 위해 존재.
코드를 읽는 사람과 의사소통.
하나의 클래스가 다른 클래스의 내부에 대해 더 많이 알면 알수록 해당 클래스를 변경하기 어렵다고 한다.
이는 객체 사이의 "의존성"과 관련된 문제라고 하고 여기서의 의존성은 SW공학에서의 "결합도"로 생각하면 된다.
SW공학에서 정의하는 우수한 sw를 만들기 위해서는 응집도를 높이고 결합도는 낮춰야 한다.
반대로 높은 응집도란
본 개체와 연관있는 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 즉, 적절한 책임(기능)을 가지고 있는 객체를 응집도가 높다고 한다.
"소극장은 관람객의 가방 안에 초대장이 들어 있는지 살펴본다. 가방 안에 초대장이 들어 있으면 관람객의 가방 안으로 들어간다. 가방 안에 초대장이 들어 있지 않다면 관람객의 가방 안으로 들어가 관람객의 가방에서 티켓을 꺼내 매표소에 보관된 후에 매표소에 적립한 금액만큼의 현금을 관람객의 가방의 금액으로 옮긴다."
내용 중 위와 같은 부분이 있었는데 어떤 문제가 발생할 수 있는지, 어떻게 해결할 수 있는지 객체지향적 사고를 연습.
예상해본 문제점
1. 상대가 판매원인지 확인 불가.
2. 관람객의 의사 배제.
구현을 위해 TicketMain 클래스 생성
package ticket;
public class TicketMain {
public static void main(String[] args) {
// 초대장 생성
Invitaion invitation = new Invitaion();
// Bag 생성
Bag bagWithInvitation = new Bag(30000L, invitation); // 초대장 있음
Bag bagWithoutInvitation = new Bag(50000L, null); // 초대장 없음
// Audience 생성
Audience audienceWithInvitation = new Audience(bagWithInvitation);
Audience audienceWithoutInvitation = new Audience(bagWithoutInvitation);
// Ticket 생성
Ticket ticket1 = new Ticket(10000L);
Ticket ticket2 = new Ticket(15000L);
// TicketOffice 생성
TicketOffice ticketOffice = new TicketOffice(0L, ticket1, ticket2);
// TicketSeller 생성
TicketSeller ticketSeller = new TicketSeller(ticketOffice);
// Theater 생성
Theater theater = new Theater(ticketSeller);
// Audience가 Theater에 입장 티켓 유무와 잔액에서 차감 출력
System.out.println("초대장이 있는 관객 입장");
theater.enter(audienceWithInvitation);
System.out.println("초대장이 없는 관객 입장");
theater.enter(audienceWithoutInvitation);
}
}

학습 전까지 객체지향 프로그래밍 하면, 단순히 "클래스 내부에 메서드가 위치하도록 한 프로그래밍" 이렇게만 알고 있었습니다.
적절한 책임의 분산, 객체의 자율성 향상과 같은 구체적인 보다 요구사항들이 있다는 것을 알았고 기존 사고의 틀을 많이 깨준 것 같습니다.
'OBJECT' 카테고리의 다른 글
| 오브젝트 챕터6<메시지와 인터페이스> (2) | 2025.01.15 |
|---|---|
| 오브젝트 챕터5<책임 할당하기> (5) | 2025.01.07 |
| 오브젝트 챕터4<설계 품질과 트레이드오프> (0) | 2025.01.04 |
| 오브젝트 챕터3<역할, 책임, 협력> (2) | 2024.12.27 |
| 오브젝트 챕터2<객체지향 프로그래밍> (2) | 2024.12.16 |