땃쥐네

[OOP] 오브젝트 - 1.1 티켓 판매 애플리케이션 구현하기 본문

Design/OOP

[OOP] 오브젝트 - 1.1 티켓 판매 애플리케이션 구현하기

ttasjwi 2022. 12. 18. 14:50

 

이 글은

- 조영호 님의 '오브젝트'를 각 절(Chapter를 장이라고 하고, 각 소단원을 절이라고 보면 된다. 예를 들어 1장의 1 단원을 1.1 절이라고 하겠다.) 마다 읽고 느낀 점 위주로 정리하고 있다.

- 보통 각 장의 1절 부분 앞에 서두 부분이 있는데 이들도 1절을 다룬 글 앞에서 함께 언급할 것

- 오브젝트는 전반적으로 객체지향 개념을 직접 코드로 작성해서 설명하는데, 책만 읽지 말고 직접 예제 코드를 코드로 작성하여 실습해보는 것을 권장한다.


이 책을 언제, 누가 읽을까

- java 문법을 얕게 1회독 한 상태에서 읽으면 좋다.

- java가 아니더라도 객체지향 패러다임을 접목시킨 언어를 다룬다면 반드시 읽는 것을 추천한다.

- 객체지향이 단순히 클래스를 작성해서 연관된 데이터 넣고, 캡슐화 개념이 필드를 private 접근제어자로 막아둔 뒤 getter, setter만 넣고 외부에서 이를 통해서 데이터를 조회, 조작하는 것이라고 오해를 하고, 이러한 방식으로 프로그래밍을 한다면, 그리고 이런 프로그래밍에 데여서 뭔가 피를 봤다면 이 책을 읽어보는 것을 강력 추천한다.

- 이 책을 쓰신 조영호 님의 객체지향의 사실과 오해 역시 좋은 책이긴 하나, 이 책은 예제 코드를 작성하고 이를 기준으로설명하기에 이 책을 먼저 읽는 것을 추천한다.


학습 방법

설계에 관해 설명할 때 가장 유용한 도구는
이론으로 덕지덕지 치장된 개념과 용어가 아니라 '코드' 그 자체이다.

- 책을 한 장씩 읽는다.

- 읽으면서 인상 깊었다 싶은 것들을 밑줄을 친다. (나는 책을 스캔해서 전자책으로 만들고 관리하다보니 밑줄을 치고 언제든지 지우는 것이 용이해서 가능했다)

- 예제로 주어진 코드는 웬만하면 직접 타이핑한다. 눈으로 보는 것과 따라치는 경험의 차이는 생각 이상으로 크다. 참고로 이 책의 예제 코드는 조영호 님의 github에 게시되어 있다.

- 같은 책을 반복적으로 읽어보다보면 다시 보이게 되는 것들, 그리고 중요하다 느끼는 포인트를 좀 더 잘 잡아낼 수 있는데 그 때마다 중요도에 따라 색깔펜, 형광펜을 다르게 쳐가면서 읽는다.

- 정리를 하는데 시간을 많이 소비하지 않는다. 오랜 삽질을 하면서 느꼈는데 정리에 시간을 많이 들이면 학습 시간이 매우 길어지는 경향이 있다. 일단 책을 읽을 때는 그냥 순전히 책을 읽는데 집중하고 정리는 무리해서 시간을 많이 두지 않도록 한다.


요구사항 분석

  • 공연을 관람하기 원하는 모든 사람은 티켓을 소지하고 있어야만 한다.
  • 극장에 입장하기 위해서는 초대장을 티켓으로 교환하거나, 구매해야한다.
    • 이벤트 당첨자는 티켓으로 교환할 초대장을 가지고 있으므로, 요금을 지불하지 않는다.
    • 이벤트에 당첨되지 않은 당첨자는 초대장을 가지고 있지 않고, 요금을 지불해야 한다.
  • 관람객은 초대장, 현금, 티켓을 보유할 수 있고 소지품을 관리하기 위해 가방을 소지할 수 있다.
  • 각 극장에는 티켓 판매원이 상주하고 있으며, 판매원은 매표소에서 초대장을 티켓으로 교환하거나 판매하는 역할을 수행한다.
  • 티켓 매표소에는 관람객에게 판매할 티켓과 티켓의 판매금액이 보관되어 있어야 한다.

구현 결과물

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.getTicketOffice().plusAmount(ticket.getFee());
            audience.getBag().setTicket(ticket);
        }
    }
}

 

책의 1.1 절에서 구현한 티켓 판매 애플리케이션의 결과물은 최종적으로 위와 같다. 

  • Theater가 audience의 bag, ticketSeller의 TicketOffice를 알고 있음
  • 애플리케이션 로직이 Theater에 집중되어있음.
  • 어찌되든 동작하지만 뭔가 읽기 힘든 코드가 됐다.

인상 깊었던 구절

 

p.12

- 설계에 관해 설명할 때 가장 유용한 도구는 이론으로 덕지덕지 치장된 개념과 용어가 아니라 '코드' 그 자체이다.

- 개념은 지루하고 이론은 따분하다. 개발자는 구체적인 코드를 만지며 손을 더럽힐 때 가장 많은 것을 얻어가는 존재다.

 


느낀 것

 

- 이 절은 단순히 코드를 치는 것 이상으로 무언가 얻어가는 것은 없다.

- 하지만 코드를 직접 치다보면 코드가 뭔가 부자연스럽다는 것을 육감으로 느끼게 된다. 뭔가 이상하다는 것을 느끼는 것 자체가 의미 있다.

 


 

'Design > OOP' 카테고리의 다른 글

[OOP] 오브젝트 - 1.2 무엇이 문제인가  (0) 2022.12.18
Comments