======C++ 스터디 #14: 헤더파일====== | 시간 | 2021년 8월 17일 화요일 20:00 ~ 22:00 | | 장소 | ZOOM | | 참가자 | - | {{youtube>XfBpI1HKCO4?medium}} =====1. 헤더 파일===== ==== 1.1 헤더 파일이란? ==== 헤더 파일이란 컴파일러에 의해 다른 소스 파일에 자동으로 포함된 소스 코드의 파일을 말한다. 일반적으로 자주 사용하는 기능들을 기능들을 미리 함수로 선언하고 정의해 놓았다. \\ 대표적으로 우리가 지금까지 써왔던 #include 도 cout, cin, endl 등의 기본 입출력과 관계된 객체들을 정리해 둔 헤더파일이다. 은 컴파일러 제작사가 만들어 배포하는 __'표준 라이브러리 디렉토리'__에 존재한다. ==== 1.2 std 접두어 ==== 표준 라이브러리에 있는 함수나 변수는 std 표준 네임스페이스에 포함되어 있다. 그래서 표준 라이브러리를 사용할때는 std:: 접두사를 붙여야 한다. #include int main() { std::cout << "Hello world!" << std::endl; return 0; } 우리가 지금까지 사용했던 ''using namespace std;''는 std:: 접두사를 계속 붙이지 않기 위함이었다. 이를 이용하면 다음과 같이 코드를 바꿀 수 있다. #include using namespace std; int main() { cout << "Hello world!" << endl; return 0; } ===== 2. 자주 사용하는 헤더 파일 ===== ==== 2.1 iostream ==== 지금까지 많이 써 왔던 iostream은 C++ 입출력 기본을 제공한다. Input/Output Stream(입출력 스트림)에서 이름을 따왔다. cin, cout, endl 등의 함수를 포함한다. #include using namespace std; int main() { cout << "Hello world!" << endl; return 0; } ==== 2.2 string.h ==== string.h은 C++ 표준 문자열 클래스를 제공한다. 메모리 블록이나 문자열을 다룰 수 있는 함수들을 포함하고 있다. #include #include 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 #include 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 #include #include 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 #include using namespace std; int main() { int* p; p = new int; delete p; return 0; } ==== 2.6 windows.h ==== windows.h는 윈도우 개발자들이 필요한 모든 매크로들, 다양한 함수들과 서브시스템에서 사용되는 모든 데이터 타입들 그리고 윈도우 API의 함수들을 위한 정의를 포함하는 윈도우의 C 및 C++ 헤더 파일이다. #include #include 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 클래스를 통해 살펴보자. \\ \\ '''' #include #include 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"'' 로 포함할 수 있다. \\ \\ '''' #include "car.h" int Car::getSpeed() { return speed; } void Car::setSpeed(int s) { speed = s; } 이후 다른 소스 파일에서 Car 클래스를 사용하려면 헤더 파일 car.h만 포함하면 된다. 새로운 소스 파일인 main.cpp에서 Car 클래스를 사용하는 것을 살펴보자. \\ \\ '''' #include "car.h" int main() { Car myCar; myCar.setSpeed(100); cout << "현재 속도는 " << myCar.getSpeed() << endl; return 0; } 이들은 다음 사진과 같이 서로 다른 소스 파일이 된다. \\ {{:activity:public:2021:cpp:헤더파일.png?400|}} \\ 이렇게 클래스의 선언(car.h)과 구현(car.cpp)을 따로 함으로써 개발할 때 car.h를 여러 소스 파일에서 사용할 수 있게 되었다.