코드 분리


일반적으로 하나의 파일이 하나의 기능을 담당하도록 구성

C언어 기준

extern

. 변수 혹은 함수의 자료형 및 선언 위치를 알려주는데 사용됨

. 함수의 경우 extern 선언을 생략 가능

1
2
3
4
...
  extern int num;	// int형 변수 num이 외부에 선언되어 있음
  extern void Increment(void);	// void Increment(void) 함수가 외부에 정의도어 있음
  // void Increment(void); 의 형태로 생략가능함

static

. 전역변수에 대한 static 선언은 외부파일 의 접근을 차단하는 역할을 함

##### 파일분할 예시

1
2
/* num.c */
int num=0;
1
2
3
4
5
6
7
8
9
10
11
12
/* func.c */
extern int num;		// 외부 위치에 num이 선언되어 있음을 컴파일러에 알림

void Increment(void)
{
    num++;    
}

int GetNum(void)
{
    return num;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* main.c */
#include <stdio.h>

// 두 함수가 외부 위치에 정의되어 있음을 컴파일러에 알림
extern void Increment(void);	
extern int GetNum(void);

int main(void)
{
    int a = 0;
    a = GetNum();
    printf("num is : %d \n", a);
    Increment();
    a = GetNum();
    printf("num++ is : %d \n", a);
    return 0;
}

1

헤더파일 포함 방법

extern 방식 보다 일반적으로 사용됨

1
2
3
#include <header.h>		// C의 표준 헤더파일에서 해당 파일을 찾음

#include "header.h"		// 소스파일이 저장된 디렉토리에서 헤더 파일을 찾음
헤더파일 중복 회피 방법

. C 전처리문(매크로)를 활용함

. #ifdef , ifndef를 활용하여 관련 내용이 정의되어 있을 경우, 재 포함시키지 않도록 조절

. 명시적으로 한 번 include 되는 헤더파일일 경우에도, 만약을 대비해 조건문을 설정해 놓는 것이 좋음

1
2
3
4
5
6
7
8
9
10
/* div.h */
#ifndef __DIV_H__   // __DIV_H__ 가 정의되어 있지 않다면, 정의(아래 define)
#define __DIV_H__   

typedef struct div{
    int quotient;    // 몫
    int remainder;  // 나머지
} Div;

#endif
1
2
3
4
5
6
7
8
/* div-func.h */
#ifndef __DIV_FUNC_H__
#define __DIV_FUNC_H__

#include "div.h"
    Div IntDiv(int num1, int num2);

#endif
1
2
3
4
5
6
7
8
9
10
/* div-func.c */
#include "div-func.h"

Div IntDiv(int num1, int num2)
{
    Div dval;
    dval.quotient = num1 / num2;
    dval.remainder = num1 % num2;
    return dval;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* main.c */
#include <stdio.h>
#include "div.h"
#include "div-func.h"	// 선언되는 헤더파일을 포함하면, 컴파일러가 알아서 정의된 함수를 포함시켜 줌

int main(void)
{
    Div val = IntDiv(5, 3);
    printf("몫: %d \n", val.quotient);
    printf("나머지: %d \n", val.remainder);

    return 0;
}

코드 분할 일반적 예
1
2
3
4
5
6
7
/* basicArith.h */

#define PI 3.14
double Add(double num1, double num2);
double Min(double num1, double num2);
double Mul(double num1, double num2);
double Div(double num1, double num2);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* basicArith.c */

double Add(double num1, double num2)
{
    return num1+num2;
}
double Min(double num1, double num2)
{
    return num1-num2;
}
double Mul(double num1, double num2)
{
    return num1*num2;
}
double Div(double num1, double num2)
{
    return num1/num2;
}
1
2
3
4
/* areaArith.h */

double TriangleArea(double base, double height);
double CircleArea(double rad);
1
2
3
4
5
6
7
8
9
10
11
12
/* areaArith.c */

#include "basicArith.h"

double TriangleArea(double base, double height)
{
    return Div(Mul(base, height), 2);
}
double CircleArea(double rad)
{
    return Mul(Mul(rad, rad), PI);
}
1
2
3
4
/* roundArith.h */

double RectangleRound(double base, double height);
double SquareRound(double side);
1
2
3
4
5
6
7
8
9
10
11
12
13
/* roundArith.c */

#include "basicArith.h"

double RectangleRound(double base, double height)
{
    return Mul(Add(base, height), 2);
}
double SquareRound(double side)
{
    return Mul(side, 4);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* main.c */

#include <stdio.h>
#include "areaArith.h"
#include "roundArith.h"

int main(void)
{
    printf("삼각형 넓이(및변 4, 높이 2: %g \n",
            TriangleArea(4,2));
    printf("원 넓이(반지름 3): %g \n",
            CircleArea(3));
    
    printf("직사각형 둘레(및변 2.5, 높이 5.2: %g \n",
            RectangleRound(2.5,5.2));
    printf("정사각형 둘레(변의 길이 3): %g \n",
            SquareRound(3));
}

C++ 기준

C++은 일반적으로 클래스 선언은 헤더 파일로 구현, 멤버 함수의 정의는 .cpp로 구현함

4

태그:

카테고리:

업데이트: