티스토리 뷰

반응형

 

주어진 학습목표를 이루기 위해서 이해를 우선으로 두고 공부할 것이다.

들어가기 전에 학습목표, 핵심 단어는 강의 자료를 가져올 것이고 그 이후로는 내가 이해하고 공부한 부분을 직접 적고, 마지막에는 배운 점이나 느낀 점을 적도록 하겠다. 

 

 


 

 

들어가기 전에

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

 

학습 목표

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

 

핵심 단어

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

 

 


 

사용자 정의 함수 

 

"cough"를 세 번 말하는 코드를 작성하고 싶으면 아래와 같이 할 수 있다. 우리가 "get_int"와 같은 함수를 우리가 직접 구현하지 않고 사용했듯이 기침을 세 번 하는 cough라는 함수를 만들면 계속적으로 쓸 수 있으며 간편해지고, 더 편리해진다. 

보통 main함수를 가장 위에 올리는데 C는 오래되고, 똑똑하지 않은 언어라 위에서부터 아래의 순서대로 실행하게 된다. 이렇게 되면 있지도 않은 cough();라는 함수를 실행하게 되므로 맨 위에 void cough(void);와 같이 함수를 올려줘서 문제를 해결할 수 있다. 

 

 

#include <stdio.h>

void cough(void);

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

void cough(void)
{
    printf("cough\n");
}

 

 

 

 

아래는 cough함수를 원하는 횟수만큼 출력할 수 있게 한 코드이다. 맨 아래의 void cough(int n){...} 에서 cough( ) 안의 int n 은 함수가 입력값을 받아서 int 형식을 갖는 n이라는 변수에 저장하겠다는 의미이다. 이 함수를 통해 n번동 안 cough를 출력하는 for 루프가 만들어진다. 

#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");
    }
}

 

 

 

 

아래 코드를 보자. get_positive_int 함수를 만들었다. 그래서 int get_positive_int(void) 에서int 부분은 void가 아니고 int 가 된다.

이렇듯 함수 왼쪽에 있는 단어는 출력의 종류를 의미하게 된다. int get_positive_int(void) 괄호 안의 (void)는 입력의 종류를 뜻한다. 만약 입출력이 없다면 void를 적어주면 된다. 

 

 get_positive_int 함수 내에서 int n; 은 컴퓨터에게 n이라는 변수를 달라는 일종의 힌트이다. 그 안에 어떤 값을 저장할지는 아직 모르는 상태이다. 그럼 은 쓰레기 값(Garbage Value)이라고 부르는 값을 가지게 된다. 

 

 get_positive_int 함수 내의 do-while루프를 보자. 이 불리언 표현 while(n <1); 이 참일 때 다음을 수행하라는 뜻이다. 만약 n이 1보다 작다면 계속해서 질문을 반복하게 된다. while을 단독으로 사용하면 while의 조건이 참이어야만 수행을 하지만, do-while은 do에서 무조건 한 번은 먼저 수행하게 해 준다.

 

#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;
}

 

 

 

중첩 루프

 

마리오 게임에서 흔히 보는 것처럼 화면에 여러 개의 이미지를 가로나 세로로 여러 개 이어서 출력하고 싶으면 어떻게 해야 할까? for 루프를 사용할 수 있다. 이때 for 루프를 두 번 돌면서 "#"를 출력한다. 내부 루프에서는 "#"를 출력하고 내부 루프가 끝날 때마다 줄 바꿈을 수행한다. 따라서 최종적으로 가로가 n개, 세로가 n개인 "#"이 출력된다. 

 

#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");
    }
}

 

 

 


 

 

생각해보기

 

사용자 정의 함수를 사용하는 것의 장점은 무엇일까요?

 

단순히 함수만 실행 그 함수의 역할이 실행되므로 재사용을 하더라도 코드가 길어지지 않아 가독성이 좋아진다. 

또한 오류가 생길 가능성이 줄어들게 된다. 

 

함수를 정의할 때도 앞에 void대신 다른 타입을 적을 수 있다는 것을 알았다. 그리고 호이 스팅이 되는 자바스크립트와 달리 C에서는 한 줄 한줄 순서대로 입력해야 하는 부분에서 참 까다롭고 어려울 수 있는 언어라는 생각이 들었다. 

 

 

 

 


Reference : CS50




반응형