제목이 좀 무거워 보이네요. 화려한 방법 보다는 생산성을 높이자는 주제 같은데,

갑자기 이런 글을 사용하는 이유는 화려한(?) 기술을 사용해서 루틴을 짧게 만드는 것 보다는

루틴이 길더라도 다른 분도 읽기 편하게 작성하는 것이 좋지 않을까 하는 생각 때문입니다.


매우 오래 전에 미국 서부 영화를 보았습니다.
실력이 좋지만, 남에게 항상 티내고 싶어하는 젊은 카우보이가
나이 많은 카우보이 앞에서 말을 힘차게 달려 가다가
말의 고삐를 밑으로 힘있게 당겨서 말의 머리를 밑으로 푹 숙이게 하고는
화려하게 말의 머리 쪽으로 미끄럼을 타듯 내려 오는 장면이 있었습니다.
그리고 나이 많은 카우보이에게 이렇게 말에서 내려 올 수 있냐고
자랑하듯 얘기합니다.
나이 많은 카우보이는 일반적인 방법으로 천천히 말 옆으로 내립니다.
그리고 됐냐는 듯 어깨를 으쓱해 보입니다.
젊은 카우보이는 그게 뭐냐고 나무라듯 얘기합니다.
나이 많은 카우보이의 대답은 간단합니다.


"내려 왔잖아."


C언어에는 함수 포인터가 있습니다. 잘 사용하면 매우 편하지만,

난발하면 역시 어려운 코드가 됩니다.


아래 코드를 한 번 보실까요?


int get_double( int value){


   return value * 2;

}


int get_treble( int value){


   return value * 3;

}


int get_value( int value, int (*fun)(int) ){


    return fun( value);

}


int main( int argc, char *argv[]){


    if ( '2' == argv[1][0]){

        printf( "return value=%d\n", get_value( 5, &get_double));

    } else {

        printf( "return value=%d\n", get_value( 5, &get_treble));

    }


    return 0;

}

조건에 따라 2배, 3배 값을 구하는 함수인데 함수 포인터를 사용했습니다. 물론, 틀린 방법은 아니지만, 이런 코드는 함수 포인터를 설명할 때나 좋은 코드로 생각합니다. 그저 훌륭한 예일 뿐이죠. 차라리 아래 코드가 좋지 않을까요?


int get_double( int value){


   return value * 2;

}


int get_treble( int value){


   return value * 3;

}


int main( int argc, char *argv[]){


    if ( '2' == argv[1][0]){

        printf( "return value=%d\n", get_double( 5);

    } else {

        printf( "return value=%d\n", get_treble( 5);

    }


    return 0;

}


현란한 기술 보다는 다른 사람도 이해하기 쉬운 코드가 훌륭한 코드가 아닌가 싶어서 올렸습니다.