반응형

 

C언어를 구성하는 단위 항목에 대한 용어를 간단히 설명하도록 하겠습니다. 이 들은 향후에 상세하게 다시 설명이 필요합니다.

 

예약어(keyword, reserved word)

   - C언어의 문법을 정의하기 위해서 사용하는 단어
   - ex). char, int, short, long, return, float, double, if, else, for, while, ...

 

연산자

   - 수치 계산, 비교, 대입 등의 처리를 하는 부호
   - ex). 사칙연산(+, -, *, /, %), 대입(=, +=, -=, *=, /=, %=), 비교연산(==, !=, <, <=, >, >=) ...

 

식별자

   - 함수명, 변수명, 상수명 등 명칭으로 컴파일 결과로 이들은 저장 공간 또는 저장된 위치를 위미함
   - ex). printf, i, j

 

구분자

   - 예약어, 연산자, 식별자들을 구분하는 역할을 하는 공백문자(스페이스, Tab, carriage return, line feed) 및 문장의 끝을 나타내는 세미콜론(;) 등

 


C언어로 코딩을 할 때에, 프로그램 소스의 기본 구성(골격)에 대해서 알아보겠습니다. 

[1. 프로그램 설명부]

[2. Header file 선언부]

[3. Macro 선언부]

[4. 새로운 Type 정의부]

[5. 상수 및 전역 변수 선언부]

[6. 함수 선언부]

[7. 함수 정의부]

C언어 소스 프로그램을 작성할 때에 위의 순서는 표준은 아니고 개발자마다 약간은 다른 형태가 될 수 있으나, 기본 순서는 위와 같이 하는 것이 가독성 등에서 좋을 것 같습니다. C언어를 이제 시작해서 용어나 문법을 모를 수도 있겠지만 향후에 작성하는 프로그램들의 기본 틀을 구성하고 이를 지속적으로 인식하여 자신만의 표준 또는 기준을 가질 것을 권합니다. 위의 항목은 필요한 경우에만 순서 대로 삽입하면 됩니다. 

 

 

1. 프로그램 설명부

/*--------------------------------------------------------------
* 프로그램: sample.c
* 설명: 이프로그램은 xxx에 대한 기능을 제공합니다.
* 작성자 : 홍길동
* 
* history
* 2019.09.17  최초 작성 (by 홍길동)
* 2019.10.02  xxx() 함수에 ???에 대한 오류 수정 (by 홍길동)
*------------------------------------------------------------*/

이 부분은 source 파일에 대한 설명, 작성자, 변경사항, 특이사항 등을 작성하는 부분입니다. C언어에서 /* ~ */는 block comment로 주석문입니다. 주석문 /* ~ */은 C 컴파일러가 Compile을 할 때에 이 부분은 모두 삭제해버리고 Compile을 하므로 코딩에 아무런 영향을 주지 않으며, 개발자들간에 커뮤니케이션을 위한 부분입니다. 

 

 

2. Header file 선언부

#include <stdio.h>
#include <string.h> 

C 언어 코딩에는 다양한 함수들을 사용합니다. 코딩이 완료되면 이를 실행하기 위해서는 컴파일을 합니다. C 컴파일러는 호출한 함수를 정상적으로 잘 사용을 했는 지, 또는 잘못 사용했는 지를 판단합니다. 부적절하게 사용했으면 오류를 발생시킵니다. 호출한 함수에 대해서 파라미터의 갯수나 파라미터의 데이터 타입이 잘못되었는 지, 그리고 함수가 return한 값을 같은 type의 변수에 저장을 하였는 지를 검사합니다. 함수를 잘못 호출하였다면 컴파일 오류를 발생시키게 됩니다. C 컴파일러는 함수를 호출하기 전에 함수의 prototype을 먼저 선언해두어야만 오류 여부를 판단할 수 있습니다.

 

예를들면 printf 함수를 사용하려면 아래와 같은 prototype을 함수를 사용하기 전에 적어두어야 합니다.

int printf(const char *format, ...);

또는

int printf(const char *, ...);

위와 같은 정보를 여러 소스마다 위쪽에 일일이 나열하기 힘들기 때문에 함수의 prototype이랑 사용자 정의 데이터 type, 전역변수 선언, 상수 선언, macro 등을 모아둔 파일인 header 파일을 만들고 이 파일을 #include함으로써 나열한 것과 똑같이 취급하게 됩니다. #include문은 만들어 둔 header file을 읽어서 #include 자리에 모두 기술한 것과 같은 기능을 합니다.  

UNIX / LINUX의 표준 라이브러리들의 header file은 일반적으로 /usr/include 하위 디렉토리에 위치합니다.   

$ cat /usr/include/stdio.h | more

처럼 명령어를 실행하면 stdio.h 파일의 내용을 확인할 수 있습니다. 

이와 같이 header file 선언부에는 그 파일에서 사용한 함수가 포함된 header파일들의 전체 목록을 include하는 곳입니다. (header file을 만드는 방법은 나중에 다시 다루겠습니다.)

 

 

3. Macro 선언부

#define LEN_RNAME      50
#define LEN_ADDR1      128
#define LEN_ADDR2      120

