역할 모델이란 말을 많이 들어 보셨을 겁니다. 일반적인 뜻으로는 다른 사람의 본보기가 되는 사람, 닮고 싶은 사람 정도가 되겠지요. 사람의 인생에 있어서 역할 모델이 중요하듯 개발 할 때 있어서도 이 역할 모델이 매우 중요합니다. 클래스를 만들 때 이 클래스의 역할 모델이 무엇인지 명확하게 알고 만들어야 클래스가 올바르게 만들어 집니다. 근데 이렇게 만들기가 참 힘든 게 사실입니다.
요즘 회사에서 큰 어플리케이션을 제작하고 있습니다. 큰 어플리케이션인 만큼 구조도 매우 복잡하고 저에겐 모든 것들이 어려운 일들 뿐입니다. 그런데 그 가운데 제일 이해하기 힘든 게 이 역할 모델인데, 저 같은 경우 아직 초급 개발자라 개발을 할 때, 습관적으로 알고리즘이나 구현에만 집중을 하게 됩니다( 안 하려고 해도 아직은 무의식적으로 그렇게 되더군요[...] ). 이렇게 알고리즘과 구현에만 집중한 결과, 만들어진 클래스들은 각각 어떤 일을 하는지도 명확하지 않고, 각 클래스마다 중복되는 알고리즘도 많아지고, 점점 개발할수록 악의 구렁텅이 속으로 빠지게 되지요. 다 제 경험입니다.(-_ㅜ) 하지만 이 악의 구렁텅이에서 쉽게 빠져 나오기가 힘듭니다. 항상 프로젝트를 시작할 땐 “아 이번엔 클래스나 함수들을 아름답게 만들어야지!”하고 다짐을 하지만 언제나 거의 비슷한 수준의 코드를 만들어 냈습니다. 아무튼 오늘도 그런 악순환을 반복하고 있었는데 히카형께서 제가 어려워하는 모습을 보시고, 메모장을 꺼내라고 하셨습니다. 그리고 메모장에 코드를 적기 시작했습니다. 제가 만들어야 하는 클래스는 CSmodal이라는 클래스로 역할이 alert창을 보여주고 사용자의 반응에 따라 다음 행동을 하도록 하는 클래스입니다. 제가 혼자 클래스를 만들 때는 구현에만 집착해서 “전역적으로 사용하는 alert창을 어떻게 그릴까?”에 대해서만 고민을 하면서 시간을 잡아먹고 코드는 산으로 가고 있었습니다. 아무튼 히카형 말씀대로 메모장에 먼저 생각해내기 쉬운 함수를 적었습니다.
static public function alert():void
전역적으로 사용해야 하기 때문에 static public을 사용했습니다. 다음은 이 함수가 하는 일을 생각해봤습니다. 먼저 alert창을 띄워야 하겠죠. 그래서 코드는
static public function alert():void{
// alert창을 띄운다.
alertWindow.visible = true;
}
이 정도가 되겠죠. 그리고 alert창이 띄워졌을 때 나머지 화면에서는 마우스 이벤트를 받으면 안되기 때문에 마우스 이벤트를 막아줄 창이 필요합니다. 그 창을 modalWindow라고 하면
static public function alert():void{
// alert창을 띄운다.
alertWindow.visible = true;
// modal창을 띄운다.
modalWindow.visible = true;
}
이렇게 되겠죠. 다음으로 alert창에서 표시 해야 할 텍스트를 넣어줘야 합니다.
static public function alert():void{
// alert창을 띄운다.
alertWindow.visible = true;
// modal창을 띄운다.
modalWindow.visible = true;
// 텍스트를 넣어준다.
alertContents.text = $contents;
}
이제 함수가 거의 다 만들어졌는데요. 아직 한가지가 남았습니다. alert창에서 확인버튼을 누르면 다음 동작으로 이어져야 합니다. 그래서 그 함수를 설정하는 부분이 남았습니다.
static public function alert():void{
// alert창을 띄운다.
alertWindow.visible = true;
// modal창을 띄운다.
modalWindow.visible = true;
// 텍스트를 넣어준다.
alertContents.text = $contents;
// 확인 버튼을 누르면 작동할 함수를 설정한다.
alertOK = $OK;
}
자 이 함수내부에서 하는 일들을 모두 기술했습니다. 이렇게 되면 이 함수가 필요로 하는 변수들이 무엇인지 알 수 있게 됩니다. alertWindow, modalWindow, alertContents, alertOK 변수들은 이 프로젝트 내에서 계속적으로 사용되기 때문에 CSmodal클래스의 정적 멤버 변수로 잡아줍니다.
public final class CSmodal {
static private var alertWindow:Sprite;
static private var modalWindow:Sprite;
static private var alertOK:Function;
static private var alertContents:TextField;
그리고 alert() 함수의 코드를 보면 alertContents와 alertOK에 할당해주는 변수가 있습니다. 이 변수들은 alert() 함수가 실행 될 때 마다 달라질 경우가 많기 때문에 ( 매번 다른 텍스트내용을 보낼 수도 있고, 다음 동작을 변경 할 수 있어서 ) 인자로 받아오는 형태를 가지게 됩니다. 그러면 alert 함수의 시그니쳐가 다음과 같이 명확해 집니다.
static public function alert( $contens:String, $OK:Function ):void{
// alert창을 띄운다.
alertWindow.visible = true;
// modal창을 띄운다.
modalWindow.visible = true;
// 텍스트를 넣어준다.
alertContents.text = $contents;
// 확인 버튼을 누르면 작동할 함수를 설정한다.
alertOK = $OK;
}
이제 alert() 함수가 다 만들어졌습니다. 그렇다면 지금 저 상태로 제대로 작동이 될까요? 당연히 안되겠죠. alertWindow, modalWindow, alertContents 변수들은 선언만하고 생성이나 할당을 하지 않았기 때문에 제대로 작동하지 않겠죠. 그럼 이 변수들에 생성이나 할당을 어디서 할까요? 생성이나 할당하는 것을 보통 “초기화” 한다고 말하지요. 그러면 초기화를 하는 init()라는 함수를 만들어서 그 안에서 변수들을 초기화하면 되겠습니다.
static public function init( $alertWindow:Sprite, $modalWindow:Sprite ):void{
// alertWindow 할당
alertWindow = $alertWindow;
// modalWindow할당
modalWindow = $modalWindow;
// alertContents할당
alertContents = alertWindow.getChildByName( ‘contents’ );
}
코드를 보면 alertWindow와 modalWindow는 외부로부터 할당을 받는 형태로 되어있습니다. 그 이유는 CSmodal클래스의 역할은 창을 그리는 것이 아니고 창을 띄워 주고 확인, 취소 버튼을 눌렀을 때 그에 해당하는 동작을 하는 역할 이기 때문입니다. alertWindow와 modalWindow는 직접 넘겨 받아 할당하지만 alertContents는 alertWindow의 자식이기 때문에 alertWindow로 부터 할당 받습니다. 생각해보니 전역 변수로 잡을 필요도 없어지는군요. ^^; 이렇게 init()까지 완성이 되었습니다. 그러면 이제 실제로 사용할 수 있는 클래스가 되었습니다.
이렇게 차근 차근 코딩을 하다 보니 클래스가 뚝딱, 그것도 이쁘게 만들어 지더군요. 클래스를 만들 때 알고리즘과 구현에 집착하지 않고 역할을 꼼꼼히 따지고 생각해서 자신이 할 일을 명확하게 인지한 후 의사코드를 짜고 그 의사 코드를 통해 실제 코드로 변환하면 정말 깔끔한 클래스가 만들어 집니다. 매번 머릿속으로는 가지고 있던 생각이었지만 잘 되지 않았었는데 오늘은 잘 되어서 개인적으로도 매우 기뻤습니다 ^^; 어떤가요? 오늘 배운 내용을 복습하고, 짧게나마 공유해보고 싶어서 이렇게 포스팅을 합니다.
최근 댓글