Media Log


1. 함수의 정의


이번편에서는 함수(Function)에 대해서 알아보도록 하겠습니다. 함수란 뭘까요? 이 함수란 것은, 특정한 작업을 수행하는 또는 서로 관련있는 코드들의 모임으로 하나의 단위를 말합니다. 이 함수란 것은 모듈(module) 이라고도 하며, 우리가 배우는 C언어는 모듈러 프로그래밍(modular programming)이기도 합니다. 즉, 모듈(=함수)가 중심이 되는 언어로써, 재사용이 가능하고 유지 보수가 쉬워진다는 등 여러가지 장점을 지니고 있습니다.

<프로그램에선 여러개의 함수가 각각 하나의 부품처럼 동작한다>

우리가 알고있는 프로그램은 함수로 구성되어 있고 그 함수들이 순차적으로 실행됨으로 프로그램이 정상적으로 작동합니다. 이는 독립적인 기능을 지니며 프로그램을 구성하는 부품이라 할수 있습니다. 프로그램이 해야 할일은 모두 함수가 담당하며 핵심인 메인 함수아래서 체계적으로 실행됩니다. 함수는 다양한 곳에서 접할수 있습니다. 중고등부 수학에서라던지, 반복해서 무언갈 만들고 있는 기계에서까지! 본격적으로 이해하고 그 다음 우리가 함수를 사용하고 프로그램을 만들어 보도록 합시다.

함수를 정의하는 예는 다음과 같습니다.

<데이터 타입> 함수명(매개변수1, 매개변수2, ...)
{
  함수 본체;
} 

여기서 데이터 타입은 만약에 정수형 데이터를 반환(return)하게 된다면 int를, 실수형을 반환하게 된다면 double를, 반환하는 값이 없다면 void를 쓰게 됩니다. 데이터 타입란에 void가 아닌 다른 자료형 혹은 사용자가 정의한 자료형 등이 왔다면 그 자료형에 맞게 반환을 해주어야 한다는 것을 기억하고 계세요. 이어서 함수명은 우리가 이 이름으로 함수를 호출*하게 되는데 함수의 기능을 제대로 표현해 줄 수 있는 이름이 좋습니다. 매개변수 목록은 함수를 호출할 때 우리가 어떠한 값을 함수에게 넘겨주려면 이곳에 매개변수의 데이터 타입과, 매개변수의 이름을 제대로 명시해야 합니다. (함수의 세부적인 사항은 추후 강좌를 진행하면서 설명합니다.)


* 호출(call): 우리가 알고있는 호출. 즉, '함수를 부른다'라고 생각하시면 됩니다.

2. 함수의 사용


간단하게 함수의 정의를 알아보았고, 이제는 함수를 우리가 직접 정의하여 호출을 해보도록 하겠습니다. 우선 반환형이 int형이고, 두 수를 덧셈하여 결과를 돌려주는 함수를 만들어볼 것이므로 두개가 필요하겠죠? 아래 예를 한번 보고, 함수가 어떤 것인지 간단하게 살펴보도록 합시다.

#include <stdio.h>

int sum(int a, int b) {
	return a + b;
}

int main()
{
	int a, b;

	scanf("%d%d", &a, &b);
	printf("a의 값: %d\n", sum(a, b));
	return 0;
}

결과:

20 30
a의 값: 50
계속하려면 아무 키나 누르십시오 . . .


3행에서 sum이란 함수를 정의했으며 a와 b값을 인수로 전달할수 있도록 하였고, sum 함수 호출시 전달받은 a와 b를 더하여 반환(return)하도록 하였습니다. 그리고 메인함수에서 사용자로부터 a와 b값을 입력받아 sum을 호출하고 a + b의 결과값을 출력 하였습니다. 간단하게 정리하여 보면, 우리가 만약 10과 20이란 값을 a와 b에 넣어 sum의 매개변수로 넘겨주면 그 a의 값과 b의 값을 더한 값이 돌아오는 즉, 반환하여 그 값을 출력합니다. sum(a, b) 자리에 10과 20을 더한 30이란 값이 돌아온다는 소리입니다.

