다루는 내용
- 헤더 파일에 포함되는 내용
- 소스 파일에 포함되는 내용
- 책에서 프로젝트 구성 방법과 철학
이번 항목에서는 간단한 학생 관리 프로그램을 예를 들면서 헤더파일과 소스파일에 어떠한 내용이 들어갈 수 있는지에 대해 살펴보도록 하자.
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형태의 솔루션을 할 때에는 이와 같은 습관이 많은 도움이 되리라 의심하지 않는다.
'언어 자료구조 알고리즘 > C 언어 문법' 카테고리의 다른 글
11. 산술 연산자 (0) | 2009.08.19 |
---|---|
10. 연산자 (0) | 2009.08.19 |
9. 변수의 종류 (0) | 2009.08.19 |
8. 변수의 선언과 초기화 (5) | 2009.08.19 |
7.사용자 정의 형식 - 구조체, 공용체, 열거형 (0) | 2009.08.19 |
6.메커니즘 형식 - 배열, 포인터 (0) | 2009.08.19 |
5.기본 형식 - 문자, 정수, 실수형 (0) | 2009.08.19 |
4. 형식(type -자료형) (0) | 2009.08.19 |
2. 프로그램 구성 요소 (0) | 2009.08.19 |
1.프로젝트 생성 (0) | 2009.08.19 |