본문 바로가기

IT/DataStructure

C파일, header 파일, main.c 파일 - (2)

C에서 어떻게 Reusability, Encapsulation, Abstraction이 구현 될까?

 

1. Header File: 인터페이스, front-end: 캡슐화와 추상화를 할 수 있는 핵심이다.

DA_Stack_Bag.h 헤더파일 예시

Preprocessor commands: #ifndef, #define 를 활용함으로써 중복을 방지 할수 있고(.c파일이 여러개인 경우), 변화에 대응할 수있다.(TYPE이 int 에서 float으로 변경할 필요가 있는 경우) 

 

Variable declaration: 구조체 변수를 정의 할수 있다.

 

Function prototypes(without body): .c  구현코드에서 사용되는 함수의 형태만 정의한다.  .c 파일의 기능을 사용하는 사용자에게 .h 파일의 내용만 제공하고 .c파일은 .o 형태의 목적 코드만 제공할 수 있다. java와 같은 고수준 언어에서 interface만 제공하고 구현코드는 숨기는 것과 비슷한 원리이다. 

 

2. c 구현파일 (.c): 헤더파일에서 정의한 기능을 구현한다.

#include "DA_Stack_Bag.h"

/* ************************************************************************
    Struct DynArr, Stack, Bag
************************************************************************ */
struct DynArr{
    TYPE* data;   // data array
    int size;
    int capacity;
    DynArr* stackArray;  // stack and bag are all DynArr type. So, can recursively define
    DynArr* bagArray;
};

/* ************************************************************************
    Dynamic Array Functions
************************************************************************ */
/**
 *  DynArr* newDynArr(int capacity)
 *  Entry: Array capacity
 *
 *  Output: memory allocation for dynamic memory
 *          initializing capacity from the inpu
 *          initializing size = 0
 *
 *  Ref:    capacity is the total size of array, size is the number of data
 */

DynArr* newDynArr(int capacity)
{
    assert(capacity >= 0);  
    DynArr* myDA = (DynArr*)malloc(sizeof(DynArr));  // Allocate for dynamic Array
....                                    

3. main 파일: 전체 목적코드를 활용하여 전체 흐름을 정하는 코드이다. 또는 하나하나 구현파일 (.c)을 Test하는 코드를 작성할 수 있다. 

#include "DA_Stack_Bag.h"

void assertTrue(int predicate, char *message)
{
    printf("%s: ", message);
    if (predicate)
        printf("PASSED\n");
    else
        printf("FAILED\n");
}
 
int main(int argc, char* argv[])
{

    DynArr *myDA;
    myDA = newDynArr(2);

/* ************************************************************************
    Dynamic Array Tests
************************************************************************ */

    printf("\n\nTesting addDynArr...\n");
    addDynArr(myDA, 3);
    addDynArr(myDA, 4);
    addDynArr(myDA, 10);
    addDynArr(myDA, 5);
    addDynArr(myDA, 6);
   
    printf("The array's content: [3,4,10,5,6]\n");
    assertTrue(EQ(getDynArr(myDA, 0), 3), "Test 1st element == 3");
    ...
 
 
 

** .c 구현파일을 기능 단위로 개발하여 재사용성을 높일 수 있고, 헤더파일로 추상화된 정보만 제공하고 캡슐화 할 수 있다. 위의 예에서  헤더파일의 typedef struct DynArr 을 통해 DynArr 중에서 공개할 변수만 공개할 수 있고, 원시 함수와 기능 명세만 제공하는 캡슐화를 통해 정보은닉이 가능하다. 

 

객체지향의 특징과 매우 유사하다. 또한 왜 객체지향 언어가 나오게 되었는지 생각해 볼 수 있다. header 파일을 보면 사용자 구조체를 정의하고(멤버변수) 함수들의 원형(메쏘드: 인터페이스)이 정의된다.

'IT > DataStructure' 카테고리의 다른 글

C파일, header 파일, main.c 파일 - (1)  (0) 2022.12.29
왜 C인가?  (0) 2022.12.29
Putty vs Xshell  (0) 2022.12.29