또 다르게, 우리가 5와 4란 값을 입력하면 sum 함수를 호출하여 9를 반환하고 그 값을 출력하는걸 볼 수 있습니다. 데이터를 전달하기 위해 선언되는 변수(3행의 a와 b)를 매개변수(parameter)라고 합니다. 그리고 이렇게 정의된 함수는 우리가 호출하고 싶을때 몇번이든지 호출이 가능하며 함수를 사용하기 전 메인 함수가 등장하기 전에 정의되야 하거나 컴파일러에게 함수가 정의되어 있음을 알리기 위해 프로토타입(prototype)으로 선언해야 합니다. 만약에 sum 함수를 프로토 타입으로 선언하게 되면 뒤에서 sum 함수가 나올것이라는 것과 어느 인수를 요구하는지 알릴수 있게 됩니다. 이 예제의 sum 함수를 프로토 타입으로 선언하면 다음과 같습니다. 

#include <stdio.h>

int sum(int a, int b);

int main()
{
	int a, b;

	scanf("%d%d", &a, &b);
	printf("a의 값: %d\n", sum(a, b));
	return 0;
}

int sum(int a, int b) {
	return a + b;
}
위 예제는 처음 예제와는 다른점이 없으며 그저 sum 함수를 프로토 타입으로 선언하였다는 것밖에 존재하지 않습니다. (여기서 프로토타입 선언은, 메인 함수가 정의된 코드 뒤에 정의된 함수를 호출하게 된다면 호출된 함수의 이름을 찾을 수 없어 오류가 발생하게 됩니다. 그렇기 때문에, 메인 함수가 정의되기 이전에 이러한 함수가 있음을 알려주어야만 호출이 가능합니다.) 여기서 매개변수는 전달되는 데이터 값을 임시로 저장하기 위한 저장공간일 뿐이지 굳이 a, b로 하시지 않고 어떻게 작성하던 결과값에는 영향을 미치지 않습니다.

