본문 바로가기

프로그래밍/C언어

[C언어] 함수(2)

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.




수(FUNCTION)

1. 함수의 원형 선언

저번시간에 우리는 함수를 선언 할 때 선언부(반환타입,함수이름,매개변수 선언)구현부(구현할 문장)로 구성되어 있다는 것을 배웠습니다. 

int sum(int x, int y){

int result = x + y;


return result;

}


여기서 함수의 선언부만 적는 것을 함수의 선언이라고 합니다. 그렇다면 함수의 원형을 선언하는 이유는 무엇일까요 ?


예를 들어 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
 
int main(void) {
    int result = sum(54);
    printf("result 의 값은 %d 입니다.", result);
 
    return 0;
}
int sum(int x, int y) {
    int result = x + y;
 
    return result;
}
 
 
cs


컴파일러는 소스를 위에서 아래로 한번만 읽기 때문에 함수의 호출이 정의 한것 보다 앞서 있기 때문에 sum 함수가 정의되지 않았다는 경고(warning C4013)를 띄웁니다. 이 경고를 피하기 위해서는 아래와 같이 호출되기전에 함수를 선언을 해주어야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
 
int sum(int x, int y);
int main(void) {
    int result = sum(54);
    printf("result 의 값은 %d 입니다.", result);
 
    return 0;
}
int sum(int x, int y) {
    int result = x + y;
 
    return result;
}
 
 
cs


3번째 줄에 보이는 것과 같이 int sum(int x , int y); 을 해주어야만 경고를 없앨 수 있습니다.


2. 소스의 분리


몇 천줄 혹은 몇만줄의 소스가 있을 경우 이것을 하나의 소스파일에만 작성한다면 나중에 소스를 수정하거나 추가 할 때 어려움이 있습니다. 그렇기 때문에 관련된 소스들만 따로 분리 할수 있습니다.  예제를 통해서 보도록 하겠습니다. 


<operator.c>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
 
int sum(int x, int y);
int gob(int x, int y);
 
 
int main(void) {
    int result1 = sum(54);
    int result2 = gob(54);
    printf("result1 의 값은 %d 입니다.\n", result1);
    printf("result2 의 값은 %d 입니다.\n", result2);
    return 0;
}
 
 
 
cs


<sub.c>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int sum(x, y);
int gob(x, y);
 
int sum(x, y) {
    int result = x + y;
    return result;
}
 
int gob(x, y) {
    int result = x * y;
    return result;
}
cs


하나의 소스파일을 operator.c 소스파일과 sub.c 소스 파일로 나누었습니다. 


나누지 않았다면 


int sum(x, y) {

int result = x + y;

return result;

}


int gob(x, y) {

int result = x * y;

return result;

}


이 부분이 operator.c 소스파일의 main 함수 밑에 있었겠죠 ? 이렇게 몇 줄안된다면 굳이 나눌 필요가 없지만 앞에서 설명한 것과 같이 몇만 줄이 된다면 하나의 소스파일보다는 몇개의 소스파일로 나누는 것이 보기에도 좋고 유지보수 할때도 편리 할 것입니다.


소스를 나누었을 때 장점을 요약하여 보겠습니다.


1) 소스파일이 짧아져서 관리하기 쉽다.

2) 컴파일 시간이 짧아진다.

3) 프로그램의 개발시간이 짧아진다. (한사람은 operator.c 를 다른사람은 sub.c 를 개발할 수 있다.)

4) 재사용성이 높아진다.


3. 헤더 파일


위에서 살펴 본 것과 같이 소스를 분할하여 사용하면 많은 장점이 있습니다. 하지만 소스 파일마다 함수의 선언을 중복하여 포함시켜야 합니다. 그렇기 때문에 선언부가 변경 될 때 마다 모든 소스파일의 선언부를 변경해 주어야 합니다. 이러한 단점을 해소하기 위해 함수의 선언을 별도의 파일로 저장하고 이 파일의 이름만 포함 시키는 방법을 사용합니다. 이 파일을 헤더 파일이라고 합니다.


그렇다면 예제를 통하여 알아 보겠습니다.


<header.h>


1
2
int sum(int x,int y);
int gob(int x,int y);
cs


<operator.c>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include "header.h"
 
 
int main(void) {
    int result1 = sum(54);
    int result2 = gob(54);
    printf("result1 의 값은 %d 입니다.\n", result1);
    printf("result2 의 값은 %d 입니다.\n", result2);
    return 0;
}
 
 
 
cs


<sub.c>


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include "header.h"
 
int sum(x, y) {
    int result = x + y;
    return result;
}
 
int gob(x, y) {
    int result = x * y;
    return result;
}
cs


솔루션 탐색기는 다음과 같습니다.



이렇게 헤더 파일을 만들어 주면 선언부를 변경할 경우 헤더 파일만 변경해 주면 됩니다.  #include <stdio.h> 와 같은 표준라이브러리의 헤더 파일은 <> 를 쓰지만 그 외에는 "header.h" 처럼 " " 를 사용 합니다.


오늘의 강의는 여기서 마치도록 하겠습니다.


다음시간에는 지역변수(local variable),전역변수(global variable),정적변수(static variable)에 대해서 알아 보도록 하겠습니다.


수고하셨습니다.

'프로그래밍 > C언어' 카테고리의 다른 글

[C언어] 포인터(1) - 포인터란 ?  (1) 2017.04.20
[C언어] 지역변수, 전역변수,정적변수  (1) 2017.04.19
[C언어] 함수(1)  (1) 2017.04.17
[C언어] 연습문제  (0) 2017.04.17
[C언어] 연습문제(2)  (0) 2017.04.17