본문 바로가기

Programming/C

C 언어 | 사용자 정의 함수와 중첩 루프

✔ 학습목표

사용자 정의 함수와 중첩 루프를 작성할 수 있다.

 

 

사용자 정의 함수

프로그래밍을 하다 보면 반복적으로 작성해야 하는 코드가 있다. 이런 코드를 여러 번 쓰지 않고 함수 형태로 저장해두면 코드를 간결하고 이해하기 쉽게 만들 수 있다. 이것이 사용자 정의 함수다.

 

"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함수를 보면 프로그램을 보다 간단하게 이해할 수 있고, 궁금한 기능이 있다면 특정 함수만 찾아가면 된다.

 

 

 

함수 형식 출처

 

Programiz: Learn to Code for Free

 

www.programiz.com


 

이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.

 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

'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