2009년 10월 28일
간단한 클래스가 있습니다.
Class CVal
{
public:
void Run();
private:
A m_A;
}
이 클래스를 구현할 때, 두 가지 초기화 형태에 대해 고민을 합니다.
▶ 1번
CVal:: CVal()
{
m_A = new A();
}
void CVal ::Run()
{
// m_A를 바로 사용...
}
▶ 2번
CVal:: CVal()
{
// 초기화 하지 않음
}
void CVal ::Run()
{
if(m_A == NULL)
m_A = new A();
}
Q. 1번과 2번 중 어느 형태가 좋을까요?
저의 경우, 2번 형태를 사용하는 이유는
"버그를 잡다보니..." 혹은 "혹시 모르니 보험을 들자.." 둘 중 하나 였습니다.
결국 수정하는 부분에 대해 확신 할 수 없는 경우 이런 형태를 사용하게 되었습니다.
또한, 2번 형태로 코딩할 때, "어느 책에 절대로!! 2번 형태로 코딩하지마라" 라고 써있는 건 아닐까?" 걱정도 됐습니다.
최근 이에 대한 조언을 해준 사람이 있었는데, 바로 "켄트 백"이네요. ^^
[호칭]
1번 형태 : Eager Initialize (열성적 초기화)
2번 형태 : Lazy Initialize (게으른 초기화)
[장점]
Eager : 디버깅이 쉽다
Lazy : 남용하면 디버깅이 어려워 질 수 있다.(권장)
[그럼 언제써?]
Eager : 초기화가 퍼포먼스에 무리를 주기 않는 환경일 때
Lazy : 초기 구동시간을 줄이거나, 특별히 퍼포먼스에 집중해야 할 때
[예를 들어봐]
VS2005, Netscape, Photoshop 들의 공통점이 있다. 초기 구동시간이 오래걸려서 참으로 지루하다!!
반면, 최근의 Eclipse. 초기 구동시간이 예전에 비해 엄청 빨라졌다.
[결론]
"반드시" 해야할 것들만 남기고, "게으른 초기화"를 사용하면,
초기구동시간을 줄일 수 있을 까~ 하는 생각이 듭니다. ^^
문제를 대충 해결하려는 목적으로 쓰지 말고, 고민 좀 해서 잘 사용하면, 좀 더 훌륭한 어플을 만들 수 있겠네요.
▶ 참고문헌 : 켄트 벡의 구현 패턴 / 켄트 벡저 / 전동환 역 / 에이콘출판사
# by 너굴너굴 | 2009/10/28 15:45 | nUgURi_GURU | 트랙백