· 사용자 정의 함수
* 사용자 정의 함수
- 우리는 자주 사용하는 기능을 함수로 직접 만들어서 관리할 수 있다.
- 지금 까지 사용했던 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 Sandbox
'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 |