장점
단점
실제로 존재하는 것(건물, 사람, 자동차), 추상적인 것(날짜) 중에서 자신의 속성과 동작을 가지는 모든 것을 말한다.
객체는 속성(필드)과 메소드(동작)로 구성된 자바 객체로 모델링할 수 있다.
객체 지향 프로그램에서는 객체는 다른 객체와 다른 객체와 관계를 맺고 있다.
public class Invitation {
//초대장(이벤트 당첨 자)
}
public class Ticket {
//티켓 직접 티켓 구매
}
public class Bag {
//관람객의 소지품을 보관
}
public Audience {
//관람객
}
public class TicketOffice {
//매표소
}
public class TicketSeller {
//판매원
}
public class Theater {
private TicketSeller ticketSeller;
public Theater(TicketSeller ticketSeller){
this.ticketSeller = ticketSeller;
}
public void enter(Audience audience){
if (audience.getBag().hasInvitation()){
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().setTicket(ticket);
}
else{
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().minusAmount(ticket.getFee());
ticketSeller.getTicketOfiice().plusAmount(ticket.getFee());
audience.getBag().setTicket(ticket);
}
}
}
이 프로그램은 제대로 동작하지만 변경 용의성과 읽는 사람과의 의사 소통이 떨어진다.
- Theater는 getBag의 Bag를 열어 Invitation이 있는지 확인
- Bag에 Invitation이 있으면 Bag에 ticket을 가방으로 옮김
- Bag에 Invitation이 없으면 Audience의 가방에서 Ticket의 fee만큼 amount를 꺼내 tickestSeller가 가 TicketOffice에 적립한다
- ticketSeller는 Bag에 Ticket을 넣는다.
- 관람객의 가방을 Theater 가져가서 함부로 돈을 넣고 빼고 있다.Theater는 매표소에 보관 중인 티켓과 현금에도 마음대로 접근할 수 있다.
- 매표소에 보관중인 티켓과 현금에도 Theater가 마음대로 접근 할 수 있다.
변경 용의성
이해하기 쉬운 코드
public class Invitation {
//초대장, 초대일자를 (이벤트 당첨 자)
}
public class Ticket {
//티켓 직접 티켓 구매
}
public class Bag {
//관람객의 소지품을 보관
}
public Audience {
//
private Bag = bag;
public Audience(Bag bag){
this.bag = bag;
}
public Long buy(Ticket ticket){
if (bag.hasInvitation()){
bag.setTicket(ticket);
return 0L;
}
else{
bag.setTicket(ticket);
bag.minusAmount(ticket.getFee());
return ticket.getFee();
}
}
}
public class TicketOffice {
//매표소
}
public class TicketSeller {
private TicketOffice ticketOffice;
public TicketSeller(TicketOffice ticketOffice){
this.ticketOffice = ticketOffice;
}
public void sellTo(Audience audience){
ticketOffice.plusAmount(audience.buy(ticketOffice.getTicket()));
}
}
public class Theater {
private TicketSeller ticketSeller;
public Theater(TicketSeller ticketSeller){
this.ticketSeller = ticketSeller;
}
public void enter(Audience audience){
ticketSeller.sellTo(audience);
}
}
변경 용이성
코드를 읽는 사람과의 의사소통
개선을 통해 응집도를 높이고 결합도를 줄일 수 있다.
현실의 직관에서도 관람객과 판매원은 스스로 자신을 책임진다. 그렇기 때문에 코드로도 이해하기 쉽다.
극장은 어떤가?
그렇다면 극장에서 문을 열어주고 허가 시켜주는 사람 객체가 또 필요한것 일까?
객체지향의 세계에서는 수동적인 존재도 능동적이고 자율적인 존재로 바뀌어야한다. 이것을 의인화라고 한다.
위키북스, 오브젝트 코드로 이해하는 객체지향 설계, 조영호