초보 개발자에게 권장하는 객체지향 모델링 공부 방법

2017. 5. 11. 16:11programing/java

반응형

일단 이 글을 읽기전에 말하고 싶은 부분이 있다. 아마 내가 이렇게 얘기하면 이 글을 읽지 않을 수도 있다. 

 하지만 이게 현실이니... 본인도 처음에는 객체지향에 대한 개념을 제대로 모르고 MVC패턴까지 사용하고 그렇게 해온게 사실이다... 첫 회사에 들어가고 답답한 마음에 구글도 뒤져보고 책도 찾아보면서 개념을 읽어보니 아! 이게 이랬었네? 이런 생각이 들었다.. 

 사실 아직 제대로 모를수도있다... 하지만 현업에서의 현실은 세팅 된 상태에서 코드를 짜는 것이 대부분이고 소규모 프로젝트에서는 패턴화 시키는 것이 비효율이라고 느끼는 부분이 대다수이기 때문이다.

 얼마전에 한 AA(Application Architect)분은 솔직히 보통 전자정부프레임웍에서 service(interface)부분은 정말 쓸모없는 부분이라고 하기도 한다.

 나도 아직 초급개발자라 경력이 쌓이다보면 느끼는 부분이 있을 것이다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


아마도 '객체지향 모델링'이라는 표현을 자주 들어보셨을 것입니다. 여기서 이야기하는 '모델링(modelling)'은 흔히 말하는 '3D 모델링'이나 '프라모델' 같은 단어에서 쓰인 뜻과 일맥 상통하는 개념입니다.

즉, 모델링이란 기본적으로 실세계의 어떤 대상을 다른 매체로 옮겨서 표현하는 작업을 뜻합니다.

프로그래밍에서라면, 실세계의 특정 도메인 - 예컨대 백화점의 업무와 관련한 일련의 개념(예컨대 '고객', '상품' 등)이나 동작('구매', '정산' 등)을 코드라는 매체로 옮겨서 표현하는 과정을 모델링이라고 할 수 있고, 특히 이러한 작업을 객체의 단위로 처리하는 경우 '객체지향 모델링'이라고 표현합니다.

따라서, 객체지향 모델링을 하려면 무엇보다 도메인에 대한 이해와 분석이 선행되어야 합니다. 일단 표현하려는 대상이 무엇이고 어떻게 구성되어있는지 알아야 어떻게 이를 코드로 옮길지 따져볼 수 있기 때문입니다.

그래서 보통 객체지향으로 설계를 할 때는 도메인의 핵심 개념과 요구조건을 파악하는 것을 첫 단계로 합니다.

개인적으로 특히 학원 같은데서 이러한 연습이 안된 상태에서 프레임워크를 써서 게시판 같은 걸 만들게 가르치는 것이 매우 안좋은 관행이라고 보는 이유가, 그렇게 배울 경우 보통 개념 추출 단계를 건너뛰고 으례 데이터베이스 테이블부터 생성하고 화면을 붙이려 하기 십상이기 때문입니다.

그렇게 하면 안된다는 법이야 없겠습니다만, 그건 객체지향적인 개발이 아니라 데이터베이스 중심적인 개발이라고 부르는 형태가 되어, 적어도 자바 언어로 개발하는데 있어서 우선 권장할만한 접근은 아닙니다.

그래서 저는 객체지향 모델링을 연습하려면 데이터베이스나 MVC 프레임워크를 사용하는 웹 응용프로그램보다는 터미널이나 단위 테스트로 구동하는 간단한 예제 프로젝트를 하는 것이 훨씬 도움이 될 수 있다고 생각합니다.

예를들어 카드 게임이나 윷놀이, 엘리베이터 시스템 등 도메인 규칙이 충분히 단순한 대상을 골라서 화면없이 관련 개념과 동작을 구현해 보는 것이 좋은 연습이 될 수 있습니다.

만일 포커 게임을 모델링해보겠다면, '카드', '플레이어', '핸드(i.e. 원 페어, 스트레이트, 등등)' 같은 핵심 개념과 '카드를 섞는다', '베_팅을 한다' 등과 같은 동작을 추출할 수 있을 것입니다.

