본문 바로가기

Language/C

<C언어 기초> 05. 사용자 정의 함수

· 사용자 정의 함수

* 사용자 정의 함수

 - 우리는 자주 사용하는 기능을 함수로 직접 만들어서 관리할 수 있다.

 

 - 지금 까지 사용했던 printf 와 같은 함수도 과거에 누군가가 만들어 둔 함수이다.

 

 - 사용자에게 5번 인사하는 프로그램을 만든다고 생각해보자.

#include <stdio.h>

int main(void)
{
    for (int i = 0; i < 3; i++)
    {
        printf("hello\n")
    }
}

 

 - 지금까지 배운 내용으로 위를 간단하게 만들 수 있다.

 

 - 하지만 다른 구문들을 떠나 인사를 하는 행위자체에 집중을 하고 싶고, 더 효율적으로 코드를 관리하고 싶을 수 있다. 그래서 위를 함수로 만들어보자.

 

#include <stdio.h>

void hello(void)
{
    printf("hello\n")
}

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

 

 - void 를 선언하며 정의 함수가 시작된다. 이 때 void는 함수가 return하는 값의 자료형이다. 이 함수는 내부에서 printf함수를 실행 시킬 뿐 어떤 값을 반환하지는 않으므로 void로 선언하였다. 이와 관련된 예제는 아래에서 다시 다룬다.

 

 - 어쨌든 hello함수를 만들었다. hello함수는 별도의 변수가 없으므로 괄호안에 void를 넣어주었다.

 

 - 이제 작성한 코드를 보면 for문을 돌며 hello라는 직관적인 함수를 시행하고 있음을 알 수 있다.

 

* 개선

 - 위의 함수를 개선해서 for문 자체도 함수에 넣고, 원하는 숫자만큼 출력을 하도록 해보자.

 

 - 그리고 사용자가 함수를 정의한 내용을 아래에 넣어서 더 보기좋게 만들어보자.

 

#include <stdio.h>

void hello(int n);

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

void hello(int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("hello\n");
    }
}

 

 - 일단 아래에 hello 함수를 정의한 부분을 보자. 함수의 변수로 정수인 변수(n)을 받고 n개 만큼 출력을 시행하도록한다. 이는 위에서 봤었던 코드보다 좀 더 다양하게 활용을 하게 해준다.

 

 - 함수를 정의하는 부분이 단순히 밑에 있으면 컴퓨터는 코드를 위에서부터 순서대로 시행하므로 함수를 찾지 못한다. 따라서 가장 위에서 함수가 있다고 작성해야한다. 이는 사용자 정의 부분의 첫 선언부와 동일하다.

 

* 활용

 - 이번엔 좀 더 동적인 함수를 작성해보자.

 

 - 사용자에게 양수만 입력하도록 하고, 이를 출력해주는 함수이다.

 

#include <cs50.h>
#include <stdio.h>

int get_positive_int(void);

int main(void)
{
    int i = get_positive_int();
    printf("Your number is %i\n", i);
}

int get_positive_int(void)
{
    int n;
    do
    {
        n = get_int("Positive Integer: ");
    }
    while (n < 1);
    return n;
}

 

 - 먼저 사용자 정의 함수를 보자. get_positive_int라는 함수를 만들었다. 따로 변수는 필요없으므로 void를 하였으나 앞 부분이 다르다. 이 함수는 사용자에게 받은 int값을 반환하도록 할 것 이므로 int로써 선언한다.

 

 - 참고로 반환은 출력과 다르다. 출력은 사용자에게 곧바로 보이도록 밖에 내뱉는 것이라면 반환은 이 함수자체의 결과로 할당을 하는 것과 같다.

 

 - 우리는 n에 사용자가 입력한 정수를 받을 것이므로 int n을 먼저 선언한다.

 

 - do while 문은 먼저 실행을하고 나중에 while의 조건을 확인하여 반복하도록 하는 것이다. 여기에서는 n이 1보다 작으면 다시 사용자에게 값을 입력하도록 한다.

 

 - 사용자가 1이상의 숫자를 입력하면 n에 할당되고 루프는 멈춘다. 그리고 함수의 결과로 반환된다.

 

 - 다시 코드로 돌아가보자. 코드를 실행하면 int로 선언된 i가 값을 할당받으려고 할 것이다. 그러면 정의한 함수가 실행되고 사용자에게 n값을 얻어서 반환한다. 그리고 그 값은 그대로 i에 할당된다.

 

 - 마침내 printf함수를 거쳐서 i값, 즉 입력받은 n값이 출력된다.

 

 


 

 

 

참고

 

 

 이 글은 하버드 대학교 David Malan 교수CS50 강의를 수강 후 정리하며 쓴 글입니다. 코드는 C언어로 작성되었으며, 개발환경은 CS50 Sandbox에 최적화되어 있습니다. 일부 라이브러리는 다른 환경에서 별도의 설정이 필요할 수 있습니다.

 

 

 

CS50 공식사이트

 

CS50

Introduction to the intellectual enterprises of computer science and the art of programming. This course teaches students how to think algorithmically and solve problems efficiently. Topics include abstraction, algorithms, data structures, encapsulation, r

cs50.harvard.edu

 

부스트코스

 

다 함께 배우고 성장하는 부스트코스

부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.

www.boostcourse.org

 

CS50 Sandbox

 

CS50 Sandbox

Temporary programming environments for students and teachers.

sandbox.cs50.io

 

 

 

'Language > C' 카테고리의 다른 글

<C언어 기초> 07. 문자열  (0) 2021.01.29
<C언어 기초> 06. 배열  (0) 2021.01.27
<C언어 기초> 04. 자료형과 연산자  (2) 2021.01.23
<C언어 기초> 03. 루프  (0) 2021.01.22
<C언어 기초> 02. 조건문  (0) 2021.01.21