6-2-마.함수 제작

함수를 정의하고 사용하는 문법은 사실 무척 간단한 편이라 쉽게 이해하고 익숙해질 수 있다. 그러나 필요할 때 정확히 요구에 맞는 함수를 만들어 활용하는 기술은 많은 연습을 필요로 하는데 여기서 아주 간단한 예를 통해 공통된 코드를 함수로 제작하는 실습을 해 보도록 하자. 다음과 같이 박스안에 메시지를 출력하고 싶다고 하자.

단순히 puts로 메시지만 출력해서는 사용자의 눈길을 끌 수 없으므로 중요한 메시지는 이런 식으로 좀 특이하게 출력할 필요가 있다. 과거 도스 환경이나 콘솔 환경은 표현력이 워낙 빈약하기 때문에 이런 식으로 장식을 통해 중요한 메시지를 강조하는 수밖에 없었다. 출력 결과를 보면 코드의 내용이 대충 상상되는데 문자열의 길이만큼 적당히 루프를 돌리면서 '-' 문자를 출력하고 다음 줄에 메시지, 그리고 마지막줄에 다시 '-'문자를 출력한 후 개행하면 된다.

이 정도 출력문이라면 단순한 루프로 해결할 수 있으므로 결코 어려운 코드라고는 할 수 없다. 그러나 메시지를 출력할 때마다 매번 루프를 돌리고 문자열의 길이를 계산하는 것은 어렵다기보다 성가신 일인데 이런 반복적인 코드를 함수로 한 번 작성해 놓으면 두고 두고 써 먹을 수 있을 것이다. 다음 예제의 BoxMessage 함수가 이런 메시지를 출력한다.

 

: BoxMessage

#include <Turboc.h>

 

void BoxMessage(char *str);

 

void main()

{

     BoxMessage("박스를 그리고 그 안에 문자열을 출력한다.");

     BoxMessage("전달된 문자열의 길이에 적당한 박스를 스스로 계산한다.");

     BoxMessage("신기하군");

}

 

void BoxMessage(char *str)

{

     int i;

     int len;

    

     len=strlen(str);

     puts("");

     for (i=0;i<len+4;i++) {

          putch('-');

     }

     puts("");

     printf("| %s |\n",str);

     for (i=0;i<len+4;i++) {

          putch('-');

     }

     puts("");

}

 

strlen함수는 문자열의 길이를 구하는데 이 길이에 4를 더한만큼 '-'를 반복적으로 출력했다. 메시지의 양쪽에 박스의 외곽선인 | 문자와 공백 하나씩을 더 출력하므로 위, 아래의 외곽선인 '-'도 메시지 길이보다 4만큼 더 길어야 한다. 수평선을 그은 후 개행하고 수직 외곽선과 메시지를 출력했다. 그리고 또 아래쪽에 수평선을 그어 박스를 닫았다. 출력 결과는 다음과 같다.

 

일단 함수가 만들어지면 호출원에서는 출력하고 싶은 메시지 문자열만 이 함수로 전달하면 된다. 문자열의 길이나 외곽선을 그리는 방법 등에 대해서는 더 이상 신경쓸 필요가 없어졌으며 필요할 때마다 함수를 호출할 수 있다. 뿐만 아니라 이런 출력을 다른 프로젝트에서도 사용하고 싶다면 이 함수만 복사해 가면 언제든지 재사용할 수 있다.

그런데 이 예제의 BoxMessage 함수를 자세히 보면 이 함수내에서 반복되는 코드가 보인다. 수평선을 긋기 위한 루프가 두 개 존재하는데 이 두 코드는 내용이 완전히 같으므로 두 번 반복해서 쓸 필요없이 함수로 분리하는 것이 좋다. 이왕 함수로 분리하는 김에 출력 문자와 반복 회수를 인수로 전달받아 좀 더 범용적으로 사용할 수 있도록 해 보자.

 

: BoxMessage2

#include <Turboc.h>

 

void BoxMessage(char *str);

void putchs(int ch,int n);

 

void main()

{

     BoxMessage("함수가 함수를 또 부를 수 있다.");

     BoxMessage("함수는 반복을 제거하며 코드의 재사용성을 높인다.");

}

 

void BoxMessage(char *str)

{

     int len;

    

     len=strlen(str);

     puts("");

     putchs('-',len+4);

     printf("| %s |\n",str);

     putchs('-',len+4);

}

 

void putchs(int ch,int n)

{

     int i;

    

     for (i=0;i<n;i++) {

          putch(ch);

     }

     puts("");

}

 

putchs 함수는 출력 대상 문자 ch와 반복 회수 n을 인수로 전달받아 ch를 n만큼 반복적으로 출력한다. 원래 BoxMessage 함수에 작성되어 있던 코드를 putchs 함수로 분리한 것이다. BoxMessage 함수는 수평선을 긋기 위해 똑같은 루프를 두 번씩이나 돌 필요없이 적당한 인수와 함께 putchs 함수만 호출하면 되므로 코드가 훨씬 더 짧고 간단해진다.

반복되는 코드가 함수로 분리되었으므로 프로그램의 크기가 작아졌으며 putchs가 출력 문자를 인수로 전달받으므로 박스의 모양을 다르게 디자인할 수도 있다. 또한 putchs 자체만으로도 재사용 가치가 충분히 있으므로 원하는 프로젝트에 가져가 쓸 수 있다.

 

 Power

두 개의 정수 a와 b를 입력받아 a의 b승을 구하는 power 함수를 작성하라. 예를 들어 power(2, 10)을 호출하면 1024를 계산해 리턴하면 된다. 정수 수준에서만 누승을 구하는 것이므로 오버플로우는 무시하기로 하고 효율도 고려치 않기로 한다. 표준 함수 중에 똑같은 계산을 하는 pow라는 함수가 이미 있지만 연습 삼아 만들어 보도록 하자.