본문 바로가기
백엔드기술/개발언어

Modularization

by RevFactory 2009. 12. 9.

Modularization Example (Study)

 

Dear all,

 

안녕하세요

 

공유하고 함께 의논해볼만한 것을 준비했습니다.

다음의 문제를 해결하기 위한 3개의 코드가 첨부되어 있습니다.

  


==[문제]===============================================

------------------------------------------------------------------------------------------------

아래와 같은 Input 스트링이 있습니다.

꺽쇠 기호 사이의 문자열 중 스페이스 공간을 언더바( _ )로 바꾸고

양쪽 여백을 삭제하여 출력하세요.

 

Input : "  <hello world> <how are you>  "

Output : "<hello_world> <how_are_you>"

------------------------------------------------------------------------------------------------

 

 

위 문제는 실제로 우리 프로젝트에서 사용될 수 있는 아주 간단한 알고리즘입니다.

따라서 첨부파일을 보기전에 직접 해보셔도 좋습니다.

 

만약, 3가지 솔루션을 보셨다면 과연 어떤 코드가 정답일까요?

3가지 모두 정답입니다.  <--- 드래그

Output이 원하는대로 나오면 정답인거죠!

 

 

 

==[차이점]===============================================

 

하지만 3가지에는 차이점이 있습니다.  차이점은 아래와 같습니다.

 

ex1.java :  단순히 모듈화 없이 자바에서 제공해주는 API Pattern 클래스를 사용하고 있습니다.

 

ex2.java : 모듈화가 되어 있으며(완벽한것은 아닙니다.,.), Main에서 그것을 사용하고 있습니다.

 

ex3.java : 모듈화 없이 C코드 타입의 코드를 쓰고 있다. 심플해서 이해하기에 쉽다.

 

 

 

==[확장성]===============================================

 

제가 생각하는 모듈화의 목적은 확장성과 재사용성 입니다.

위에 주어진 문제가 1번이고, 비슷한 조건으로 아래의 Input, output 이 주어졌다고 칩시다.

 

2번 문제

Input : "  [hello world] [how are you]  "

Output : "[hello_world] [how_are_you]"

 

3번 문제

Input : "  {hello-world} <how-are-you>  "

Output : "{hello_world} <how_are_you>"

 

 

ex1.java : addUnderbar( ) 함수내에 조건들의 수정이 필요합니다. , 위의 문제를 해결하기위해서는 이 함수를 꿰뚫고 있어야 합니다. 정규식 표현을 알고 있어야 합니다.

 

ex2.java : Main 에서 사용중인 클래스 함수의 인자만 수정해주면 됩니다. 내부는 어떻게 생겼는지 몰라도 쉽게 수정할 수 있습니다. , 패턴을 찾기위한 정규식 표현은 알아야 합니다.

 

ex3.java : 코드 전체의 흐름을 모두 이해하고 있어야 합니다. 3번문제를 해결하기 위해서는 코드가 증가합니다.

 

 

이런경우는 실제로 프로젝트를 진행하다보면 비일비재 합니다.

흔히 쉽게 겪는 경우가 분명히 비슷한 알고리즘을 쓰는 것 같은데

모듈화가 잘 되어있지 않아 통채로 코드를 복사해서 수정해서 쓰는 경우죠.

코드는 코드대로 두배로 늘고 만족스럽지 않습니다.

 

모듈화를 하다보면 재사용성도 늘어납니다.

만약 특정 패턴을 가진 문자열들을 모두 가져오고 싶다 할때는 ex2.java parsePattern( ) 함수부분을

클래스로 따로 빼서 재사용 할 수 있겠죠?

 

 

 

==[결론]===============================================

 

모두들 OOP로 해야한다. 모듈화를 잘 해야한다... 등등 잘 알고 계시겠지만

실제로 코딩을 하다보면 이런것들을 모두 고려하기가 쉽지만은 않습니다.

 

ex1 approach1 , ex2 approach2, ex3 approach3을 생각하면서 만들어본 것입니다.

나름대로 비슷한 경우라고 생각하고 있습니다만 물론 완벽히 같은 케이스는 아닙니다.

 

"approach3 OOP를 적용시켜 수정하면 되는데..." 하실 수도 있겠지만

쉬운 ex3.java 예제로 모듈화 해보시면 알겠지만 쉽지않고, 또한 제한적입니다.

OOP를 적용했다 하더라도 적용된거 같지가 않죠.

 

그래서 대충 만들어놓고 나누는 것보다는 미리 어느정도 나누어 놓고 클래스간의 연관성을 설정해둔 뒤에

구현을 시작하는 것이 좋다고 봅니다.

 

당연한 거라고 생각하실 수도 있겠지만 직접 몸소 깨닫기에는 많은 경험이 필요하다고 생각합니다.

저도 한창 경험하고 있는 중이구요.

 

이해하기 좋은 코드가 반드시 좋은 코드는 아닙니다.

하지만 직관적으로 잘 나뉘어진 클래스들은 이해하기도 어렵지 않고 분명 그 진가를 발휘합니다.

또한 우리의 과제라고 생각합니다.

 

 

 

이상으로 주저리주저리 써보았는데요

도움이 되셨나 모르겠습니다.

문제가 있거나 이해가 잘 안되면 같이 의논도 하고 했으면 합니다. ^^

'백엔드기술 > 개발언어' 카테고리의 다른 글

ArrayDemo  (0) 2009.12.09
VB.NET, C# and VC++ Comparison  (0) 2009.12.09
값이 오버플로우되는지 확인하기 - checked  (0) 2009.03.24