예를 들어서, Swap이란 함수를 정의하고, 매개변수 a와 b의 값을 서로 바꾸는 기능을 하는 함수라도 실제로 넘어간 a의 b의 값이 서로 바뀌지는 않는다는 겁니다. 매개변수 a와 b, 그리고 호출할때 넘겨준 a와 b는 다른 변수입니다.


  1. BlogIcon 유키웹 at 2012.02.08 01:21 신고 [edit/del]

    감사영ㅋ
    실시간업뎃쩔음ㅅ.ㅅ

    Reply
  2. BlogIcon 김지수 at 2012.04.30 22:22 신고 [edit/del]

    우옹 이해가 쏙쏙 되네요ㅎㅎ

    Reply
  3. 김승현 at 2012.09.14 20:37 신고 [edit/del]

    감사합니다~

    Reply
  4. 김승현 at 2012.09.14 20:53 신고 [edit/del]

    저기 근데여ㅠㅠ 위에 예제대로 실행했더니 자꾸 오류가 나는데요ㅠㅠ

    Reply
  5. 김승현 at 2012.09.14 21:59 신고 [edit/del]

    printf("%d", Sum(a, b); <=이 부분을
    printf("%d", Sum(a, b)); <=이렇게 바꾸어 주었더니 다행이되네여~ㅠㅠ
    제가 처음 시작하는거라 기본적인것도 잘몰라서 그랬습니다.

    Reply
  6. Iron at 2012.12.24 19:18 신고 [edit/del]

    함수의 사용 첫번째 예제 역시 printf 마침표 앞에 )가 없습니다. 수정 부탁드리겠습니다 ~_~;;

    Reply
  7. 안상용 at 2013.07.22 10:15 신고 [edit/del]

    좋은자료 감사드립니다.

    Reply
  8. ZiNee at 2013.08.20 18:11 신고 [edit/del]

    좋은 강좌 감사합니다. 이해가 잘 됩니다.

    Reply
  9. 공부생 at 2013.10.25 10:46 신고 [edit/del]

    비주얼 스튜디오 2008 로 따라하고있는데요.
    마지막 함수 프로토타입 부분에 관한 설명이
    main이 먼저나오고 밑에 sum 함수가 나오면 오류가 뜬다고 나왔는데
    굳이 맨 윗부분에 int sum(int a, int b); 를 선언해주지않아도 결과가 나오는데
    이게 정상인가요??

    Reply
    • BlogIcon EXYNOA at 2013.10.25 18:41 신고 [edit/del]

      VS는 컴파일러 옵션에 /Zg가 붙으면 함수 프로토타입을 생성해주므로 에러가 발생하지 않는 것입니다. 한번 컴파일러 옵션에서 /Zg를 제거해보세요. 그리고 다시 컴파일 하시면 에러가 뜨는 것을 보실 수 있습니다.

  10. 사단원 at 2013.11.17 22:45 신고 [edit/del]

    #include <stdio.h>

    int sum(int a, int b) {
    return a + b;
    }

    int main()
    {
    int a, b;

    scanf("%d %d", &a, &b);
    printf("a의 값: %d\n", sum(a, b));
    return 0;
    getchar();
    }
    보고 따라쓴 소스입니다. 그런데 자꾸
    error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    라는 오류가뜨면서 실행이안됩니다. 왜이런거죠?

    Reply
    • BlogIcon EXYNOA at 2013.11.18 22:53 신고 [edit/del]

      보안 상 scanf 함수가 아닌 scanf_s 함수를 사용하라는 에러입니다.

      물론 scanf_s 함수를 쓰시는 것도 좋지만, 공부하기 위해서 하시고 계신거라면 scanf 함수의 사용도 크게 문제되는 부분이 없습니다.

      무시하시려면 #define _CRT_SECURE_NO_WARNINGS 처럼 전처리문으로 정의하시면 에러가 발생하지 않습니다.

  11. 생초보 at 2013.12.16 14:54 신고 [edit/del]

    매개변수 a,b가 함수 정의될 때와 메인함수 내에서 사용될때
    일반적으로 달라도 된다면 다르게 쓰는게 이해가 더 쉽지 않을까요??

    Reply
    • BlogIcon EXYNOA at 2013.12.16 18:10 신고 [edit/del]

      그건 각자 코딩 스타일에 차이가 있는것 같습니다. 같은게 편한 사람이 있고, 달라야 이해가 되는 사람이 있는 것처럼요.

  12. chobo at 2014.06.12 22:16 신고 [edit/del]

    문자를 입력받으려면 어떻게써야하나요?

    Reply
  13. 프로그 at 2014.10.30 10:52 신고 [edit/del]

    여기있는 C, C++만 제대로 공부해도 언어 사용하는데 지장 없는건가요?

    Reply
    • BlogIcon EXYNOA at 2016.09.27 22:59 신고 [edit/del]

      주관적인 의견이지만 게시글 제목에 강좌라고 써붙였음에도, 강좌 글의 내용이 상당히 부실하다고 생각하고 있으므로 다른 서적을 병행하여 공부하시는 것이 좋다고 생각합니다.

  14. 초보 at 2017.09.09 15:58 신고 [edit/del]

    설명을 쉽게하셔서 이해가 잘 가네요 감사합니다.

    Reply
  15. 컴맹 at 2018.02.20 13:44 신고 [edit/del]

    처음에는 정말 잘 알아들을 수 있었는데 여기서부터 헷갈리기 시작하네요.
    그래도 끝까지 한번 해보겠습니다. 감사합니다. 좋은 글 올려주셔서

    Reply

submit

티스토리 툴바