모듈화 프로그래밍 (Modular Programming)
Programming/C 2013. 2. 15. 01:52 |모듈(Module)이란?
: 소프트웨어에서 말하는 모듈이란 프로그램의 일부분을 의미하는 것이다.
C언어를 이용하여 계산기에 관련된 함수들을 구현했다면, 이러한 함수들의 집합도 하나의 모듈이 될 수 있다.
※ 일반적으로 소프트웨어 공학에서 이야기하는 모듈(module)이라는 것은 크게는 하나의 파일이 될 수도 있지만,
작게는 하나의 함수가 될 수도 있다.
외부 변수의 사용: 키워드 extern (External = 외부의, 밖의)의 의미.
: ex) extern int i;
이렇게 선언을 하면, 컴파일러에게 변수 i는 외부에(다른 파일에) 선언되어 있음을 알려주는 것이다.
그래서 컴파일러는 그냥 컴파일을 한다.
※ 외부(다른 파일)에 정의된 함수를 호출하기 위해서 함수를 선언할 때 extern이라는 키워드를 반드시 써야 하는 것은 아니다.
왜냐하면, 함수 선언 자체가 extern의 의미를 포함하고 있기 때문이다.
ex) extern double add(double a, double b);
double add(double a, double b); // 이 둘은 같은 의미이다.
그러나, extern이라는 키워드를 붙여 주는 것이 나쁘지는 않다. 왜냐하면 함수의 정의가 외부에 존재한다는 의미를 부여할 수 있기 때문이다.
외부 접근 금지: 전역 변수 선언시, 키워드 static의 의미.
:전역 변수로 변수 앞에 static 선언을 하면 외부의 접근을 금지한다는 뜻이 된다.(정확히는 변수의 접근 영역을 파일로 제한한다는 뜻.)
ex) static int a; ← extern int a; 접근 불가!!!
int a; ← extern int a; 접근 가능!!!
링크(Link)에 대한 이해
: 컴파일을 하면 오브젝트 파일이 생긴다.(obj파일은 단지 기계어로 변환된 내용만을 지닌 파일이다.)
만약, 모듈화 프로그래밍을 해서 두개의 파일이 있다면 두개의 obj파일이 생성되어있을것이다.
링크는 이 파일 두개를 서로 연결시켜주는 작업을 한다. 그래서 하나의 완성된 실행 파일을 생성한다.
: 최종적인 실행 파일의 생성을 위해서 접근하는 변수가 어디에 존재하는지, 호출하는 함수가 어디에 존재하는지
연결해 주는 작업을 가리켜 링크라 한다.
헤더파일(Header File)의 구현과 유용성
: ANSI 표준에서 정의하고 있는 헤더 파일을 "표준 헤더 파일"이라 한다.
이러한 헤더 파일들을 모아놓은 곳이 "표준 디렉토리"라고 한다.
: 확장자가 .h로 끝나는 파일을 헤더 파일이라고 한다. 헤더 파일은 #include 전처리기 지시자에 의해서 다른 파일 내에 포함된다.
※ 일반적으로 함수의 정의를 헤더 파일에 포함시키지는 않는다. 선언만 헤더 파일에 포함한다.
- 헤더 파일을 포함하는 두 가지 방법 -
ex) #include <abc.h> // 표준 디렉토리에서 abc.h를 찾아서 포함.
#include "c:/include/abc.h" // c:/include 에서 abc.h를 찾아서 포함.
#include "/include/lib/plus.h" // /include/lib/plus.h에 존재하는 plus.h 포함.(유닉스 계열 컴퓨터)
◎ < >를 이용한 헤더 파일의 포함.
: 표준 디렉토리는 컴파일러마다 유지하고 있는 위치가 다르다.
: 표준 디렉토리에 존재하는 헤더 파일을 포함하기 위해서는 < >를 사용한다.
◎ " "를 이용한 헤더 파일의 포함.
: " "를 이용해서 헤더 파일을 포함할 경우 헤더 파일이 존재하는 디렉트로의 위치를 직접 지정하는 것이 가능하다.
: 보통 사용자가 정의하는 헤더 파일은 위치를 정해서 따로 관리하기 마련인데, 이렇게 임의의 위치에 존재하는
헤더 파일을 포함하는 경우, 다시 말하면 사용자가 정의하는 헤더 파일을 포함하는 경우 " "를 이용하게 된다.
※ main 함수를 지니고 있는 파일을 메인 모듈(main module)이라 한다.
여기서는 file.c라는 파일을 만들어 함수의 "정의"를 해두었다.
그리고 메인 모듈로 가선 함수의 "선언"을 해주었다.
자 그런데.. 만약 저 함수들의 인자받는 것이 바뀐다면... 이를테면 void 형으로 바뀐다면...
메인모듈의 있는 함수 원형 선언문 모두를 void로 바꾸어야 한다.
지금은 4개밖에 없지만.. 저것이 10~20개면.. 그리고 다른 파일들도 저 선언을 가지고 있다면..
파일을 돌아다니며 다 바꿔주어야 한다. 참 귀찮을 것이다.
그런데, 헤더파일을 만들어서 거기에 함수 원형을 선언하고 메인 모듈이나 다른 파일들이 #include하는 식이라면...
헤더파일에 있는 함수 선언만 바꿔주면 끝이다.
이러한 번거로운 일들을 편히 하기 위해서 헤더 파일이라는 것을 만든다.
'Programming > C' 카테고리의 다른 글
fprintf와 문자열 형식 (0) | 2013.02.15 |
---|---|
조건부 컴파일 (0) | 2013.02.15 |
전처리기 (Pre-Processor) (0) | 2013.02.15 |
C언어에서의 Token (0) | 2013.02.15 |
메모리 관리와 동적 할당 (0) | 2013.02.15 |