안녕하세요 ! 초보개발자 입니다.
이 블로그는 개인 공부 정리용 블로그 입니다.
혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.
그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.
그럼 시작하도록 하겠습니다.
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(5, 4); 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(5, 4); 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(5, 4); int result2 = gob(5, 4); 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(5, 4); int result2 = gob(5, 4); 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 |