어렴풋하지만, 고등학교 때인지 대학때인지 즈음에, 그것이 C언어를 배울 무렵인지 한참 배우고 나서인지 알 수 없지만, 다음과 같은 문장이 걱정스러웠던 적이 있다.


void functin()

{

int i;

for( i=0; i<100; i += 1 ) {

if( i > 50 ) {

return;

}

}

}


매우 간단한 문법이다. 100회를 돌지만, 50이 넘는 순간 함수 자체를 탈출하라는 것이지 않은가. 문제는 for 문을 break가 아닌 return으로 탈출하는 것에 대한 사용법인데, 이 구문에 대한 이해는 for 문장은 단순히 if, goto 의 조합으로 다시 쓸 수 있는 것 이상도 이하도 아닌 것에 대한 언어구현상의 확신을 필요로 한다.


void functin()

{

int i;


i = 0;

loop:

if( i< 100 ) {

goto loop_end;

}

if( i > 50 ) {

return;

}

i += 1;

goto loop;

loop_end:


}


이 정도 되겠다. 이런 동치인 문법으로 표현이 가능하다는 구현상의 확신(?)이 체화되기까지 시간이 지나야만 단순한 저 문법조차 쉽게 쓸 수 있다는 것인데, 저게 두려웠던 이유는 for 라는 녀석이 내부적으로 뭔가를 임시로 만들어 놨는데, return이라는 무지막지한 녀석을 동원하여 임시데이터를 없애지 못하고 순간 탈출하는게 아닌가 하는 것에 있었다.


그런데, 요즘의 다른 언어 문법에서 보이는 iterator 를 넘기는 구문으로서의 for 같은 경우는 사실 저런식으로 언어 구현에 대한 확신이 숨겨져 있는 경우가 있다. 문법은 쉬워보이지만, 그 구현에 대한 확신이 없을 때 생기는 두려움.


예를 들어 다음과 같은 javascript가 있을 때,


function ()

{

for( var it in someObject ) {

if( someObject[it] %3 == 0 ) {

delete someObject[it];

}

}

}


저 delete가 someObject 의 Key operation에 어떤 영향을 줄까에 대한 구현상의 이해가 가독성을 떨어뜨리지 않나 싶다. 물론 이것은 for 의 구현에 대한 두려움이라기보다는 object의 iterator에 대한 두려움이긴하다. 저 비슷한 것을 C++의 STL 사용예로 확인한다면,


void function( std::map<std::string, int> & m )

{

for( std::iterator it = m.begin(); it != m.end(); it.next() ) {

if( it->second % 3 == 0 ) {

m.remove(it);

}

}

}


(컴파일 않고 요새 잘 안쓰던 C++ 문법을 쓰려니 저게 안돌아가면 어쩌나 하는 마음도 있지만, 아뭏든)

오픈소스인 STL 구현을 따라가면 사실 어떤 문제가 있을지 확인할 수 있는 부분이다. 하지만, 언뜻보아도, 지운데이터의 다음 it.next()를 참조하는 것은 오류가 발생할 것 같다. 그래서 next를 구한다음 remove하는 방식으로 바꿔야한다. 이게 기존의 for에 대한 이해가 있고, 거기에 iterator를 따라가는 형태로 구현했으니 망정이지, javascript 처럼 next()에 대한 처리를 수작업으로 하지 않는 경우엔 구현에 대한 궁금증이 증폭되게 마련이다.


이런 두려움 혹은 호기심은 내 코딩 속도를 저하시키는 요인 중의 요인이다. ㅎ.


저작자 표시 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
by Coolen 2014/07/20 11:35
| 1 2 3 4 5 ... 708 |