목차

C++ 스터디 #14: 헤더파일

시간 2021년 8월 17일 화요일 20:00 ~ 22:00
장소 ZOOM
참가자 -

1. 헤더 파일

1.1 헤더 파일이란?

헤더 파일이란 컴파일러에 의해 다른 소스 파일에 자동으로 포함된 소스 코드의 파일을 말한다. 일반적으로 자주 사용하는 기능들을 기능들을 미리 함수로 선언하고 정의해 놓았다.
대표적으로 우리가 지금까지 써왔던 #include <iostream> 의 <iostream>도 cout, cin, endl 등의 기본 입출력과 관계된 객체들을 정리해 둔 헤더파일이다. <iostream> 은 컴파일러 제작사가 만들어 배포하는 '표준 라이브러리 디렉토리'에 존재한다.

1.2 std 접두어

표준 라이브러리에 있는 함수나 변수는 std 표준 네임스페이스에 포함되어 있다. 그래서 표준 라이브러리를 사용할때는 std:: 접두사를 붙여야 한다.

#include<iostream>

int main()
{
    std::cout << "Hello world!" << std::endl;

    return 0;
}
우리가 지금까지 사용했던 using namespace std;는 std:: 접두사를 계속 붙이지 않기 위함이었다. 이를 이용하면 다음과 같이 코드를 바꿀 수 있다.

#include<iostream>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    return 0;
}

2. 자주 사용하는 헤더 파일

2.1 iostream

지금까지 많이 써 왔던 iostream은 C++ 입출력 기본을 제공한다. Input/Output Stream(입출력 스트림)에서 이름을 따왔다. cin, cout, endl 등의 함수를 포함한다.

#include<iostream>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    return 0;
}

2.2 string.h

string.h은 C++ 표준 문자열 클래스를 제공한다. 메모리 블록이나 문자열을 다룰 수 있는 함수들을 포함하고 있다.

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
    char str1[] = "Hello, world!";
    char str2[100];

    strcpy_s(str2, str1);
    cout << str2 << endl;

    return 0;
}

2.3 math.h

cmath는 기초 수식 함수들을 구현하는 C 프로그래밍 언어의 표준 라이브러리 안의 함수들의 모임이다.

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int num1 = 5;
    int num2 = pow(num1, 2);
    
    cout << num2 << " " << sqrt(num2) << endl;

    return 0;
}

2.4 time.h

time.h은 시간과 날짜를 얻거나 조작하는 함수들을 포함하고 있다.

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
int main()
{
    cout << time(NULL) << endl;
 
    srand((unsigned int)time(NULL));
    cout << rand() % 10 << endl;
 
    return 0;
}

2.5 stdlib.h

stdlib.h는 동적 메모리 할당을 위한 수동 메모리 관리를 수행한다. malloc, free, new, delete 등의 함수를 포함한다.

#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
    int* p;
    p = new int;

    delete p;

    return 0;
}

2.6 windows.h

windows.h는 윈도우 개발자들이 필요한 모든 매크로들, 다양한 함수들과 서브시스템에서 사용되는 모든 데이터 타입들 그리고 윈도우 API의 함수들을 위한 정의를 포함하는 윈도우의 C 및 C++ 헤더 파일이다.

#include<iostream>
#include<Windows.h>
using namespace std;

class Circle
{
public:
    Circle(int xval, int yval, int r);
    void draw();
    void move();

private:
    int x, y, radius;
};

Circle::Circle(int xval, int yval, int r)
    : x(xval), y(yval), radius(r)
{

}

void Circle::draw()
{
    HDC hdc = GetWindowDC(GetForegroundWindow());
    Ellipse(hdc, x - radius, y - radius, x + radius, y + radius);
}

void Circle::move()
{
    x += rand() % 50;
}

int main()
{
    Circle c1(100, 100, 50);
    Circle c2(100, 200, 40);

    for (int i = 0; i < 20; i++)
    {
        c1.move();
        c1.draw();
        c2.move();
        c2.draw();
        Sleep(1000);
    }

    return 0;
}

3. 원하는 헤더 파일 만들고 사용하기

3.1 개요

클래스를 외부에 정의하면 여러 소스 파일에서 이 클래스를 사용할 수 있다. 서로 다른 소스에서 같은 클래스를 사용하려 할때, 하나의 새롭게 클래스에 대한 모든 선언을 하는것은 힘들다. 따라서 클래스를 헤더 파일소스 파일로 나누어 작성하면 더 좋을 수 있다.

3.2 내가 만든 클래스를 헤더 파일로 사용하기

내가 만든 클래스를 헤더 파일로 사용하는 예를 Car 클래스를 통해 살펴보자.

<car.h>

#include<iostream>
#include<string>
using namespace std;

class Car
{
    int speed;
    int gear;
    string color;

public : 
    int getSpeed();
    void setSpeed(int s);
};
먼저 이렇게 car.h 헤더파일을 선언해준다. car.h에는 클래스의 선언이 들어간다.
이후 멤버 함수 getSpeed()와 setSpeed(int s)는 별도의 소스 파일인 car.cpp에서 정의 할 수 있다. 이때, car.cpp에는 car.h를 반드시 포함하여야 하고 #include car.h 를 한 위치에 car.h가 들어가게 된다.
car.h는 #include “car.h” 로 포함할 수 있다.

<car.cpp>
#include "car.h"

int Car::getSpeed()
{
    return speed;
}

void Car::setSpeed(int s)
{
    speed = s;
}

이후 다른 소스 파일에서 Car 클래스를 사용하려면 헤더 파일 car.h만 포함하면 된다. 새로운 소스 파일인 main.cpp에서 Car 클래스를 사용하는 것을 살펴보자.

<main.cpp>

#include "car.h"

int main()
{
    Car myCar;

    myCar.setSpeed(100);
    cout << "현재 속도는 " << myCar.getSpeed() << endl;

    return 0;
}
이들은 다음 사진과 같이 서로 다른 소스 파일이 된다.

이렇게 클래스의 선언(car.h)과 구현(car.cpp)을 따로 함으로써 개발할 때 car.h를 여러 소스 파일에서 사용할 수 있게 되었다.