이쁜왕자 만쉐~~

[프로그래밍] 기존의 함수에 파라미터 추가하기.. 본문

게임판

[프로그래밍] 기존의 함수에 파라미터 추가하기..

이쁜왕자 2008. 8. 25. 18:10

C 프로그래밍을 하다보면,, 새로운 기능을 추가하기 위해서,, 기존의 함수를 변경해야 할 일이 발생한다.. 하지만,, 반드시 파라미터를 추가해야 하는 경우가 발생하면,, 조금 골치 아파 진다..

예를 들어 int foo (int a) 라는 함수가 있다고 하자,, 게다가 이 함수는 수도 없이 많은 곳에서 호출되어 사용된다고 가정하자.. 그러기에,, foo() 함수의 파라미터을 함부로 변경 하기에는 무리가 있다..

이런 상황에서 foo() 함수와 거의 유사한 기능을 하는 또 다른 함수를 작성해야 한다..

많은 초보들이 int foo (int a) 를 copy & paste 해서 int foo2 (int a) 를 만들어 쓴다는 것이다..

이거 무지무지 좋지 않은 코딩 방법이다..

첫번째로 소스코드가 그만큼 길어진다.. 새로운 기능이 늘어날때마다,, 새로운 함수가 추가되면,, 유사한 기능을 하는 코드가 복사된다.. 소스는 커질수록 관리가 안된다..

두번째로,, foo() 함수의 원 저자가 버그를 발견하고 foo() 함수를 수정해 놓을 수가 있다.. 이런 경우 foo2() 함수의 버그는 수정되지 않는다..

그렇다고 기존의 foo 함수를 int foo (int a, int option) 처럼,, 파라미터를 추가해 버리면,, 기존의 foo 를 호출하는 수많은 모듈에서 에러가 발생한다..

C++ 에서는 default parameter 라는 기능을 사용하면,, 에러가 발생하는 것은 피할수 있지만,, C 에서는 제공하지 않는다..

대신 이를 흉내내는 형태로 코딩할 수 있다..

int foo(int a)
{
    // foo function body;
    return 0;
}

원래는 이랬던 함수를

int foo_with_option(int a, int option);  /* declaration */

#define FOO_DEFAULT_OPTION 0

int foo(int a)
{
    return foo_with_option(a, FOO_DEFAULT_OPTION);
}

int foo_with_option(int a, int option)

{
    // foo function body;
   if (option == 1)
        // do something

    return 0;
}

위와 같이 바꾸어 버리면 된다.. 기존의 foo () 함수를 foo_with_option() 로 바꾸면서, 필요한 파라미터를 추가한다.. 그리고,, 원래의 foo() 함수와 같은 타입으로 함수를 선언한뒤 foo_with_option() 를 호출하게끔 한다.. 당연히 원래의 기능을 동일하게 동작하도록 추가된 파라미터 입력을 주면 된다..

즉, option 이 FOO_DEFAULT_OPTION( = 0 ) 인 경우는 원래의 foo() 함수와 동일하게 동작하고,, option 이 다른 값이면,, 다르게 동작하게 바디를 수정해 주면 된다.. 그리고 나서는 새 모듈에서 foo_with_option() 을 호출해서 사용하면 된다..

이렇게 작성할 경우, 위에서 언급했던 2가지 문제가 모두 해결된다.. 같은 코드를 재사용하기에,, 코드가 간결하고 이해하기 쉽게 된다.. 기존의 foo() 만 알고 있던 사람도 foo() 가 변경되었음을 명확히 알게 되며,, option 에 추가된 경우를 고려해서 버그를 수정할 수 있게 된다.. 게다가,, 아무런 컴파일 문제를 야기하지 않는다..

#ifdef __FOO_WITH_OPTION_FEATURE__
int foo_with_option(int a, int option);  /* declaration */

#define FOO_DEFAULT_OPTION 0

int foo(int a)
{
    return foo_with_option(a, FOO_DEFAULT_OPTION);
}

int foo_with_option(int a, int option)
#else
int foo(int a)
#endif

{
    // foo function body;
#ifdef __FOO_WITH_OPTION_FEATURE__
    if (option == 1)
        // do something

#endif
    return 0;
}

추가적으로 이걸 #ifdef 으로 막아줄 수 있다면,, 금상첨화 되겠다..

- 이쁜왕자 -
- Valken the SEXy THief~~ ^_* -
 

728x90
반응형
Comments