본문으로 바로가기

[C] 함수 보고서

category Layer 7/assignment 2019. 4. 3. 16:44

[1] 함수는 뭐고, 이러한 함수를 왜 활용하는것일까 ?

우리가 코딩할때 무의식적으로 쓰는 

#include <stdio.h> 가 무슨의미일까?

그리고 printf, scanf같이 명령어같은 친구들은 도대체 뭘까?

여러분들은 이미 그 답을 알고있을 것이다.

위의 그림은 stdio.h에 포함되어있는 함수의 목록이다.

이렇게 printf, scanf는 바로 함수이다. 함수는 수학적인 함수와 비슷한 의미이다. 사용자가 정의한대로 그 기능이 실행된다.

#include <stdio.h> 는 이러한 함수를 모아서 하나의 헤더파일로 만든 stdio.h 를 소스에 포함하여 프로그램을 실행할때 stdio 에 있는 함수를 사용할수있도록 해주는것이다.

위에서 함수의 정의에 대하여 설명하였으므로 이제 함수를 사용하는 이유와 함수의 특징을 설명해보겠다.

첫번째 특징은 함수의 재활용성이다. 코드가 길어지면 같은기능을 하는 코드를 여러개 만들어야하는 경우가 생기고는 한다. 이러한 상황에 만들어두었던 함수를 여러번 활용하여 더 편리한 코딩을 할수있다.

두번째 특징은 함수의 모듈성 ( 유지보수의 편리 ) 이다.  코드가 길어진 상태에서 오류가 발생하면, 어디구간에서 오류가 발생했는지 여러번 찾아보아야 한다. 하지만 함수를 사용하여 코딩하면 여러가지의 함수중 오류가 발생한 범위를 찾기 몹시 쉬워진다.  

세번째 특징은 가독성이다. 긴 코드를 함수를 활용하면 자연스럽게 줄어들것이고, 더 읽기 쉬워진다.

이러한 특징을 가진 함수는 배열, 포인터와 함께 C언어의 꽃으로 불려질만큼 사용빈도가 높고, 중요성이 높다. 아래의 내용을 읽어보며 함수를 이해해보자.





[2] 함수의 선언과 실행 순서

함수의 함수를 선언할때에는 크게 2가지의 경우가 있다.