그럼 남은 일은 '카드'를 'Card' 클래스로, '카드를 섞는다'를 'shuffle()'이라는 메서드로 모델링하는 일입니다.

좋은 모델은 주석을 보지 않고도 모델이 나타내는 실세계의 개념에 비추어 자연스럽게 읽히는 형태입니다. 예컨대 'CardDeck'이란 클래스에 'cards: List<Card>'라는 속성이 있고 'shuffle()'이라는 메서드가 있다면 특별히 주석을 달지 않아도, 어떻게 하면 카드덱의 카드를 섞을 수 있는지 직관적으로 알 수 있을 것입니다.

반면 'CardGame.shuffle()' 같은 메서드를 만들었다면 카드를 섞는행위는 카드 게임의 동작이라기 보다는 카드덱이나 플레이어의 동작으로 생각하는 것이 더 자연스럽다는 점을 감안하면 좋지 못한 모델링이 될 수 있습니다.

이런 식으로 어느 정도 기본적인 모델링에 익숙해지면 그 다음에는 일반화, 추상화에 대해 고민을 하는 것이 좋습니다.

예를들어 이렇게 포커 게임을 만들었다면 블랙잭 게임에 같은 코드를 사용한다고 했을 때 어떻게 하면 최소한의 수정으로 같은 코드가 두 가지 경우에 모두 적용되게 할 수 있을지를 고민하는 것이 일반화, 혹은 추상화의 과정입니다.

사실 객체지향이라는 패러다임 자체가 결국 코드를 일반화하고 추상화하는 한 가지 접근 방법이라고 할 수 있습니다.

결국, 실세계의 개념을 모델링하는 과정에서 지나치게 복잡한 부분을 추상화해서 감추고, 서로 다른 개념의 공통점을 찾아 일반화해서 같은 코드로 동작하게 하는 것이 객체지향적 설계의 핵심입니다.

아마도 자바 입문서에서 'extends' 키워드를 사용하면 상속을 할 수 있고 'super' 키워드를 써서 부모를 호출할 수 있다는 등의 내용을 배우셨을 것으로 짐작합니다.

하지만 이는 '어떻게(how)'에 해당하는 것이고, 그런 도구를 언제 '왜(why)' 써야 하는 지가 훨씬 더 중요한 질문이라고 할 수 있습니다.

그리고 만일 포커와 블랙잭의 규칙을 동일한 API로 표현하는 과정에서 'if else'문을 나열하는 대신 상속을 통해 일반화/추상화 하는 방법을 시도해본다면 바로 그런 '왜'에 해당하는 질문에 대한 답을 스스로 터득할 수 있다고 생각합니다.

이런 과정을 거쳐서 상속이나 인터페이스의 사용 같은 객체지향 기본 개념을 체득(단지 어떻게 하는 지만 아는 것이 아니라)했다면 남은 것은 실무에서 경험을 쌓고 디자인 패턴 같은 보다 깊이 있는 내용을 공부하는 것입니다.

디자인 패턴은 결국 앞서 말한 추상화, 일반화의 모범답안 같은 것을 모아 놓은 것일 뿐입니다. 자주 반복되는 문제에 대한 검증된 모델링 기법의 모음이 객체지향 디자인 패턴의 정의입니다.

결론적으로, 전 객체지향 모델링을 공부하려면 무엇보다 직접 간단한 모델링을 시도해보면서 개념을 익히는 것이 최선의 선택이라고 생각합니다.

그리고 그러한 연습 과정에는 어떤 웹사이트를 완성하겠다거나 완전한 GUI를 갖춘 플레이할 수 있는 게임을 만들겠다는 목표 보다는 터미널에 간단한 메시지만 출력되더라도 보다 객체간의 관계가 잘 나타날 수 있는 단순한 주제를 고르는 것이 도움이 될 수 있다고 봅니다.


반응형

'programing > java' 카테고리의 다른 글

싱글톤 패턴 정리  (0) 2018.03.19
maven에 대해..  (0) 2018.03.19
Node.js vs Java 구조적 차이  (0) 2017.11.30
static에 대한 고찰  (0) 2017.05.11
자바 설치  (0) 2017.05.11