1. 입출력 스트림( cout, cin, endl )
#include <iostream> // cout, endl, cin ..
#include <cstdio> // printf, scanf ..
int main()
{
int x = 1;
std::cout << "x is " << x << std::endl;
std::cin >> x;
std::cout << "x is " << x << std::endl;
return 0;
}
iostream 헤더 파일은 C++ 에서 표준 입출력에 필요한 것들(cout, cin, endl ..)을 포함하고 있다.
std::cout 은 std라는 namespace 안에 있는 cout을 사용하기 위해서 colon 두개를 넣어주는 것이다.
using namespace std를 선언하면 std::를 굳이 매번 적지 않아도 cout 등을 사용할수 있지만 이름 충돌로 인한 오류가 생길 수 있어
권장되는 방법은 아니라고 한다.
그렇다면 C언어에서 배웠던 printf나 scanf에 비교하면 어떤 장점이 있을까? cout이나 cin은 스트림의 일부에 불과하다.
나중에 operator overloading을 배운 후에는 이렇게 출력할때 만들었던 코드들을 파일 입출력과 네트워크에도 다시 사용이 가능하다.
2. 헤더파일 만들기
한 파일안에 여러 함수를 짜게 되면 나중에 긴 프로그램을 짤 때 보기에 상당히 불편하다. 코드를 여러 파일로 쪼개는 법을 알아보자.
// main.cpp
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
cout << add(1, 2) << endl;
return 0;
}
// add.cpp
int add(int a, int b) {
return a + b;
}
// add.h
#pragma once
int add(int a, int b);

위처럼 파일을 만들고 g++ -c main.cpp add.cpp 를 터미널에 입력하였더니 main.o 파일과 add.o가 생겼다.
g++은 .c파일과 .cpp파일을 모두 c++언어로서 컴파일하는 c++언어용 컴파일러이다.
.o에는 .cpp파일을 컴파일한 어셈블리 코드가 들어있다.
이제 main.o와 add.o를 하나로 합치는 과정이 필요하다. 이 작업을 링킹 이라고 한다.

링킹은 서로 다른 파일에 있던 함수나 클래스들을 한군데 묶어서 링크해주는 작업이다.
컴파일러에 .o파일을 전달해보자.

g++ main.o add.o -o main 를 입력하여 실행파일을 만들었다.
여기서 -o 옵션은 링킹후 생성된 실행 파일의 이름을 정해주는 것이다.
main이라는 실행파일을 실행하고 싶으면 터미널에서 ./main을 입력하면 된다. 정상적으로 add(1,2)의 값이 출력되었다.
3. 헤더 가드의 필요성
이번엔 myWork.h라는 헤더파일을 만들고 add.h 헤더파일을 포함시켰다.
add.h와는 다르게 doSomething함수는 함수의 선언과 정의가 모두 헤더파일 안에 있다.
원래는 헤더파일에는 선언만 되어있고 정의는 모두 cpp로 가있는게 좋다.
하지만 실제로 테스트하고 지우고를 반복하다보면 항상 그렇게 깔끔하게 정리하기가 쉽지 않기 때문에 헤더 파일안에 다 집어넣는 경우가 많다. 이때 헤더 가드라는 것을 사용하면 문제가 생기지 않는다.
//myWork.h
#pragma once
#include "add.h"
int doSomething()
{
return add(1,2);
}
//main.cpp
#include <iostream>
#include "myWork.h"
#include "add.h"
using namespace std;
int main()
{
cout << doSomething() << endl;
return 0;
}
//add.h
#pragma once
int add(int a, int b);
먼저 main을 살펴보면 myWork.h를 include하고 add.h를 include한다.
myWork.h는 add.h를 include하는데, 메인에서 add.h를 또 include하고 있다. 같은 add 함수가 두번 선언된 것이다.
하지만 헤더 가드를 선언하였기 때문에 문제가 생기지 않는다.
중복될 경우에는 한번만 include를 하라고 알려주는 것이 헤더 가드의 역할이다.
#ifndef add
#define add
.. -> #pragma once
#endif
표준으로 사용하는 왼쪽 과정은 번거롭기 때문에 단 한줄로 사용하는 것이다.
'C++' 카테고리의 다른 글
3-2. C++ 비트단위 연산자(shift,AND,OR,XOR) (1) | 2024.01.29 |
---|---|
3-1. C++ 연산자(콤마 연산자, 삼항 연산자), 이진법 (0) | 2024.01.29 |
2-2. 오버플로우, 부동소수점 (1) | 2024.01.26 |
2-1. C++ 변수와 기본 자료형 (1) | 2024.01.26 |
1-2. C++의 기초 (namespace, 전처리기) (12) | 2024.01.24 |