1
2
3
4
5
반환값자료형 함수이름( 전달할 인자 )
{
    코드;
}
int main(){
cs

첫번째는 위와 같이 함수를 위에 먼저 선언한 후에, 그 아래 메인함수를 선언하는 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
반환값자료형 함수이름( 전달할 인자 );
 
main 함수(){
 
:
:
 
}
 
위에서 선언했던 함수의 이름 ( 전달할 인자 );
{
    
}
 

cs

두번째 방법은 "나는 이러한 함수를 쓸꺼야!" 라고 미리 컴파일러에게 알려준 후 main를 사용한다. 

그리고 main 아래에 아까 컴파일러에 알려줬던 함수를 넣는것이다.





[3] 함수의 실행 순서

함수의 실행과정을 알아보기위해 다음의 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h> 
 
void hello() // 3
{
    printf("Hello!"); // 4
// 5
 
int main() // 1
{
    hello(); // 2
    printf(" Hello!"); // 6
// 7
cs

위의 예제에서는 반환값 자료형이 void이고 아무것도 반환되지 않는 hello 함수를 선언하였다. 또한 함수에 인자를 전달하지않고 그저 "Hello, World!" 를 출력하는 함수이다. 

일단 함수는 메인함수에서 실행하기 때문에 일단 메인함수가 첫번째로 실행된다. 그리고 메인함수에서 hello 함수를 호출하고, hello 함수로 간다. 그리고 hello 함수를 실행하고, 끝난 후에 다시 메인으로 돌아간다. 그리고 메인의 나머지 코드를 진행하는 구조이다.






[4] 함수의 4가지 형태


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
 
void hello ( ) // 반환 X, 인자 X
{
    printf(" ( hello function ) Hello!\n");
}
 
void hello2 ( int a ) // 반환 X, 인자 O
{
    printf(" ( hello2 function ) ");
    for(int i=1; i<=a; i++)
    {
        printf("Hello! ");
    }
    printf("\n");
    return ; // 아무것도 반환하지 않음
}
 
int a_b () // 반환 O, 인자 X
{
    int a,b;
    printf(" ( a_b function ) 두개의 숫자를 입력하세요. : ");
    scanf("%d %d",&a,&b);
 
    return (a+b); // 함수내에서 입력받은값의 합 반환 
}
 
int a_b_2 ( int a, int b ) // 반환 O, 인자 O
{
    return (a+b); // 인자로 전달받은 값의 합 반환 
}
 
int main(void)
{
    int x,y;
    printf(" ( main function ) 두개의 숫자를 입력하세요. : ");
    scanf("%d %d",&x,&y);
    hello(); // hello 출력
    hello2(x); // x값만큼 hello 출력
 
    int a_plus_b = a_b(); // 입력후 입력받은값의 합 출력
    printf(" ( a_plus_b function ) %d\n",a_plus_b);
    int a_plus_b_2 = a_b_2(x,y); // x,y 합 출력
    printf(" ( a_plus_b_2 function ) %d\n",a_plus_b_2);
    return 0;
}
 
cs

위의 코드는 함수의 4가지 유형을 정리해놓은 예제이다. 4가지 유형을 글로 정리하면 다음과 같다.

1. 인자 X 반환 X

2. 인자 X 반환 O

3. 인자 X 반환 O

4. 인자 O 반환 O

여기서 알아두어야 할 중요한 것은 함수를 선언하여 인자를 전달할때 함수내에서 선언한 함수를 매개변수라고 하며, 함수에서 인자를 전달하면 매개변수에 복사가 되고, 함수내에서 바뀐 값은 절대로 원본에 ( main 함수에 ) 변화가 가지 않는다는 것이다.

포인터를 사용하면 원본의 값을 바꿀수 있다는것또한 알아두자.

이러한 함수의 4가지 유형을 잘 알아두고, 필요한 상황에 맞춰 사용하도록 하자.





[5] 재귀 함수

재귀함수는 자신을 정의할때 자기 자신을 재참조하는 방법을 뜻한다. 

자기자신을 재참조하면 무한루프가 발생하므로, 이 무한루프에서 빠져나가게 하기 위하여 일정한 조건을 만족하면 재귀함수를 빠져나가게 한다.

일단 다음의 코드를 보자.

Codeup 1099번 문제의 정답 소스를 제공할테니 이를 활용하여 재귀함수의 내용에 대하여 이해해보자. 

문제를보고 코드를 본다면 코드가 의미하는것이 무엇인지 알수있을것이다.

http://codeup.kr/problem.php?id=1099

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
int map[12][12];
 
void back(int x, int y)
{
    if(map[x][y] == 2)
    {
            map[x][y] = 9;
            return ;
    }
    map[x][y] = 9;
 
    if(map[x][y+1!= 1)
        back(x, y+1); // 자기자신을 재참조함
    else if(map[x+1][y] != 1)
        back(x+1, y); // 자기자신을 재참조함
}
 
int main()
{
    int i, j;
    for(i = 1; i <= 10; i++)
        for(j = 1; j <= 10; j++)
            scanf("%d"&map[i][j]);
    back(22);
 
    for(i = 1; i <= 10; i++)
    {
        for(j = 1; j <= 10; j++)
        {
            printf("%d ", map[i][j]);
        }
        printf("\n");
    }
}
cs


[6] 변수 종류 정리

위에서도 말한 매개변수, 지역변수등 여러가지 변수를 정리해보겠다.

매개변수 : 함수에서 인자를 통해 값을 전달할경우 함수에서 선언한 변수를 매개변수라고 한다. 인자는 복사되어 매개변수로 들어가며, 인자자체의 값이 변경되지는 않는다.

지역변수 : 특정 함수내에서 선언되는 변수를 말한다. 지역변수는 그 지역에서만 효력을 다한다 ( Ex. 메인함수에서 선언한 변수는 메인함수에서만 효력을 냄. )

전역변수 : 함수 바깥에 선언하여 어떤함수에도 속하지않으며 모든함수에서 그 효력을 다하는 변수를 전역변수라고 한다.



'Layer 7 > assignment' 카테고리의 다른 글

[C] 달팽이 배열  (0) 2019.04.09
[C] 포인터 보고서  (0) 2019.04.03
[C] 배열 보고서  (0) 2019.03.30
[C] 짝수는 빼고 홀수는 더하자!  (0) 2019.03.29
[C] 팩토리얼 계산기  (0) 2019.03.29