티스토리 뷰

반응형

🎓 C++ 클래스 코드와 헤더 파일 분리 완전 가이드

C++로 객체지향 프로그래밍을 시작하다 보면 자연스럽게 클래스를 정의하고 사용하는 방법을 배우게 됩니다.
하지만, 클래스를 작성하는 과정에서 헤더 파일(.h)소스 파일(.cpp)을 분리하는 이유와 기준은 막상 직접 코드를 짜보지 않으면 이해하기 어렵습니다.

이 글에서는 C++에서 자주 사용하는 클래스 코드 분리 방식에 대해 처음부터 끝까지 설명드리겠습니다.
처음 배우는 분도 이해할 수 있도록, 왜 분리하는지 → 어떤 기준으로 → 어떻게 구현하는지 단계별로 정리하겠습니다.




✅ 1. 클래스 코드와 헤더의 분리란?

C++에서 클래스를 작성할 때, 보통 하나의 파일에 모두 작성하지 않고 아래와 같이 나눕니다:

구분 확장자 역할
헤더 파일 .h 또는 .hpp 클래스의 선언 (interface)
소스 파일 .cpp 클래스의 구현 (implementation)

헤더 파일은 클래스가 무엇을 할 수 있는지 알려주는 선언부입니다.
소스 파일은 함수들이 어떻게 동작하는지 구현하는 정의부입니다.

예를 들어, 헤더 파일은 설계도, 소스 파일은 실제 건물 짓는 과정이라고 볼 수 있습니다.



✅ 2. 왜 분리해야 할까? – 분리의 목적과 장점

클래스 코드 분리는 단순한 스타일의 문제가 아니라, 유지보수와 협업, 성능 측면에서 많은 이점을 줍니다.

📌 주요 이유와 장점

목적 설명
가독성 향상 인터페이스와 구현을 분리해 코드가 더 명확해짐
재사용성 증가 헤더만 include 하면 여러 파일에서 클래스 사용 가능
컴파일 효율성 구현만 바뀌면 전체 컴파일이 아닌 일부만 재컴파일 가능
캡슐화 실현 내부 구현을 숨기고 인터페이스만 공개 가능
협업에 유리 선언/구현을 나눔으로써 역할 분담과 충돌 최소화




반응형

 


✅ 3. 어떤 기준으로 나누는가?

이제 가장 중요한 질문입니다.

❓ 어떤 내용을 헤더에 넣고, 어떤 내용을 소스에 넣어야 할까?

📌 핵심 기준

구분 기준 설명
헤더 파일 (.h) "이 클래스는 무엇을 할 수 있나요?" → 기능 선언만
소스 파일 (.cpp) "그 기능은 어떻게 동작하나요?" → 구현 내용

✅ 헤더에 들어가는 것들

  • 클래스 이름 및 구조
  • 멤버 변수 선언
  • 멤버 함수의 원형 (선언)
  • 생성자/소멸자 선언
  • 상수, typedef, enum 등 인터페이스용 요소
  • #ifndef, #define, #endif 등의 Include Guard

✅ 소스 파일에 들어가는 것들

  • 함수 구현 (ClassName::FunctionName 형태)
  • 생성자/소멸자의 실제 구현
  • 내부 로직, 알고리즘



✅ 4. 예제로 배우는 코드 분리

📁 MyClass.h – 클래스 선언 (인터페이스)

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass {
private:
    int value;

public:
    MyClass();              // 생성자
    void setValue(int v);   // 값 설정 함수
    int getValue() const;   // 값 반환 함수
};

#endif

📁 MyClass.cpp – 클래스 정의 (구현)

#include "MyClass.h"

MyClass::MyClass() {
    value = 0;
}

void MyClass::setValue(int v) {
    value = v;
}

int MyClass::getValue() const {
    return value;
}

📁 main.cpp – 사용 예시

#include <iostream>
#include "MyClass.h"

int main() {
    MyClass obj;
    obj.setValue(42);
    std::cout << obj.getValue() << std::endl;
    return 0;
}



✅ 5. 파일 구조 및 컴파일 방법

📦 디렉토리 구조

프로젝트 폴더/
├── MyClass.h      ← 선언부
├── MyClass.cpp    ← 정의부
└── main.cpp       ← 실행 파일

🛠️ 컴파일 명령어 (g++ 기준)

g++ main.cpp MyClass.cpp -o myprogram
MyClass.cpp를 빼고 컴파일하면 링크 에러 발생 → 정의가 없기 때문입니다.



반응형

 


✅ 6. 주의할 점: 헤더에 구현을 넣으면 안 되는가?

보통은 헤더에는 구현을 넣지 않습니다. 그 이유는 다음과 같습니다:

  • 구현을 넣으면 모든 .cpp 파일마다 복사되며 중복 정의 문제 발생 가능
  • 변경 시 모든 파일이 다시 컴파일되어 비효율적

✅ 예외 상황

  • 템플릿 클래스: 컴파일 타임에 정의가 필요하기 때문에 구현도 헤더에 포함
  • inline 함수: 짧고 자주 호출되는 함수는 성능 최적화를 위해 헤더에 구현 가능



✅ 7. 마무리 요약

항목 헤더 파일 (.h) 소스 파일 (.cpp)
역할 선언 (무엇을 할 수 있는지) 구현 (어떻게 할 것인지)
가독성 인터페이스만 보여줌 로직에 집중 가능
포함 여부 #include로 사용 컴파일 시 함께 포함
예외 템플릿, 인라인 함수 일반 함수 정의




✨ 정리 문장 하나로 기억하자

“헤더에는 ‘무엇’을, 소스에는 ‘어떻게’를.”
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함