#으로 시작하는 부분(#include, #define ...)은 C언어에서 전처리(preprocessor) 부분이라고 하는 데, 이는 C컴파일러가 컴파일을 하기 전에 Comment부분은 빼고 #으로 시작하는 문장 등은 다른 값으로 치환하거나 하여 c 소스를 내부적으로 다시 생성합니다. 다시 생성된 소스로 실제 컴파일이 일어납니다. (이 부분도 나중에 별도로 다룹니다.) 이 #define문은 앞에 있는 이름을 뒤에 있는 것으로 치환하라는 의미입니다.

#define LEN_NAME  50
......

char user_name[LEN_NAME + 1];
char cust_name[LEN_NAME + 1];

는 

char user_name[50 + 1];
char cust_name[50 + 1];

과 같습니다. 이와 같이 Macro 상수를 선언하는 이유는 모든 종류의 이름의 크기를 같은 값으로 사용하기 위해서 선언합니다. 숫자 50을 직접 사용하면 사용한 곳을 찾아서 모두 50으로 바꿔야 하지만 #define문의 macro 상수를 사용했다면 #define의 숫자만 바꿔주면 사용하는 모든 곳의 값이 바뀌게 됩니다. (#define은 나중에 별도로 다룹니다.)

 

 

4. 새로운 Type 정의부

struct student_info
{
    char name[LEN_NAME + 1];
    char student_no;
    char birth[LEN_DATE + 1];
    .....
};

typedef struct student_info student_info_t;

새로운 유형의 사용자 정의 type을 정의하는 부분입니다. 이 부분은 프로그램에서 처리할 데이터의 자료구조를 정의하는 부분으로 주로 struct type을 정의합니다. 만약 이 자료 구조가 이 소스 파일외에 다른 곳에서도 사용하는 것이라면 별도의 header file을 만들어서 그곳에 기술합니다.

 

 

5. 상수 및 전역 변수 선언부

전역변수나 전역 상수들은 여러 함수들에서 사용되고 이들을 사용하기 위해서는 먼저(위쪽에) 선언이 되어 있어야만 가능합니다. 아래와 같이 전역으로 사용하는 상수와 변수들을 초기화 또는 선언합니다. (상수, 변수는 다시 다룰 것입니다.)

int total_count = 0;
int cur_count   = 0;

const char SERVER_URL[] = "https://www.it-note.kr";

 

6. 함수 선언부

현재 코딩하고 있는 소스 내에서 만든 함수들 중에서 이 함수 내에서만 사용하고 다른 소스에서는 사용하지 않을 함수들에 대해서는 별도의 header 파일을 만들어 포함시키지 않을 것이기 때문에 함수들의 prototype을 직접 목록으로 나열합니다. 

static long sumary(int count, long *all_data);
static long average(int count, long *all_data);
//......

 

7. 함수 정의부

C언어는 main()함수를 시작점으로 각종 함수를 만들고, 호출하는 것이 프로그램 개발의 전부입니다. 이와 같이 실제로 함수를 구현하는 부분을 함수 정의부라고 합니다.

 

int main(int argc, char **argv)
{
    long value[100];
    int  count;
    int  idx;
    
    for(count = 0, idx = 1; idx < argc; idx++, count++) 
    {
        value[count] = atol(argv[idx]);
    }
    
    printf("Sum : %ld\n", summary(count, value));
    printf("Average: %ld\n", average(count, value));
    
    return 0;
}

/*
* 전체 값의 합을 얻는 함수입니다.
*/
static long summary(int cnt, long *value)
{
    long sum = 0;
    int  idx;
    
    for(idx = 0; idx < cnt; idx++) 
    {
        sum += value[idx];
    }
    
    return sum;
}

// ......

 


활용 예제

 

Sample).

 

/*--------------------------------------------------------------
* 프로그램: sample.c
* 설명: 이프로그램은 xxx에 대한 기능을 제공합니다.
* 작성자 : 홍길동
* 
* history
* 2019.09.17  최초 작성 (by 홍길동)
* 2019.10.02  xxx() 함수에 ???에 대한 오류 수정 (by 홍길동)
*------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>

static long summary(int count, long *all_data);
static long average(int count, long *all_data);

int main(int argc, char **argv)
{
    long value[100];
    int  count;
    int  idx;
    
    for(count = 0, idx = 1; idx < argc; idx++, count++) 
    {
        value[count] = atol(argv[idx]);
    }
    
    printf("Sum : %ld\n", summary(count, value));
    printf("Average: %ld\n", average(count, value));
    
    return 0;
}

/*
* 전체 값의 합을 얻는 함수입니다.
*/
static long summary(int cnt, long *value)
{
    long sum = 0;
    int  idx;
    
    for(idx = 0; idx < cnt; idx++) 
    {
        sum += value[idx];
    }
    
    return sum;
}


/*
* 값의 평균을 얻는 함수입니다.
*/
static long average(int cnt, long *value)
{
     return summary(cnt, value) / cnt;
}

 

 

 

 

C Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

 

반응형

'C언어 > 문법' 카테고리의 다른 글

6. 식별자 명명 규칙  (2) 2019.10.22
5. 주석문(Comment)  (0) 2019.10.22
3. C언어의 컴파일 과정  (0) 2019.10.20
2. C언어 개발 환경 (실습 환경)  (0) 2019.10.13
1. C 프로그래밍 언어는?  (2) 2019.10.13
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,