티스토리 뷰
반응형
🎓 C++ 클래스 코드와 헤더 파일 분리 완전 가이드
C++로 객체지향 프로그래밍을 시작하다 보면 자연스럽게 클래스를 정의하고 사용하는 방법을 배우게 됩니다.
하지만, 클래스를 작성하는 과정에서 헤더 파일(.h)과 소스 파일(.cpp)을 분리하는 이유와 기준은 막상 직접 코드를 짜보지 않으면 이해하기 어렵습니다.
이 글에서는 C++에서 자주 사용하는 클래스 코드 분리 방식에 대해 처음부터 끝까지 설명드리겠습니다.
처음 배우는 분도 이해할 수 있도록, 왜 분리하는지 → 어떤 기준으로 → 어떻게 구현하는지 단계별로 정리하겠습니다.
✅ 1. 클래스 코드와 헤더의 분리란?
C++에서 클래스를 작성할 때, 보통 하나의 파일에 모두 작성하지 않고 아래와 같이 나눕니다:
헤더 파일은 클래스가 무엇을 할 수 있는지 알려주는 선언부입니다.
소스 파일은 함수들이 어떻게 동작하는지 구현하는 정의부입니다.
예를 들어, 헤더 파일은 설계도, 소스 파일은 실제 건물 짓는 과정이라고 볼 수 있습니다.
✅ 2. 왜 분리해야 할까? – 분리의 목적과 장점
클래스 코드 분리는 단순한 스타일의 문제가 아니라, 유지보수와 협업, 성능 측면에서 많은 이점을 줍니다.
📌 주요 이유와 장점
반응형
✅ 3. 어떤 기준으로 나누는가?
이제 가장 중요한 질문입니다.
❓ 어떤 내용을 헤더에 넣고, 어떤 내용을 소스에 넣어야 할까?
📌 핵심 기준
✅ 헤더에 들어가는 것들
- 클래스 이름 및 구조
- 멤버 변수 선언
- 멤버 함수의 원형 (선언)
- 생성자/소멸자 선언
- 상수, 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. 마무리 요약
✨ 정리 문장 하나로 기억하자
“헤더에는 ‘무엇’을, 소스에는 ‘어떻게’를.”
반응형
'프로그래밍 > 홍정모의 따라배우는 C++' 카테고리의 다른 글
왜 인자 전달 앞에 붙이는 const를 붙일까? (0) | 2025.05.13 |
---|---|
클래스에서 Const란? 1편 (0) | 2025.05.13 |
This 포인터란 무엇인가? C++ (0) | 2025.05.13 |
클래스에서 소멸자란? C++ (0) | 2025.05.12 |
위임생성자란? (0) | 2025.05.11 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 류근관
- 심리학
- 인프런
- 티스토리챌린지
- C
- Python
- 파이썬
- 열혈프로그래밍
- 일본어문법무작정따라하기
- 뇌와행동의기초
- 사회심리학
- 인지부조화
- 여인권
- C/C++
- 정보처리기사
- 백준
- 윤성우
- 데이터분석
- 오블완
- K-MOOC
- 통계학
- 일문따
- 보세사
- 일본어
- 통계
- c++
- 회계
- 강화학습
- stl
- 코딩테스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함