들어가기 전에

프로그래밍을 하다보면 가끔 반복적으로 작성해야 하는 코드가 있다. 이런 코드를 여러번 쓰지 않고 함수 형태로 저장해두면 코드를 간결하고 이해하기 쉽게 만들 수 있다. 사용자 정의함수를 사용하는 방법을 배워보자. 더불어서 하나의 루프로 수행하기 힘든 작업을 중첩 루프를 이용하여 해결하는 방법도 알아보자

#사용자 정의 함수 #중첩 루프

사용자 정의 함수

우리가 스크래치에서 했던 것처럼 "cough"라고 세 번 말하는 C 프로그램을 작성하고 싶으면 어떻게 해야할까? 가장 간단한 방법은 아래처럼 작성하는 것이다.

#include <stdio.h>

int main(void)
{
	printf('cough\\w');
	printf('cough\\w');
	printf('cough\\w');
}

단순히 printf를 세 번 반복하면 되지만, 동일한 작업을 반복하는 것이기 때문에 사용자 정의 함수 루프를 이용하면 아래 코드와 같이 더 단순화할 수 있다. for를 사용해 간단하게 변경해보자

#include <stdio.h>

int main(void)
{
	for(int i = 0; i < 3; i++) // (int i = 1; i <= 3; i++) 이렇게 적어도 된다!
	{
		printf('cough\\w');
	}
}

어렵지 않게 만들 수 있다. 또 다른 방법으로 나만의 함수를 만드는 방법도 있다.

#include <stdio.h>

void cough(void)
{
	printf('cough\\w');
}

int main(void)
{
	for(int i = 0; i < 3; i++)
	{
		cough(); // cough 함수가 어떻게 구현된 것인지 알 필요 없이 제 코드의 기능에만 집중할 수 있음
	}
}

void를 입력하고 원하는 함수명(cough)을 적은 뒤 괄호 안에 void를 적어준다. 그리고 printf로 cough를 출력하는 코드를 작성했다.

우리가 지금까지 사용하던 get_int, get_string 등의 함수는 우리가 직접 구현할 필요가 없었다. 과거의 어떤 사람들이 모두 구현해두었기 때문이다. 이와 같이 함수의 이름을 cough로 하는 나만의 함수를 구현할 수 있다. int main(void)의 안에 cough(함수명)를 사용해보자. 그럼 우리가 정의해둔 대로 cough가 출력된다. 이제 main 함수는 cough 함수가 어떻게 구현되었는지 알 필요 없이 자기 코드의 기능에만 집중할 수 있다.

하지만 여기도 문제가 있다. 함수를 1개가 아닌 여러개를 만들수록 main 함수는 아래로 내려가기 때문이다. 중요한 것이 아래에 있는 것보다 바로 나오는 것이 보기 좋다. 그럼 main 함수를 위로 올리고 cough함수를 내려보면 어떻게 될까? 실행을 해보면 오류가 발생한다. main 함수에서 cough()함수를 사용했으나 cough 함수는 아래에 있기 때문이다!

C는 오래되었고 똑똑하지 않으므로 아래에 cough라는 함수가 있을 것이라 생각하지 못한다. C는 오로지 내가 시킨대로만 행동한다. 이것을 해결하려면 다시 cough함수를 위로 올려야 한다. 물론 이것은 악순환의 반복이다. 영원히 새로운 함수를 위에 올릴 순 없기 때문이다.

이 문제에 대한 다른 대안이 있다.

#include <stdio.h>

void cough(void); // 함수 프로토타입

int main(void)
{
	for(int i = 0; i < 3; i++)
	{
		cough();
	}
}

void cough(void)
{
	printf('cough\\w');
}

void cough(void)를 세미콜론과 함께 위로 올리는 것이다. 마치 이전에 cough를 봤던 것처럼 C를 속이는 방법으로 cough 함수를 전부 본 적은 없어도 이름은 본적이 있으니 main 함수에 나올 때까지 코드를 계속 읽도록 하는 것이다.

이번에는 cough 함수를 좀 더 다재다능하게 만들어 원하는 횟수만큼 cough를 출력할 수 있도록 해보자


#include <stdio.h>

void cough(int n);

int main(void)
{
	cough(3);
}

void cough(int n) // cough 세부 정의
{
	for(int = 0; i < n; i++)
	{
		printf('cough\\w');
	}
}

여기서 맨 아래의 void cough(int n){ ... }는 cough라는 이름의 함수를 우리가 직접 정의한 것으로, cough() 안의 int n 함수가 입력값을 받아서 int 형식을 갖는 n이라는 변수를 저장하겠다는 의미이다. 그리고 { } 안의 내용을 보면 n번 동안 cough를 출력하는 for 루프가 있다.