이 챕터는 상속/인터페이스/다형성 등, 자바에서 객체지향 패러다임을 이루기 위해서 제공하는 기능에 대한 정의와 설명, 사용 방법을 공부하는 것이 아니라, 기존에 우리가 알던 지식을 기반으로 좀 더 객체지향스럽게 설계 및 개발하는 방법론에 대해서 이야기 해보려고 한다. 귀한 시간을 투자해서 읽고 있는 저자들에게.. 큰 도움이 되기를 바란다.
여기서 나오는 예제 또는 글은 위키북스에서 출판된 **오브젝트(조영호 지음)
**라는 책을 참고해서 작성했다는 사실을 알린다. 기회가 있고 시간이 있다면 구매해서 한번 쯤 정독를 권한다.
사전과제1(예제코드)를 고치기 전, 프로그래밍 관점으로 보면 Theater의 enter() 메서드는 데이터를 처리하는 프로세스(Process)이며, Audience, TicketSeller, Bag, TicketOffice는 단순히 데이터(Data)를 가지고 있는 역할만 가진다. 이 처럼 데이터와 프로세스 역할을 분리해서 프로그래밍 하는 방식을 절차지향 프로그래밍이라고 부른다.
프로세스는 데이터의 의존하고 있기 때문에 데이터의 변경은 단순히 데이터만 변경하는 것이 아니라 프로세스까지 변경을 해야한다. 즉, 데이터의 변경으로 인한 영향을 지역적으로 고립시키기 어렵다는 것이다. 그렇다면 어떻게 해야 변경하기 쉬운 설계를 할 수 있을까?
변경하기 쉬운 설계는 한번에 하나의 클래스만 변경할 수 있는 설계를 하는 것이다. 그렇게 하려면 어떻게 해야 하는가?
첫번째, 하나의 프로세스에서 모든 처리가 실행 되는 것을 적절한 단계로 나눈다.
두번째, 나눠진 프로세스를 해당 프로세스와 연관 있는 데이터가 있는 클래스로 옮기는 것이다. 즉, **데이터와 프로세스(클래스의 데이터를 처리하는 or 연산하는)**를 한 곳에 두는 것이다. 데이터와 프로세스가 동일한 모듈(클래스) 내부에 위치하도록 프로그래밍하는 방식을 객체지향 프로그래밍(Object-Oriented Programming)이라고 부른다. 객체지향 설계의 핵심은 캡슐화를 이용해서 의존성을 적절히 관리함으로써 객체 간의 결합도를 낮추는 것이다.
그렇다면 무조건 객체지향은 좋고 절차지향은 나쁘다라는 의미일까? 그건 절대적으로 아니다. Spring Boot 프레임워크에서 개발을 하다보면 우리는 DTO와 Entity라는 객체을 정의해서 사용한다. DTO와 Entity는 단순히 데이터를 가지고 있는 역할만 한다. 이 데이터를 처리하는 프로세스는 다른 객체(비즈니스 로직을 수행하는)가 가지고 있다. 그래서 우리는 객체지향과 절차지향을 적절한 혼합을 통해서 개발하고 있다는 사실을 잊지 않았으면 좋겠다.
개발을 시작하는 시점에 구현에 필요한 모든 요구사항을 수집하는 것은 불가능하다. 만약, 모두 수집했다고 하더라도 개발 진행중에 요구사항은 변경된다.
그래서 우리가 해야 하는 일은 아래 조건을 부합하는 설계를 하는 것이다.
첫번째, 오늘은 필요한 기능을 오류 없이 잘 실행되는 코드를 완성하는 것
두번째, 오늘 작성한 코드를 내일 쉽게 변경할 수 있는 코드를 작성하는 것