😇 다시 시작하게 된 오브젝트 스터디

한동안 JPA와 개인프로젝트 병행으로 오브젝트 책을 보지 못했습니다.
책은 읽을때 한번에 완독을 해야 기억에도 오래남고, 찾아 볼때도 어떤 부분을 봐야하는지 알 수 있는데 꽤나 오랫동안 오브젝트를 놓고 보지 않았더니 많은 부분들이 기억속에서 삭제 되었습니다.

그래서 다시 오브젝트를 읽으면서 어떤 것들을 공부 했었는지, 또 어떤 것들에 중점을 두고 저자가 객체지향 설계에 대해 설명하는지를 다시한번 되새기는 시간을 가지기로 했습니다.

🤔 영화 예매 시스템 설계로 알아보는 객체지향

🤭 요구사항은 무엇일까?

모든 프로그램은 요구사항으로부터 출발합니다.

위의 이미지처럼 어떤 기능을 구현해야 하는지, 또 우선순위는 몇번째인지와 같이 처리해야 될 순번도 명시할 수 있습니다. 양식은 정하기 나름이지만 어느 정도의 대중적인 약속은 정해진 편입니다.

요구사항을 정리하기전에 영화예매 시스템의 핵심이 되는 두가지 단어를 정리하고 갈 필요가 있어 '영화''상영'의 의미에 대해서 살펴 보고 가겠습니다.

보통 우리는 영화를 보러가기위해 예매를 할때 '영화를 예매했다라고 표현을 합니다.'
사용자가 실제로 예매하는 대상은 영화가 아니라 상영입니다.
약간 의아하실수 있지만, 지금부터 왜 예매하는 대상이 영화가 아니라 상영인지 말씀드리겠습니다.

  • 영화 : 제목, 상영시간, 가격 정보와 같이 영화가 가지고 있는 기본적인 정보를 뜻합니다.
  • 상영 : 실제로 관객들이 영화를 관람하는 '사건'을 표현합니다.

위에서 정리한대로, 사람들은 영화를 예매한다고 표현하지만 실제로는 특정 시간에 상영되는 영화를 관람할 수 있는 권리를 구매하기 위해 돈을 지불합니다.

💫 요구사항 - 할인 조건, 기간 조건, 순서 조건

지금부터 설계할 영화 예매 프로그램은 영화를 예매할때 특정 조건을 만족하는 예매자는 요금을 할인받을 수 있습니다.

할인액을 결정하는 두가지 규칙이 존재하는데, 하나는 할인 조건이라고 부르고 하나는 할인 정책이라고 부르겠습니다.

할인조건은 가격의 할인 여부를 결정하며, '순서 조건''기간 조건'의 두 종류로 나눌 수 있습니다.

  • 순서조건 : 순서 조건의 순번이 10인 경우 매일 10번째로 상영되는 영화를 예매한 사용자들에게 할인 혜택을 제공한다.
  • 기간조건 : 영화 상영 시작 시간을 이용해 할인 여부를 결정합니다. 기간 조건은 요일, 시작 시간, 종료 시간의 세 부분으로 구성되고, 영화 시작 시간이 해당 기간안에 포함되면 요금을 할인 받을 수 있습니다.

할인 정책은 할인 요금을 결정하는 역할을 합니다. 할인 정책에는 '금액 할인 정책''비율 할인 정책'이 있습니다.

  • 금액 할인 정책 : 예매 요금에서 일정 금액을 할인해주는 방식입니다. 영화의 가격이 9000원이고 금액 할인 정책이 800원이면 영화의 가격은 8200원이 되는 식입니다.
  • 비율 할인 정책 : 예매 요금에서 특정 비율만큼 할인해주는 방식입니다. 영화의 가격이 9000원이고 비율할인 정책이 10%라면 영화의 가격은 8100원이 되는 식입니다.

🐣 그래서 어떤 시스템이 만들어지는걸까?

영화 예매 시스템은 사용자로부터 영화 예매라는 작업을 받아, 할인 조건과 정책을 조합해서 할인을 한 금액을 결제할지 판단하고, 사용자에게 결제금액을 알리고, 사용자가 결제를 하여 예매를 완료하면 제목, 상영벙보, 인원, 정가, 결제금액등의 정보가 포함된 예매 정보를 생성하는 일을 합니다.

🦀 한 걸음 한 걸음 객체지향 프로그래밍을 향해 !

객체지향 프로그래밍하면 가장 먼저 어떤것이 떠오르시나요?
객체지향은 말그대로 객체를 지향하는 것이라고 합니다. 객체지향 프로그램을 작성할 때 가장 먼저 고려할 것이 있다면 무엇이라고 생각하시나요?
클래스가 필요한지 고민하고, 클래스를 결정한 후에 클래스에 어떤 속성과 메서드가 필요한지 고민한다면 이 책을 저와 함께 완주하셔야 할 것 같습니다.

왜냐하면 저자는 이것을 객체지향의 본질과는 거리가 멀다고 하고 있기 때문입니다.
객체지향은 말 그랟로 객체를 지향하는 것이기 때문입니다. 진정한 객체지향 패러다임으로서의 전환은 클래스가 아닌 객체에 초점을 맞출 때에만 얻을 수 있습니다.

그렇다면 어떤 것들에 집중해서 객체지향적으로 나아갈 수 있을까요?

  • 어떤 클래스가 필요한지 고민하기 전에 어떤 객체들이 필요한지 고민해야 합니다.
    • 클래스는 공통적인 상태와 행동을 공유하는 객체들을 추상화 한것입니다. 따라서 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 어떤 행동을 가지는지를 먼저 결정해야 합니다.
  • 객체를 독립적인 존재가 아닌, 기능 구현을 위해 협력하는 공동체의 일원으로 보아야 합니다.
    • 객체는 혼자 존재하는 것이 아니라, 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재입니다.

🐠 객체지향적 설계로 가는 걸음마를 떼다!

객체를 설계할때 항상 클래스를 기준으로, 클래스가 어떤 역할을 하고 어떤 메서드들이 필요한지 클래스 정의가 끝난 후에 필요한 속성(필드)과 메서드들을 정의하곤 했습니다.

클래스를 바라보는 것이 아니라 객체지향은 말 그대로 객체를 지향하는 것!

객체에서 시작해 객체로 끝나는 객체만 생각하는 그런 설계자가 되기 위해서 많은 공부가 필요할 거 같습니다.

출처 : 오브젝트 - 조영호(위키북스)

0개의 댓글