본문으로 바로가기

C++ :: 소스파일, 헤더파일(*.h) 분리 예제

category C++ 2017. 12. 17. 07:28
Edit

C++ :: 소스파일, 헤더파일(*.h) 분리 예제

공부하고 있는 C++ 헤더 개념을 정리하는 글을 써보았습니다. 우선 파일 구조는 다음과 같습니다.


hero.h // class Hero의 헤더 파일
hero.cpp // class Hero의 구체적 소스 코드
main.cpp // 메인 파일




hero.h


#ifndef HERO_H
#define HERO_H
class Hero
{
string name;
short HP;
public:
Hero();
Hero(string name, short HP);
void info();
void set_info(string name, short HP);
};
#endif



헤더 파일 맨 위에 #ifndef, #define, 그리고 마지막 줄에 #endif가 있습니다. 이건 헤더파일을 컴파일러가 호출할 때 여러번 호출되지 않게끔 하는 기능을 갖고 있습니다. 연습용 짤막한 코드에선 없어도 상관 없지만, 프로젝트가 복잡해질수록 반드시 필요해집니다. Preprocessor라고도 부릅니다.

뜻을 풀자면 만약 HERO_H가 정의되어 있지 않다면, 이하의 코드(#endif 전까지의 코드), 즉 헤더 파일의 코드를 HERO_H로 정의(#define)하라. (만약 HERO_H가 정의되어있다면 넘어가라.) 정도가 되겠네요. 여기서 HERO_H는 토큰 이름인데, 관습적으로 헤더파일명 대문자 + “_H”를 쓰는 듯 합니다.

그리고, 클래스 정의 마지막에 세미콜론(;) 붙이는 걸 까먹으시면 안됩니다.



hero.cpp


#include <iostream>
using namespace std;
#include "hero.h"
Hero::Hero(){} // when there's no parameter
Hero::Hero(string name, short HP) // overloading constructor based on params
{
this->name = name;
this->HP = HP;
}
void Hero::info()
{
cout << "--------------------" << endl;
cout << "name: " << this->name << endl;
cout << "HP: " << this->HP << endl;
}
void Hero::set_info(string name, short HP)
{
this->name = name;
this->HP = HP;
}



Hero 클래스에 대한 구체적 정의가 담긴 파일입니다. 3번째 줄에서 hero 헤더파일을 include하는데, 파일 명을 꺽쇠(<)가 아니라 쌍따옴표(“)로 감싸주셔야 에러가 나지 않습니다. 보통 꺽쇠는 (iostream처럼) 시스템 PATH에서 검색하고, 쌍따옴표는 현재 디렉토리에서 해당 파일을 찾기 때문입니다.



main.cpp

#include <iostream>
using namespace std;
#include "hero.h"
int main()
{
Hero Tracer("Tracer", 150), Pharah("Pharah", 200), Mercy;
Pharah.info();
Mercy.set_info("Mercy", 200);
Mercy.info();
}



여기서도 헤더파일명은 꺽쇠(<)가 아닌 쌍따옴표(“)로 감싸줍니다.



컴파일 하기


>  g++ main.cpp hero.cpp -o main



Sublime Text 3의 기본 c++ 빌드는 에러가 날 수 있습니다. 상기의 코드는 메인 파일과 Hero 클래스의 정의가 담긴 hero.cpp를 둘 다 컴파일 하지만, 섭라임 상에서는 main.cpp만 컴파일하기 때문입니다.

상기의 결과로 생성된 main파일은, 터미널 상에서 이하의 커맨드로 실행시킬 수 있습니다.


>  ./main


%23%20C++%20%uC18C%uC2A4%uD30C%uC77C%2C%20%uD5E4%uB354%uD30C%uC77C%28*.h%29%20%uBD84%uB9AC%20%uC608%uC81C%0A@%28Blog%29%5B%uD2F0%uC2A4%uD1A0%uB9AC%2CLinux%5D%0A%0A%uACF5%uBD80%uD558%uACE0%20%uC788%uB294%20C++%20%uD5E4%uB354%20%uAC1C%uB150%uC744%20%uC815%uB9AC%uD558%uB294%20%uAE00%uC744%20%uC368%uBCF4%uC558%uC2B5%uB2C8%uB2E4.%20%uC6B0%uC120%20%uD30C%uC77C%20%uAD6C%uC870%uB294%20%uB2E4%uC74C%uACFC%20%uAC19%uC2B5%uB2C8%uB2E4.%0A%3Cbr%3E%3Cbr%3E%0A%60%60%60plain%0Ahero.h%20//%20class%20Hero%uC758%20%uD5E4%uB354%20%uD30C%uC77C%0Ahero.cpp%20//%20class%20Hero%uC758%20%uAD6C%uCCB4%uC801%20%uC18C%uC2A4%20%uCF54%uB4DC%0Amain.cpp%20//%20%uBA54%uC778%20%uD30C%uC77C%0A%60%60%60%0A%3Cbr%3E%3Cbr%3E%3Cbr%3E%0A%0A%23%23%23%20hero.h%0A%3Cbr%3E%0A%60%60%60cpp%0A%23ifndef%20HERO_H%0A%23define%20HERO_H%0A%0Aclass%20Hero%0A%7B%0A%09string%20name%3B%0A%09short%20HP%3B%0Apublic%3A%0A%09Hero%28%29%3B%0A%09Hero%28string%20name%2C%20short%20HP%29%3B%0A%09void%20info%28%29%3B%0A%09void%20set_info%28string%20name%2C%20short%20HP%29%3B%0A%7D%3B%0A%0A%23endif%0A%60%60%60%0A%3Cbr%3E%3Cbr%3E%0A%uD5E4%uB354%20%uD30C%uC77C%20%uB9E8%20%uC704%uC5D0%20**%23ifndef**%2C%20**%23define**%2C%20%uADF8%uB9AC%uACE0%20%uB9C8%uC9C0%uB9C9%20%uC904%uC5D0%20**%23endif**%uAC00%20%uC788%uC2B5%uB2C8%uB2E4.%20%uC774%uAC74%20%uD5E4%uB354%uD30C%uC77C%uC744%20%uCEF4%uD30C%uC77C%uB7EC%uAC00%20%uD638%uCD9C%uD560%20%uB54C%20%uC5EC%uB7EC%uBC88%20%uD638%uCD9C%uB418%uC9C0%20%uC54A%uAC8C%uB054%20%uD558%uB294%20%uAE30%uB2A5%uC744%20%uAC16%uACE0%20%uC788%uC2B5%uB2C8%uB2E4.%20%uC5F0%uC2B5%uC6A9%20%uC9E4%uB9C9%uD55C%20%uCF54%uB4DC%uC5D0%uC120%20%uC5C6%uC5B4%uB3C4%20%uC0C1%uAD00%20%uC5C6%uC9C0%uB9CC%2C%20%uD504%uB85C%uC81D%uD2B8%uAC00%20%uBCF5%uC7A1%uD574%uC9C8%uC218%uB85D%20%uBC18%uB4DC%uC2DC%20%uD544%uC694%uD574%uC9D1%uB2C8%uB2E4.%20Preprocessor%uB77C%uACE0%uB3C4%20%uBD80%uB985%uB2C8%uB2E4.%0A%3Cbr%3E%0A%uB73B%uC744%20%uD480%uC790%uBA74%20%uB9CC%uC57D%20HERO_H%uAC00%20%uC815%uC758%uB418%uC5B4%20%uC788%uC9C0%20%uC54A%uB2E4%uBA74%2C%20%uC774%uD558%uC758%20%uCF54%uB4DC%28%23endif%20%uC804%uAE4C%uC9C0%uC758%20%uCF54%uB4DC%29%2C%20%uC989%20%uD5E4%uB354%20%uD30C%uC77C%uC758%20%uCF54%uB4DC%uB97C%20HERO_H%uB85C%20%uC815%uC758%28%23define%29%uD558%uB77C.%20%28%uB9CC%uC57D%20HERO_H%uAC00%20%uC815%uC758%uB418%uC5B4%uC788%uB2E4%uBA74%20%uB118%uC5B4%uAC00%uB77C.%29%20%uC815%uB3C4%uAC00%20%uB418%uACA0%uB124%uC694.%20%uC5EC%uAE30%uC11C%20HERO_H%uB294%20%uD1A0%uD070%20%uC774%uB984%uC778%uB370%2C%20%uAD00%uC2B5%uC801%uC73C%uB85C%20%uD5E4%uB354%uD30C%uC77C%uBA85%20%uB300%uBB38%uC790%20+%20%22_H%22%uB97C%20%uC4F0%uB294%20%uB4EF%20%uD569%uB2C8%uB2E4.%0A%3Cbr%3E%0A%uADF8%uB9AC%uACE0%2C%20**%uD074%uB798%uC2A4%20%uC815%uC758%20%uB9C8%uC9C0%uB9C9%uC5D0%20%uC138%uBBF8%uCF5C%uB860%28%3B%29**%20%uBD99%uC774%uB294%20%uAC78%20%uAE4C%uBA39%uC73C%uC2DC%uBA74%20%uC548%uB429%uB2C8%uB2E4.%0A%3Cbr%3E%3Cbr%3E%3Cbr%3E%0A%0A%23%23%23%20hero.cpp%0A%3Cbr%3E%0A%60%60%60cpp%0A%23include%20%3Ciostream%3E%0Ausing%20namespace%20std%3B%0A%23include%20%22hero.h%22%0A%0A%0AHero%3A%3AHero%28%29%7B%7D%20//%20when%20there%27s%20no%20parameter%0AHero%3A%3AHero%28string%20name%2C%20short%20HP%29%20//%20overloading%20constructor%20based%20on%20params%0A%7B%0A%09this-%3Ename%20%3D%20name%3B%0A%09this-%3EHP%20%3D%20HP%3B%0A%7D%0A%0Avoid%20Hero%3A%3Ainfo%28%29%0A%7B%0A%09cout%20%3C%3C%20%22--------------------%22%20%3C%3C%20endl%3B%0A%09cout%20%3C%3C%20%22name%3A%20%22%20%3C%3C%20this-%3Ename%20%3C%3C%20endl%3B%0A%09cout%20%3C%3C%20%22HP%3A%20%22%20%3C%3C%20this-%3EHP%20%3C%3C%20endl%3B%0A%7D%0A%0Avoid%20Hero%3A%3Aset_info%28string%20name%2C%20short%20HP%29%0A%7B%0A%09this-%3Ename%20%3D%20name%3B%0A%09this-%3EHP%20%3D%20HP%3B%0A%7D%0A%60%60%60%0A%3Cbr%3E%3Cbr%3E%0AHero%20%uD074%uB798%uC2A4%uC5D0%20%uB300%uD55C%20%uAD6C%uCCB4%uC801%20%uC815%uC758%uAC00%20%uB2F4%uAE34%20%uD30C%uC77C%uC785%uB2C8%uB2E4.%203%uBC88%uC9F8%20%uC904%uC5D0%uC11C%20hero%20%uD5E4%uB354%uD30C%uC77C%uC744%20%20include%uD558%uB294%uB370%2C%20%uD30C%uC77C%20%uBA85%uC744%20**%uAEBD%uC1E0%28%3C%29%uAC00%20%uC544%uB2C8%uB77C%20%uC30D%uB530%uC634%uD45C%28%22%29**%uB85C%20%uAC10%uC2F8%uC8FC%uC154%uC57C%20%uC5D0%uB7EC%uAC00%20%uB098%uC9C0%20%uC54A%uC2B5%uB2C8%uB2E4.%20%uBCF4%uD1B5%20%uAEBD%uC1E0%uB294%20%28iostream%uCC98%uB7FC%29%20%uC2DC%uC2A4%uD15C%20PATH%uC5D0%uC11C%20%uAC80%uC0C9%uD558%uACE0%2C%20**%uC30D%uB530%uC634%uD45C%uB294%20%uD604%uC7AC%20%uB514%uB809%uD1A0%uB9AC%uC5D0%uC11C%20%uD574%uB2F9%20%uD30C%uC77C%uC744%20%uCC3E%uAE30%20%uB54C%uBB38%uC785%uB2C8%uB2E4.**%0A%3Cbr%3E%3Cbr%3E%3Cbr%3E%0A%0A%0A%23%23%23%20main.cpp%0A%0A%60%60%60cpp%0A%23include%20%3Ciostream%3E%0Ausing%20namespace%20std%3B%0A%23include%20%22hero.h%22%0A%0Aint%20main%28%29%0A%7B%0A%09Hero%20Tracer%28%22Tracer%22%2C%20150%29%2C%20Pharah%28%22Pharah%22%2C%20200%29%2C%20Mercy%3B%0A%09Pharah.info%28%29%3B%0A%0A%09Mercy.set_info%28%22Mercy%22%2C%20200%29%3B%0A%09Mercy.info%28%29%3B%0A%7D%0A%60%60%60%0A%3Cbr%3E%3Cbr%3E%0A%uC5EC%uAE30%uC11C%uB3C4%20%uD5E4%uB354%uD30C%uC77C%uBA85%uC740%20%uAEBD%uC1E0%28%3C%29%uAC00%20%uC544%uB2CC%20%uC30D%uB530%uC634%uD45C%28%22%29%uB85C%20%uAC10%uC2F8%uC90D%uB2C8%uB2E4.%0A%3Cbr%3E%3Cbr%3E%3Cbr%3E%0A%0A%23%23%23%20%uCEF4%uD30C%uC77C%20%uD558%uAE30%0A%3Cbr%3E%0A%60%60%60plain%0A%3E%20%20g++%20main.cpp%20hero.cpp%20-o%20main%0A%60%60%60%0A%3Cbr%3E%3Cbr%3E%0A**Sublime%20Text%203%uC758%20%uAE30%uBCF8%20c++%20%uBE4C%uB4DC%uB294%20%uC5D0%uB7EC%uAC00%20%uB0A0%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.**%20%uC0C1%uAE30%uC758%20%uCF54%uB4DC%uB294%20%uBA54%uC778%20%uD30C%uC77C%uACFC%20Hero%20%uD074%uB798%uC2A4%uC758%20%uC815%uC758%uAC00%20%uB2F4%uAE34%20hero.cpp%uB97C%20%uB458%20%uB2E4%20%uCEF4%uD30C%uC77C%20%uD558%uC9C0%uB9CC%2C%20%uC12D%uB77C%uC784%20%uC0C1%uC5D0%uC11C%uB294%20main.cpp%uB9CC%20%uCEF4%uD30C%uC77C%uD558%uAE30%20%uB54C%uBB38%uC785%uB2C8%uB2E4.%0A%3Cbr%3E%0A%uC0C1%uAE30%uC758%20%uACB0%uACFC%uB85C%20%uC0DD%uC131%uB41C%20main%uD30C%uC77C%uC740%2C%20%uD130%uBBF8%uB110%20%uC0C1%uC5D0%uC11C%20%uC774%uD558%uC758%20%uCEE4%uB9E8%uB4DC%uB85C%20%uC2E4%uD589%uC2DC%uD0AC%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%0A%3Cbr%3E%3Cbr%3E%0A%60%60%60plain%0A%3E%20%20./main%0A%60%60%60%0A%3Cbr%3E%0A%21%5BAlt%20text%5D%28./2017-11-01.png%29%0A