✔ 학습목표
사용자 정의 함수와 중첩 루프를 작성할 수 있다.
사용자 정의 함수
프로그래밍을 하다 보면 반복적으로 작성해야 하는 코드가 있다. 이런 코드를 여러 번 쓰지 않고 함수 형태로 저장해두면 코드를 간결하고 이해하기 쉽게 만들 수 있다. 이것이 사용자 정의 함수다.
"cough"라고 세 번 말하는 프로그램을 작성한다고 생각해보자.
#include <stdio.h>
int main(void)
{
printf("cough\n");
printf("cough\n");
printf("cough\n");
}
가장 단순한 방법은 printf 함수를 세 번 반복해서 사용하는 것이다. 하지만 이는 말 그대로 동일한 작업의 반복이기 때문에 효율적이지 않다.
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 3; i++)
{
printf("cough\n")
}
}
두 번째 방법은 루프 for를 사용하는 것이다. 앞의 코드와 같은 기능이지만 좀 더 간단하게 구현할 수 있다.
#include <stdio.h>
void cough(void);
int main(void)
{
for (int i = 0; i < 3; i++)
{
cough();
}
}
void cough(void)
{
printf("cough\n");
}
세 번째 방법은 사용자 정의 함수를 만드는 것이다. cough라는 이름의 새로운 함수를 만들어 "cough"를 출력하게 만들었다.
#include <stdio.h>
void cough(int n);
int main(void)
{
cough(3);
}
void cough(int n)
{
for (int i = 0; i < n; i++)
{
printf("cough\n");
}
}
좀 더 다재다능하게 만들면 다음과 같다. void cough(int n)에서 void자리는 출력의 종류를, () 안 자리는 입력의 종류를 나타낸다. main함수에서 3이라는 수를 입력하면 cough함수가 정수(int)인 이 입력값을 받아 printf 함수로 "cough"를 세 번 출력하는 방식이다.
이처럼 사용자 정의 함수를 사용하면 main함수를 보다 간단하고 직관적으로 구현할 수 있다. 코드를 처음 본 사람이라도 원하는 기능을 쉽게 찾아낼 수 있는 것이다.
* C는 시키는 대로만 행동한다. 사용자 정의 함수의 첫 줄(프로토타입, 예) void cough(int n);)을 main함수보다 위에 써주지 않으면 프로그램이 작동되지 않는다.
#include <cs50.h>
#include <stdio.h>
int get_positive_int(void);
int main(void)
{
int i = get_positive_int();
printf("%i\n", i);
}
int get_positive_int(void)
{
int n;
do
{
n = get_int("Positive Integer: ");
}
while (n < 1);
return n;
}
예제를 하나 더 보자. 사용자에게서 정수를 받아와 출력하는 프로그램이다.
main함수를 보면 변수 i 에 사용자 정의 함수의 출력 값이 할당된다. 이때 i의 데이터 타입이 정수기 때문에 함수 get_positive_int(void)앞에는 void가 아닌 int가 붙는다.
*사용자 정의 함수를 만들 때 입출력이 없다면 void를 적는다.
사용자 정의 함수를 살펴보면 첫 줄에 int n;이 있다. 이는 컴퓨터에게 n을 달라는 일종의 힌트이며, 어떤 값을 저장할 지 모르기 때문에 그냥 int n;으로 표기한다. 이때 n 은 쓰레기 값(Garbage Value)을 가진다.
이 함수에서는 루프로 do-while을 사용했다. do-while문의 형식은 다음과 같다.
do
{
// statements inside the body of the loop
}
while (testExpression);
while문에서는 ()안의 불리언이 참일 때 코드를 반복한다. 하지만 do-while문에서는 do에서 무조건 한 번은 먼저 수행하고 while문으로 넘어간다.
예제에서는 do안에서 사용자에게 정수 값을 받고, 그것이 1보다 작으면(while (n < 1)) 질문을 반복한다. 만약 1 이상의 정수를 받아냈다면 함수는 그 값을 돌려보내고(return n;), main 함수에서 printf 를 통해 출력한다.
중첩 루프
여러개의 이미지가 가로세로로 쭉 출력되어 있는 게임 프로그램(예) 마리오 게임)을 상상해보자. 이제껏 배운 방식으로는 가로만, 혹은 세로만 이어서 출력할 수 있겠지만 중첩 루프를 사용하면 이를 구현할 수 있다.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int n;
do
{
n = get_int("Size: ");
}
while (n < 1);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("#");
}
printf("\n");
}
}
#을 가로, 세로로 출력하는 프로그램을 예로 들어보자.
프로그램은 변수 n을 선언하고 사용자에게 그 값을 받는다. 이때 do-while문을 사용하여 1 이상의 정수만 받게 한다. 값을 받았다면 루프 for를 통해 이를 출력한다. 이는 첫 번째 루프에서 변수 i를 기준으로 n번(세로), 두 번째 루프(내부 루프)에서 변수 j를 기준으로 n번(가로, 루프가 끝나면 \n을 사용해 줄 바꿈) 실행된다.
생각해보기
사용자 정의 함수를 사용하는 것의 장점은 무엇일까?
1) 효율적이다. 특정 기능을 하는 함수를 구현해놓으면 불필요한 반복을 줄일 수 있다.
2) 가독성이 좋다. 복잡하고 긴 코드라도 main함수를 보면 프로그램을 보다 간단하게 이해할 수 있고, 궁금한 기능이 있다면 특정 함수만 찾아가면 된다.
함수 형식 출처
이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.
'Programming > C' 카테고리의 다른 글
C 언어 | 문자열과 배열 (0) | 2021.02.02 |
---|---|
C 언어 | 배열 (0) | 2021.02.02 |
C 언어 | 자료형, 형식 지정자, 연산자 (0) | 2021.01.30 |
C 언어 | 조건문과 루프 (0) | 2021.01.30 |
C 언어 | 문자열 (0) | 2021.01.30 |