본문 바로가기
Computer Science/C 언어

[C 10] 프로그램 조직화 (Program Organization)

by rnasterofmysea 2024. 12. 8.
반응형

10장: 프로그램 조직화 (Program Organization)

 

  • 헤더 파일: 함수 선언, 데이터 구조 정의.
  • 소스 파일: 함수 구현.
  • 컴파일 및 링크: 여러 파일을 개별적으로 컴파일한 뒤 실행 파일로 결합.
  • Makefile: 대규모 프로젝트의 빌드 프로세스를 효율적으로 관리.

10.1 프로그램의 구성

C 프로그램은 코드의 모듈화재사용성을 위해 여러 파일로 분리하여 작성합니다.
프로그램의 구성 요소:

  1. 헤더 파일 (.h): 함수와 상수의 선언부.
  2. 소스 파일 (.c): 함수의 구현부.
  3. 링킹 (Linking): 여러 개의 .c 파일을 연결하여 실행 파일 생성.

10.2 헤더 파일

1. 헤더 파일의 역할

  • 함수 프로토타입, 매크로, 상수, 데이터 타입 정의.
  • 여러 파일 간 공용 인터페이스 제공.
  • 중복 정의 방지 (#ifndef, #define).

2. 헤더 파일 작성 예제

#ifndef HEADER_H     // 중복 포함 방지
#define HEADER_H

void printMessage();  // 함수 프로토타입 선언

#endif

10.3 소스 파일

1. 소스 파일의 역할

  • 함수의 구현부 포함.
  • 헤더 파일을 통해 다른 소스 파일과 연결.

2. 소스 파일 작성 예제

#include <stdio.h>
#include "header.h"

void printMessage() {
    printf("Hello, C Programming!\n");
}

10.4 헤더와 소스 파일의 연결

1. 파일 구성 예제

project/
├── main.c
├── module.c
└── header.h
  • header.h: 함수 선언
  • module.c: 함수 구현
  • main.c: 프로그램 실행 진입점

2. main.c 예제

#include "header.h"

int main(void) {
    printMessage();  // module.c에서 구현된 함수 호출
    return 0;
}

3. 컴파일 및 실행

gcc -c main.c       # main.o 생성
gcc -c module.c     # module.o 생성
gcc -o program main.o module.o  # 실행 파일 생성
./program

출력 결과:

Hello, C Programming!

10.5 다중 파일 프로그램의 필요성

  1. 모듈화
    • 파일별로 기능을 분리하여 유지보수 용이.
    • 예: 입력 처리, 계산, 출력 등을 각각의 파일로 분리.
  2. 재사용성
    • 공통 로직을 별도 파일로 만들어 여러 프로그램에서 재사용 가능.
  3. 작업 분담
    • 팀 작업 시 코드 분리로 협업 효율성 증가.

10.6 Makefile

1. Makefile이란?

  • 여러 파일로 구성된 프로그램의 컴파일 자동화를 지원하는 도구.
  • 컴파일 명령과 의존성을 관리.

2. Makefile 예제

# 컴파일러 설정
CC = gcc
CFLAGS = -Wall -g

# 대상 파일
TARGET = program
OBJECTS = main.o module.o

# 기본 빌드
$(TARGET): $(OBJECTS)
	$(CC) -o $(TARGET) $(OBJECTS)

# 개별 파일 컴파일
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 클린업
clean:
	rm -f $(OBJECTS) $(TARGET)

3. Makefile 사용법

make       # 프로그램 빌드
make clean # 중간 파일 삭제

10.7 프로그램 설계 원칙

1. 모듈화 원칙

  • 하나의 파일은 하나의 역할만 담당.
    • 예: 파일 입출력 → fileio.c, 수학 연산 → math.c

2. 정보 은닉

  • 구현 세부 사항은 소스 파일에 포함하고, 헤더 파일은 인터페이스만 제공.

3. 의존성 최소화

  • 파일 간 의존성을 줄여 유지보수성 향상.

10.8 심화 예제: 계산기 프로그램

1. 프로젝트 구조

calculator/
├── main.c
├── calculator.c
├── calculator.h

2. 헤더 파일 (calculator.h)

#ifndef CALCULATOR_H
#define CALCULATOR_H

int add(int, int);
int subtract(int, int);

#endif

3. 소스 파일 (calculator.c)

#include "calculator.h"

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

4. 메인 파일 (main.c)

#include <stdio.h>
#include "calculator.h"

int main(void) {
    int a = 10, b = 5;

    printf("더하기: %d\n", add(a, b));
    printf("빼기: %d\n", subtract(a, b));

    return 0;
}

5. 컴파일

gcc -c main.c
gcc -c calculator.c
gcc -o calculator main.o calculator.o
./calculator

출력 결과:

더하기: 15
빼기: 5

 

 

반응형

'Computer Science > C 언어' 카테고리의 다른 글

[C #12] 포인터 (Pointers)  (1) 2024.12.10
[C# 11] Makefile 분석  (0) 2024.12.09
[C #9] 함수 (Functions)  (3) 2024.12.07
[C #8] 배열 (Arrays)  (1) 2024.12.06
[C #7] 기본 데이터 타입 (Basic Types)  (1) 2024.12.05