함수



위의 그림은 함수의 기본 형태이다. 


함수를 만드는 이유 !


해결해야 할 문제의 규모가 크거나 그 형태가 복잡한 경우, 한꺼번에 모든분제를 해결하려 들지말고, 작은 문제부터 하나씩 해결해 나아간다. 크고 복잡한 문제를 작게 나눠서 하나씩 해결해 나아가는 것이 보다 빠르게, 정확히 문제를 해결하는 원칙이 된다.

 main함수에서 모든 문제를 해결하려는 것보다, 여러개의 작은 함수들을 디자인해놓고 이들을 이용해서 하나의 프로그램을 엮어가야 한다. 


" Divide and Conquer!" 나누어서 정복하라!


main이라는 하나의 함수로 정복하려고 하지말고, 작은 크기의 함수로 나누어서 정복하라. 그리하면 문제의 발생 및 프로그램의 요구사항 변경으로 인산 소스코드의 변경이 필요한 경우에, 변경의 범위를 축소 및 제한 할 수 있다.


함수의 유형은 4가지가 있다.


1. 전달인자 O, 반환 값 O


ex) 덧셈 기능의 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
 
int Add(int n1,int n2)
{
    return n1+n2;
}
 
int main()
{
    int sum;
    sum=Add(3,5);
    
    printf("덧셈결과:%d\n",sum);
    return 0;
}
 

cs

덧셈결과:8

- 전달인자는 int형 정수 둘이며, 이 둘을 이용한 덧셈

- 덧셈결과는 반환이 되며, 따라서 반환형도 int형으로 선언

- 함수의 이름은 Add


main함수에서 2개의 인자를 전달하여, n1과 n2로 받은다음, 두 정수의 합을 반환하는 함수이다.


2. 전달인자 O, 반환 값 X


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
 
void Add(int n1,int n2)
{
    printf("덧셈결과:%d\n",n1+n2);
}
 
int main()
{
    Add(3,5);
    
    return 0;
}
 

cs

덧셈결과:8

반환형은 void로 '반환하지 않는다'라는 뜻이다. 함수의 몸체부분을 보면 return 문이 없다.


3. 전달인자 X, 반환 값 O


1
2
3
4
5
6
7
int Add(void)
{
    int n1;
    scanf("%d",&n1);
    
    return n1;
}

cs

매개변수 선언에 void가 위치했다. 그러므로 main함수로부터 전달을 받는 매개변수가 없고, 반환하는 값만 정수형인 것을 확인할 수 있다.


4. 전달인자 X, 반환 값 X


1
2
3
4
void Add(void)
{
    printf("두 개의 정수를 입력하면 덧셈결과가 출력된다.\n");
}

cs

반환값도, 전달하는 매개변수도 없다. 단순히 메시지를 전달하는 함수이다.


return값의 의미!

1. 함수를 빠져나간다.

2. 값을 반환한다.


간혹 반환형이 void인 경우에는 return 문을 사용할 수 없는 것으로 아는 경우가 있는데, 반환형이 void인 함수에서도 다음의 형태로 return문을 삽입할 수 있다.

1
2
3
4
5
6
7
void noReturnType(int num)
{
    if(num<0)
        return// 값을 반환하지 않는 return문!
    ....
}
 

cs

위의 4행의 return문은 반환할 값이 명시되어 있지 않은데, 이는 값의 반환 없이 그냥 함수를 빠져나가는 의미로 쓰인다. 

그래서 간혹 void형에도 return문이 사용되는 경우가 있다.


함수의 정의와 그에 따른 원형의 선언


1번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
 
int Increment(int n)
{
    n++;
    
    return n;
}
 
int main(void)
{
    int num=2;
    num=Increment(num);    // 본 적 있는 함수
    
    return 0;
}
 

cs


2번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
 
int main(void)
{
    int num=2;
    num=Increment(num); // 본 적 없는 함수
    
    return 0;
}
 
int Increment(int n)
{
    n++;
    
    return n;
}
 

cs


1번의 경우 Increment함수의 정의가 Increment함수의 호출문보다 먼저 등장하고 있어, 무리없이 컴파일이 가능하다.

하지만 2번의 경우, Increment함수의 정의에 앞서 Increment함수의 호출문이 먼저 등장했기 때문에 컴파일러에 에러가 발생한다.

이럴 경우, 함수가 호출되기전에 미리 정의되어 있어야 하는데, 미리 앞에서 알려주기만 하면 된다.

int Increment(int n); < 이렇게 말이다.!


ex) 2번 변경 후

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
 
int Increment(int);   // 앞서 함수의 선언
 
int main(void)
{
    int num=2;
    num=Increment(num);
    
    return 0;
}
 
int Increment(int n)    // 함수의 정의
{
    n++;
    
    return n;
}
 

cs

3행에 함수를 미리 선언을 해줌으로써, 이를 알고 컴파일에 지장이 없이 잘 돌아갈 것이다. 
3행의 매개변수의 이름을 생략해서 선언하는 것이 가능하다
int Increment(int n); == int Increment(int);
int Increment(int n1, int n2); == int Increment(int, int);

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

C // 재귀함수  (0) 2017.12.16
C // 변수  (0) 2017.12.15
C// 조건에 따른 흐름의 분기  (0) 2017.12.11
C // 반복문  (0) 2017.12.07
C // printf함수와 scanf 함수  (0) 2017.12.02

+ Recent posts