언어 자료구조 알고리즘/C 언어 문법

3.헤더파일과 소스파일의 내용

언제나휴일 2009. 8. 19. 05:47
반응형
헤더파일과 소스파일의 내용

 

 

다루는 내용

    - 헤더 파일에 포함되는 내용

    - 소스 파일에 포함되는 내용

    - 책에서 프로젝트 구성 방법과 철학

 

이번 항목에서는 간단한 학생 관리 프로그램을 예를 들면서 헤더파일과 소스파일에 어떠한 내용이 들어갈 수 있는지에 대해 살펴보도록 하자. 

 

1. ehlib - 일반적으로 사용할 수 있는 자원 정의

 

 

ehlib.h

 

 

 

ehlib.h

1~2 typedef 형식명 정의
4,40 #ifdef, #ifndef,#else,#endif 상수명 정의(미정의)에 따라 내부 컴파일에 포함할 지 결정
7~12 #include 해당 헤더 파일의 내용을 포함시킴
14 #pragma 옵션에 따른 다양한 매크로
#pragma warning(disable:xx) XX번에 해당하는 경고 메시지를 생략해 달라는 표현
5, 16 #define 상수 정의
18,28 enum 열거형
34~38 extern 전역 자원에 대한 명시문
 

 

 

ehlib.c

이 책에서 작성한 일반화 함수는 eh라는 prefix가 붙고 함수명은 모두 소문자와 _의 조합으로 되어 있음

 

ehlib.c

1 #include 해당 헤더 파일의 내용을 포함시킴
5 ehgetnum 입력받은 수를 리턴하는 함수
15 ehgetstr 문자열 입력함수
29 ehstrncpy src문자열 중 n개의 문자를 dest에 복사
35 getkey 메뉴 키 입력 메소드(F1,F2,... : 문자 포함)
62 ehclrscr 콘솔 화면을 지우는 함수
 

 

 

2. stu - 학생 자료형 정의 및 함수 정의

stu.h

 

  

stu.h

10 struct 구조체

 

 

 

stu.c

 본 책의 일반화 함수군과 진입점(main)을 제외한 (거의)모든 함수의 함수명은 해당 소스에 정의된 사용자 정의 형식명_기능설명(Stu_InitProperty) 형태로 작성하였으며  첫번째 입력 매개변수는 사용자 정의 형식 * pthis(Stu *pthis) 형태를 지니고 있다.  이는 신뢰성있는 프로그래밍을 하기 위해 사용하는 저자의 습관이다.  물론, 시스템 프로그래밍처럼 신뢰성 외에 속도나 메모리도 중요한 프로젝트에서는 당연히 다른 형태를 사용함에 틀림이 없다.  어떠한 패턴을 모방하기 보다 해당 패턴을 이해하고 자신의 것으로 승화하길 바란다. 또한, 개발자의 시선에서는 '그럴바에 OOP언어로 프로그래밍 하지 왜 C로 하니?'라고 할 것이다.  본인이 이 책을 통해서 전달하려고 하는 것은 C언어를 이용한 프로그래밍이 아니라 응용 개발자가 되기 위해 프로그래밍 언어로 C를 먼저 학습하는 이에게 C학습 후 OOP언어를 익히며 OOP언어에서 제공하는 많은 이점을 느낄 수 있도록 함이 그 이유 중 하나가 될 것이다.

 

 C언어에서는 사용자 정의 형식의 내부에 접근이 . 혹은 -> 연산자를 통해 가능하다.  본 책에서 원하는 신뢰성을 지키기 위해서는 다른 파일에 정의된 사용자 정의 형식의 멤버에 접근하지 못한다는 가정을 확실히 하고 했으면 한다.  OOP언어에서는 사용자 정의 형식(아마도 클래스)을 정의하면서 접근 지정자를 설정할 수 있어서 언어 차원에서 신뢰성 있는 프로그래밍이 용이하도록 제공하고 있다.  앞에서도 얘기했든이 시스템 프로그래밍처럼 신뢰성 외에 속도나 메모리도 중요한 이러한 가정을 하는 것 자체가 효율성을 떨어트릴 것임에 틀림이 없다. 

 

 

 

 3. Demo 학생관리 데모 프로그램에 대한 정의 및 함수 그리고, 진입점

 

Demo.h

프로그램 내에 모든 자료를 관리하는 최상위 구조에 있는 곳이라 extern 자원이 없음

master는 slave를 호출하지만 slave는 기본적으로 master를 호출하지 않는 구조로 프로그래밍

*물론, 함수 포인터와 같은 문법을 이용해서 callback 매커니즘을 사용할 수는 있다.

 

Demo.h

16 #define XXX(YY) 매트로 함수

 

 

Demo.c

사용자(개발자를 의미함, 프로그램 사용자를 이 책에서는 end-user라 명명하여 구분)가 정의한 코드 중 제일 먼저 시작하게 되는 Entry Point(진입점)함수인 main을 포함되어 있다.

 

 

Demo.c

1 선언 포함할 헤더와 전역 변수 선언 및 static 자원 선언
40 main 진입점(Entry Point)
52~296 함수 정의 기능 구현

 

 

 

Demo.c - 선언

3

#include

해당 헤더 파일의 내용을 포함시킴

8

static Demo demo;

static 변수 선언 - 다른 소스에서 해당 변수명 가시성 없음(extern불가)

12~32

static 함수 선언

해당 소스 내에서만 호출이 가능한 함수 선언

 

 

  

Demo.c - main

39   리턴 형식은 해당 프로세스의 종료값(본 책에서는 기술 안 함, windows system 참조)
main 진입점 명 (콘솔 프로그램의 진입점 명이라는 게 좀 더 정확한 표현)
argc 아규먼트 개수(만약 콘솔에서 "ping -t yahoo.co.kr"입력하면 3)
argv 아규먼트 벡터(avgv[0]: "ping" argv[1]:"-t" argv[2]:"yahoo.co.kr")
env 환경 벡터(프로그램 종류, 패스, 작성일, 컴퓨터 호스트 명 등)
40,49 { } 블록 시작과 끝 (함수 정의문의 경우 정의 시작과 끝)
42 pthis 지역변수 선언 및 초기화(&demo)
44~46   함수 호출 
48 return 값 반환과 함수 종료

 

 

 

 

Demo.c - Demo_Run

62 while 제어 구문 중 반복문, 괄호 안의 결과가 참일 동안 반복
63,74 {  } 블록 시작 및 끝
64~72 switch case문 switch괄호에 있는 값이 case 에 해당하는 값인 곳으로 분기문 {} 필수

 

 

 

Demo.c - Demo_Insert

109,118 if 조건에 따라 수행하는 제어문
112,121 return 리턴 형식이 void인 경우 리턴 값을 명시할 수 없음

 

  함수를 정의를 할 때에는 직교성있게 정의를 하자.  여기서 직교성이란 서로 관련이 없는 것을 하나에 정의하지 말고 하나의 정의를 두 군데 이상 나누어 정의하지 말자는 것이다.  이와 같은 논리로 함수를 정의를 하다보면 함수 각각이 컴팩트해지게 될 것이다.  컴팩트한 함수 n개를 조합을 통해 다양성을 제공할 수 있고 유지 보수가 용이한 프로그램이 될 것임에 틀림이 없기 때문이다.  차후 SOA형태의 솔루션을 할 때에는 이와 같은 습관이 많은 도움이 되리라 의심하지 않는다.

 

 

반응형