โน๏ธ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 0.7 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://velog.io/@devkelvin/Advanced-C-4 |
| Last Crawled | 2026-03-20 00:51:30 (20 days ago) |
| First Indexed | 2025-08-06 16:33:26 (8 months ago) |
| HTTP Status Code | 200 |
| Meta Title | [Advanced C++] 4. ์ ๋ฐฉ์ ์ธ , ์๋ณ์ ์ ์ธ&์ ์์ ๋ํด, C++์ปดํ์ผ๋ฐฉ์, ๋ช ๋ช ์ถฉ๋ & namespace, ์ ์ฒ๋ฆฌ๊ธฐ & ์ ์ฒ๋ฆฌ์ง์๋ฌธ |
| Meta Description | ์ ๋ฐฉ์ ์ธ๋ค์ ์ฝ๋๋ ์ปดํ์ผ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค ์์ผ๊น?์ด์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค, ๋ฐ๋ผ์ main()์์ add()๋ฅผ ํธ์ถํ ๋ add์ ์ ์ธ์ด ๋ณด๋ค ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ add ์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ์ฌ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค์ด๋ฌํ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ |
| Meta Canonical | null |
| Boilerpipe Text | 1. Forward Declaration
์ ๋ฐฉ์ ์ธ
๋ค์ ์ฝ๋๋ ์ปดํ์ผ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค ์์ผ๊น?
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
int add(int x, int y)
{
return x + y;
}
์ด์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค, ๋ฐ๋ผ์ main()์์ add()๋ฅผ ํธ์ถํ ๋ add์ ์ ์ธ์ด ๋ณด๋ค ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ add ์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ์ฌ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
์ด๋ฌํ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค
1. ํจ์ ์ ์ ์ฌ์ ๋ ฌ
int add(int x, int y)
{
return x + y;
}
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
add()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ ์๋ฅผ ํด๋๋ ๋ฐฉ์์ผ๋ก ์ฌ์ ๋ ฌ ํ๊ฒ ๋๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์์ ์ ์๋ค (main()์์ ํธ์ถํ๋ add()๊ฐ ๋ฌด์์ธ์ง ์๊ธฐ ๋๋ฌธ์)
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ์์๋ ๋นํจ์จ์ ์ด๋ค (์์ ๋ค๋ฅธ ํ์ผ์ ์๋ ํจ์๋ค์ ์ฌ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅ)
๋ํ ์๋ก๋ฅผ ํธ์ถํ๋ ํจ์๋ ์ฌ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅํ๋ค
2. ์ ๋ฐฉ์ ์ธ
์ ๋ฐฉ์ ์ธ์ ์ปดํ์ผ๋ฌ์ ๋ฏธ๋ฆฌ ์๋ณ์๋ฅผ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค
ํจ์์ ์ ์ธ์ ๋ฏธ๋ฆฌ ์์ฑํ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ์ ํด๋น ํจ์ ์๋ณ์๋ฅผ ์๋ฆฌ๊ฒ ๋๊ณ ํจ์๊ฐ ์ด๋ป๊ฒ, ์ด๋์ ์ ์๋์ด์๋์ง ์๊ด ์์ด ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค
์ ๋ฐฉ์ ์ธ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค
int add(int x, int y); //์ ๋ฐฉ์ ์ธ, ์ด๋ฅผ ํจ์ ํ๋กํ ํ์
์ด๋ผ ํ๋ค
int main()
{
add(10, 20);
}
์ด๋ ํจ์์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ํจ์ ์ ์ธ๋ถ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์์ฑํ์ง ์์๋ ๋๋ค
int add(int, int); //์ด๋ ๊ฒ๋ ๊ฐ๋ฅ
ํ์ง๋ง ์ด๋ ๊ฒ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์์ฑํ์ง ์์ผ๋ฉด ํด๋น ๋งค๊ฐ๋ณ์๊ฐ ์ด๋ค ์๋ฏธ์ธ์ง ํ์
ํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ๊น์ง ๊ฐ์ด ์์ฑํ๋๊ฑธ ๊ถ์ฅํ๋ค
์ ๋ฐฉ์ ์ธ์ ์์๋ก๋ถํฐ ๋
๋ฆฝ์ ์ธ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ ์ํ ์ข
์์ฑ์ ํด๊ฒฐํ ์ ์๋ค
ํจ์๋ฅผ ์ ๋ฐฉ์ ์ธํ๊ณ ์ ์ํ์ง ์์ผ๋ฉด LNK์๋ฌ๊ฐ ๋ฐ์ํ๋ค (์ปดํ์ผ์ ๋์ง๋ง ๋งํฌ ๋จ๊ณ์์ ์คํจ)
2. ์ ์ธ๊ณผ ์ ์
์ ์ธ์ด๋
์ ์ธ์ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ณ์์ ์กด์ฌ์ ์ฐ๊ด๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค
int add(int x, int y); //int๋ฐํํ์ int 2๊ฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ง๋ ํจ์ ์๋ณ์ ์ ๋ณด
int a; //intํ์
์ a๋ผ๋ ์ด๋ฆ์ ๋ณ์ ์๋ณ์ ์ ๋ณด
์ ์๋
์ ์๋ ์ ์ธํ ์๋ณ์๋ฅผ ์ค์ ๋ก ๊ตฌํํ๊ฑฐ๋ ์ธ์คํด์คํ ํ๋๊ฒ์ด๋ค
int add(int x, int y)
{
return x + y;
}
int a; //์ ์์ด์ ์ ์ธ
int a { 10 }; //์ด๊ฑด ์ด๊ธฐํ์
C++์์ ๋ชจ๋ ์ ์๋ ๊ณง ์ ์ธ์ด๋ค ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ int a์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ ์์ด์ ์ ์ธ์ด ๋๋ค
ํ์ง๋ง ์ญ์ ์ฑ๋ฆฝํ์ง ์๋๋ค ๋ชจ๋ ์ ์ธ์ด ์ ์๋ ์๋๋ค, ์ ์๊ฐ ์๋ ์ ์ธ์ ์์ ์ ์ธ (pure declaration)์ด๋ผ ํ๋ฉฐ ์ ๋ฐฉ์ ์ธ์ด ์ฌ๊ธฐ์ ํฌํจ๋๋ค
์ปดํ์ผ๋ฌ๋ ์๋ณ์๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ํด๋น ์๋ณ์์ ์ฌ์ฉ์ด validํ์ง ์ฒดํฌํ๋ค (์ด๋ ์ ์ธ๋ง ํ์ธํ๊ณ ์ ์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ค์ ๋ก ๋ณด์ง ์์๋ ๋๋ค, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ์ผ์์ ์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฒ, ๋ฌผ๋ก ์์ธ๋ ์๋ค (template))
One Definition Rule (ODR)
C++์๋ ODR์ด๋ผ๋ ๊ท์น์ด ์กด์ฌํ๋ค
1. ๊ฐ์ ๋ฒ์์์์ ํจ์, ๋ณ์, type ํน์ template๋ค์ ํ๋์ ์ ์๋ง ๊ฐ์ง ์ ์๋ค
int add(int x, int y)
{
return x + y;
}
int add(int x, int y)
{
return x + y;
}
int main()
{
int x{};
int x{ 5 };
}
//ODR 1๋ฒ ๊ท์น ์๋ฐฐ (์ค๋ณต ์ ์)
2. type, template, inline function/variable์ ์ ์๊ฐ ๋์ผํ ํ ๋ค๋ฅธ ํ์ผ์ ์ค๋ณต๋ ์ ์๋ฅผ ๊ฐ์ง ์ ์๋ค
2. C++ ์ปดํ์ผ ๋ฐฉ์
์๋ก์ด cppํ์ผ์ ๋ง๋ค๊ณ ์ฌ๊ธฐ์ ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์
//Add.cpp
int add(int x, int y)
{
return x + y;
}
์ปดํ์ผ๋ฌ๋ ํ์ผ๋ค์ ๊ฐ๋ณ์ ์ผ๋ก ์ปดํ์ผํ๋ค ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๋ ๋ค๋ฅธ ํ์ผ์ ์์ค์ฝ๋๋ฅผ ์์ง ๋ชปํ๊ณ ์ด์ ์ ์ปดํ์ผ ๋ ์ฝ๋์ ๋ด์ฉ๋ ์์ง ๋ชปํ๋ค
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n'; // compile error
return 0;
}
๋ฐ๋ผ์ ์ ์ฝ๋๋ add์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
์ด๋ฌํ ๋ฐฉ์์ ๊ต์ฅํ ๋ถํธํด๋ณด์ด์ง๋ง ์ ๋ถ ๋ถ๋ช
ํ ์๋๊ฐ ์๋ค
1. ์์ค ํ์ผ์ ์ด๋ค ์์๋ก๋ ์ปดํ์ผ์ด ๊ฐ๋ฅ
2. ํน์ ์์คํ์ผ์ ์์ ํ๋ฉด ์์ ํ ํด๋น ์์ค ํ์ผ๋ง ๋ฐ๋ก ์ปดํ์ผ์ด ๊ฐ๋ฅ
3. ์๋ก ๋ค๋ฅธ ์์คํ์ผ์์์ ์๋ณ์ ์ด๋ฆ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค
๊ฒฐ๊ตญ ์์ ์ปดํ์ผ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ ๋ฐฉ์ ์ธ์ ํด์ผํ๋ค
์ ๋ฐฉ์ ์ธ์ ํ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ์๋ณ์๊ฐ validํ๋ค๊ณ ํ๋จํด add()๋ฅผ ํธ์ถํ ์ ์๊ณ ๋ง์ปค๊ฐ add.cpp์ addํจ์ ์ ์์ ์ฐ๊ฒฐํ๋ค
3. ์ด๋ฆ ์ถฉ๋, namespace
์๋ณ์ ๋ช
๋ช
์ถฉ๋
C++์์๋ ๋ชจ๋ ์๋ณ์๊ฐ ๋ชจํธํ์ง ์์์ผ ํ๋ค (๊ฐ์ ๋ฒ์์์ ๊ฐ์ ์๋ณ์ ์ด๋ฆ ์ฌ์ฉX)
์ด๋ ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ง์ปค๋ ์ด๋ค ์๋ณ์๋ฅผ ์ฌ์ฉ ํด์ผํ ์ง ๊ตฌ๋ถ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
(๋ช
๋ช
์ถฉ๋)
//Add.cpp
int add(int x, int y)
{
return x + y;
}
//main.cpp
int add(int x, int y)
{
return x + y;
}
int main()
{
add(10, 20);
}
ํด๋น ์ฝ๋๋ ๋
๋ฆฝ์ ์ผ๋ก ์ปดํ์ผ ๋์ด ์ปดํ์ผ ์๋ฌ๋ ๋ฐ์ํ์ง ์์ง๋ง add๋ผ๋ ํจ์ ์ด๋ฆ ์ถฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋งํฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
(add() ํธ์ถ ์ ์ด๋ค add()๋ฅผ ํธ์ถํ ์ง ๋ชจํธํ๊ธฐ ๋๋ฌธ)
ํ๋ก์ ํธ์ ์ฌ์ด์ฆ๊ฐ ์ ์ ์ปค์ง์๋ก ์ด๋ฌํ ๋ช
๋ช
์ถฉ๋์ ๋ ์์ฃผ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค, C++์๋ ์ด๋ฌํ ๋ช
๋ช
์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค
(local variable ์ด๋ฆ ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํ { }์ ๊ฐ์ ๋ฐฉ๋ฒ๋ค)
namespace
namespace๋ namespace์์ ์ ์ธ๋ ์๋ณ์๊ฐ ๋ค๋ฅธ ๋ฒ์์์ ์ ์ธ๋ ์๋ณ์์ ๋ณ๊ฐ๋ก ๊ฐ์ฃผ๋๋ ์์ค์ฝ๋ ์์ญ์ด๋ค (๋์ผํ ์๋ณ์๋ช
์ ๊ฐ์ ธ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค)
ํ์ง๋ง ๊ฐ์ namespace ์์์๋ ๋ชจ๋ ์๋ณ์๋ ๊ณ ์ ํด์ผ ํ๋ค
ํจ์์์๋ { }๋ฅผ ์ด์ฉํ์ฌ local variable์ ์๋ณ์๋ฅผ ๊ณ ์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค
int Foo()
{
int a;
{
int a;
}
}
namespace ๋ด๋ถ์๋ ์ ์ธ๊ณผ ์ ์๋ง ๊ฐ๋ฅํ๋ค (์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ๊ณผ ๊ฐ์ ์คํ ๊ฐ๋ฅํ ๋ฌธ์ฅ (Executable Statement)๋ค์ namespace์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง namespace์์ ํจ์๋ฅผ ์ ์ ํ๋ ๋ถ๋ถ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค)
namespace Math
{
const double PI = 3.14159; // ์ ์ธ ๋ฐ ์ ์
double square(double x)
{
return x * x; // ์คํ ๊ฐ๋ฅํ ๋ฌธ์ฅ
}
}
namespace์๋ ์ด๋ฆ์ ๋ถํ ์ ์๋ค
namespace ์ด๋ฆ
{
}
namespace Math
{
double PI = 3.141592;
}
ํน์ namespace ๋ด๋ถ์ ์๋ณ์๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค
Math::PI; //๋ช
์์ ์ผ๋ก namespace:: ๋ฒ์๋ฅผ ์ง์ ํ์ฌ ์๋ณ์ ์ ๊ทผ
์ฌ๊ธฐ์ ::๋ ๋ฒ์ ์ง์ ์ฐ์ฐ์์ด๋ค
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ using์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค
using namepsace std;
PI;
์ด๋ ๊ฒ ํ๋ฉด ๋ช
์์ ์ผ๋ก namespace::๋ฅผ ํ ํ์๊ฐ ์๋ค, ํ์ง๋ง ์ด๋ ์ง์ํ๋ค ์๋ํ๋ฉด ๋ช
๋ช
์ถฉ๋์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค
using namespace std;
int cout()
{
return 5;
}
int main()
{
cout << "Hello, world!";
return 0;
}
์ ์ฝ๋๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค, Global namespace์ ์ ์ธ๋ cout()์ ํธ์ถํ๋์ง std::cout์ ํธ์ถํ๋์ง ๋ง์ปค๋ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค
๋ฐ๋ผ์ namespace::๋ก ๋ด๋ถ ์๋ณ์์ ์ ๊ทผํ๋๊ฒ namespace์ ์กด์ฌ ์์์ ๋ ์ ํฉํ๋ค
Global namespace
๋ง์ฝ ํจ์๋ ๋ณ์๋ฅผ ์ ์ญ์ผ๋ก ์ ์ธํ๊ฒ ๋๋ฉด ์ด ์๋ณ์๋ค์ ์๋ฌต์ ์ผ๋ก Global namespace์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ค ๋ฐ๋ผ์ ๊ฐ์ namespace๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ๋ช
๋ช
์ถฉ๋์ด ๋ฐ์ํ๊ฒ ๋๋ค
(์์์ add() ์๋ฌ๊ฐ ๋ฐ์ํ ์ด์ )
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ namespace ๊ท์น๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค
void foo();
int x;
int y { 5 };
x = 5; //Global namespace์์ executable statement๋ฅผ ์ฌ์ฉํ ์ ์๋ค
std namespace
C++์ด ์ฒ์ ์ค๊ณ ๋์์ ๋ std namespace์ ์๋ณ์๋ค์ std::์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ์์ง๋ง ์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉฐ ๋ช
๋ช
์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ ธ std namespace๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค (standard) (cout, cin ๋ฑ ๋ค์ํ ํจ์๋ฅผ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค)
4. ์ ์ฒ๋ฆฌ๊ธฐ
์ ์ฒ๋ฆฌ
ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผ ํ๊ธฐ ์ ์ ๊ฐ ์์ค์ฝ๋ ํ์ผ๋ค์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ค, ์ด๋ ์ ์ฒ๋ฆฌ๊ธฐ๋ ์์ค์ฝ๋ ํ์ผ์ ํ
์คํธ์ ๋ค์ํ ์กฐ์์ ํ๋ค
์ด๋ ์ค์ง์ ์ผ๋ก ์๋ณธ ์์ค ์ฝ๋ ํ์ผ์ ์์ ํ๋ ๋ฐฉ์์ ์๋๊ณ ์ผ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ์์ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝํ๋ค
์ ์ฒ๋ฆฌ๊ธฐ๋ ์ฃผ์์ ์ ๊ฑฐํ๊ณ ๊ฐ ์ฝ๋ํ์ผ์ด endline(์ค๋ฐ๊ฟ)์ผ๋ก ๋๋๊ฒ ํ๋ค, ๊ทธ๋ฆฌ๊ณ ์์ฃผ ์ค์ํ #include ์ง์๋ฌธ์ ์ฒ๋ฆฌํ๋ค
์ด๋ ๊ฒ ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ฝ๋ ํ์ผ ์ฒ๋ฆฌ๋ฅผ ๋๋ธ ๊ฒฐ๊ณผ๋ฅผ Translation Unit์ด๋ผ ํ๊ณ ์ด๋ ์ปดํ์ผ๋ฌ์ ์ํด ์ปดํ์ผ ๋๋ค (์ด ๊ฒฐ๊ณผ์๋ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ์ด ํฌํจ๋์ง ์๊ณ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ ์ถ๋ ฅ๋ง ์ปดํ์ผ๋ฌ๋ก ์ ๋ฌ๋๋ค)
์ด๋ฌํ Translation Unit์ ๋จ์ผ cpp์ ๊ทธ cpp์ ์ฐ๊ฒฐ๋ ๋ชจ๋ .h๋ก ๊ตฌ์ฑ๋๋ค (๋ค๋ฅธ .h๋ฅผ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ .hํ์ผ์)
์ ์ฒ๋ฆฌ, ์ปดํ์ผ ,๋งํฌ ์ ์ฒด ๊ณผ์ ์ translation์ด๋ผ ํ๋ค
#include
์ ์ฒ๋ฆฌ๊ธฐ๋ ์์ค์ฝ๋ ํ์ผ์ ์์์ ์๋๋ก ์งํํ๋ฉฐ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ (#์ผ๋ก ์์ํ๊ณ ์ค๋ฐ๊ฟ์ผ๋ก ๋๋๋ ์ง์๋ฌธ)์ ์ฐพ๋๋ค
์ด๋ฌํ ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ์ ์ฒ๋ฆฌ๊ธฐ์ ์์์ ์ ๋ฆฌํ ํน์ ํ
์คํธ ์กฐ์์ ์ง์ํ๋ค
(์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ C++๊ตฌ๋ฌธ์ ์ดํดํ์ง ๋ชปํ๋ค, ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ์์ฒด ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์์)
๋ํ์ ์ธ ์ ์ฒ๋ฆฌ๋ฌธ #include < iostream > ์ผ๋ก ์ ๋ฆฌํด๋ณด์
#include
<
iostream
>
int main()
{
std::cout << "Hello World" << std::endl;
}
์ ์ฒ๋ฆฌ๊ธฐ๋ #include < iostream >์ iostream์ด๋ผ๋ ํ์ผ์ ๋ด์ฉ์ผ๋ก ๋ฐ๊พผ๋ค, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ iostream์ ์๋ณ์๋ค์ ์ ๋ถ ์ฌ์ฉํ ์ ์๋๊ฒ์ด๋ค
macro
#define์ผ๋ก ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค, ๋งคํฌ๋ก๋ ์
๋ ฅ๊ฐ์ ๋์ฒด ์ถ๋ ฅ๊ฐ์ผ๋ก ๋ณํ๋๋ ๋ฐฉ์์ ์ ์ํ ๊ฒ์ด๋ค
๋งคํฌ๋ก์๋ ;์ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ ์๋ณ์์ ๊ฐ์ ๋ช
๋ช
๊ท์น์ ์ฌ์ฉํ๋ค, ๋ณดํต ๋๋ฌธ์๋ก ๋ง์ด ์ฌ์ฉํ๋ค
#define NAME "Kelvin"
Kelvin์ด๋ผ๋ ์
๋ ฅ๊ฐ์ด NAME์ด๋ผ๋ ๋์ฒด ์ถ๋ ฅ ๊ฐ์ผ๋ก ๋ณํ๋ ๊ฒ์ด๋ค
std::cout << NAME < std::Endl; //KELVIN
์ด๋ฌํ ๋งคํฌ๋ก๋ฅผ Object-like macro๋ผ๊ณ ํ๋ค
Object-like macro๋ C Style์ ์์ ํํ๋ฒ์ด๋ค, ์ด๋ C++์์ ๋๋ ํ์ํ์ง ์์ ๋ฐฉ์์ด๊ณ ์ด๋ฏธ ๊ฑฐ์ Legacy ์ฝ๋์๋ง ์กด์ฌํ๋ค (์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค)
Conditional Compile (์กฐ๊ฑด๋ถ ์ปดํ์ผ)
์กฐ๊ฑด๋ถ ์ปดํ์ผ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์์๋ง ์ปดํ์ผ, ์ปดํ์ผ ํ์ง ์์ ์ ์๋ค
๋ํ์ ์ผ๋ก #ifdef, #ifndef, #endif๊ฐ ์๋ค
#define TESTDEF
int main()
{
#ifdef TESTDEF
std::cout << "TESTDEF is def!" << std::endl;
#endif
#ifdef TESTDEFFFFF
std::cout << "TESTDEFFFFF is def!" << std::endl;
#endif
}
#ifdef๋ ์์ ์์ฑํ ์๋ณ์๊ฐ #define์ ํตํด ์ด๋ฏธ ์ ์๋์๋์ง ์ฒดํฌํ๊ณ ์ ์ ๋์๋ค๋ฉด ์๋๋ฅผ ์ปดํ์ผํ๋ค, ์ด๋ ์ด๋ฅผ ๋ซ์์ฃผ๋ ์ญํ ์ด #endif๋ค (ifndef๋ ๋ฐ๋์, ์ ์๋์ง ์์ผ๋ฉด ์ปดํ์ผ)
๋ฐ๋ผ์ ์์ ์ฝ๋๋ TESTDEF is def! ๊ฐ ์ถ๋ ฅ๋๊ณ ๋ฐ์๋ ์ปดํ์ผ ๋์ง ์๋๋ค
์ด๋ ์กฐ๊ธ ๋ C++์คํ์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค
#if defined(TESTDEF)
#endif
์ํ๋ ๋ถ๋ถ์ ์ปดํ์ผ์์ ๊ทธ๋ฅ ์ ์ธ์ํค๊ณ ์ถ๋ค๋ฉด #if 0์ ์ฌ์ฉํ๋ค, #if 1๋ก ๋ณ๊ฒฝํ๋ฉด ๋ค์ ์ปดํ์ผ์ ํฌํจ์ํจ๋ค
int main()
{
std::cout << "TESTDEF is def!" << std::endl;
#if 0
std::cout << "TESTDEFFFFF is def!" << std::endl; //์ปดํ์ผ ๋์ง ์์
#endif
}
์์์ ์ ๋ฆฌํ ๋งคํฌ๋ก ๋์ฒด๊ฐ์ ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์์๋ ๊ฐ์ ๋์ฒดํ์ง ์๋๋ค
#define FOO 9
#ifdef FOO //์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ด๊ธฐ ๋๋ฌธ์ 9๋ก ๋์ฒด๋์ง ์๋๋ค
std::cout << FOO << '\n'; //์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ด ์๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ 9๋ก ๋์ฒด๋๋ค
#endif
์ถ๊ฐ๋ก #define์ ๋ํ
์ผ์ ์ ๋ฆฌํด๋ณด์
void foo()
{
#define NAME "Kelvin"
}
int main()
{
std::cout << NAME << std::endl;
}
์ ์ฝ๋๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค, ๋ถ๋ช
๋ณด๋ฉด NAME์ด foo() ๋ด๋ถ์ ์ ์ธ๋์ด ์ ํจ๋ฒ์๊ฐ { }์ผ ๊ฒ ๊ฐ์ main()์๋ ์ฌ์ฉํ์ง ๋ชปํ ๊ฒ ๊ฐ์ง๋ง ์ ์ฒ๋ฆฌ๊ธฐ๋ C++๊ตฌ๋ฌธ์ ์ดํดํ์ง ์๊ธฐ ๋๋ฌธ์ local๋ก ์ ์ธ๋ ๊ฒ์ด ์๋์ฌ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
๋ง์ง๋ง์ผ๋ก ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ํด๋น ์ง์๋ฌธ์ด ์์ฑ๋ ํ์ผ ๋ด๋ถ์์๋ง ์ ํจํ๋ค, ๋ฐ๋ผ์ #include๋์ง ์์๋ค๋ฉด ๋ค๋ฅธ ํ์ผ์์๋ ์ํฅ์ ์ค ์ ์๋ค
//Add.cpp
#include
<
iostream
>
void doSomething()
{
#ifdef PRINT
std::cout << "Printing!\n";
#endif
#ifndef PRINT
std::cout << "Not printing!\n";
#endif
}
//main.cpp
void doSomething();
#define PRINT
int main()
{
doSomething();
}
PRINT๊ฐ main์์ define๋์์ง๋ง main.cpp์์๋ง ์ ํจํ๊ธฐ ๋๋ฌธ์ Add.cpp์ ์ฝ๋์์๋ ์ ํ ์ํฅ์ ๋ฐ์ง ์๋๋ค ๋ฐ๋ผ์ Not Printing์ด ์ถ๋ ฅ๋๋ค |
| Markdown | [dev.kelvin.log](https://velog.io/@devkelvin/posts)
๋ก๊ทธ์ธ
[dev.kelvin.log](https://velog.io/@devkelvin/posts)
๋ก๊ทธ์ธ
# \[Advanced C++\] 4. ์ ๋ฐฉ์ ์ธ , ์๋ณ์ ์ ์ธ&์ ์์ ๋ํด, C++์ปดํ์ผ๋ฐฉ์, ๋ช
๋ช
์ถฉ๋ & namespace, ์ ์ฒ๋ฆฌ๊ธฐ & ์ ์ฒ๋ฆฌ์ง์๋ฌธ
[dev.kelvin](https://velog.io/@devkelvin/posts)ยท2024๋
12์ 3์ผ
ํ๋ก์ฐ
1
[Advanced Cpp](https://velog.io/tags/Advanced-Cpp)[ํ๋ก๊ทธ๋๋ฐ](https://velog.io/tags/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)
## [Advanced C++](https://velog.io/@devkelvin/series/Advanced-C)
๋ชฉ๋ก ๋ณด๊ธฐ
4/74

# 1\. Forward Declaration
> ์ ๋ฐฉ์ ์ธ
๋ค์ ์ฝ๋๋ ์ปดํ์ผ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค ์์ผ๊น?
```
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
int add(int x, int y)
{
return x + y;
}
```
์ด์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค, ๋ฐ๋ผ์ main()์์ add()๋ฅผ ํธ์ถํ ๋ add์ ์ ์ธ์ด ๋ณด๋ค ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ add ์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ์ฌ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
์ด๋ฌํ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค
**1\. ํจ์ ์ ์ ์ฌ์ ๋ ฌ**
```
int add(int x, int y)
{
return x + y;
}
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
```
add()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ ์๋ฅผ ํด๋๋ ๋ฐฉ์์ผ๋ก ์ฌ์ ๋ ฌ ํ๊ฒ ๋๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์์ ์ ์๋ค (main()์์ ํธ์ถํ๋ add()๊ฐ ๋ฌด์์ธ์ง ์๊ธฐ ๋๋ฌธ์)
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ์์๋ ๋นํจ์จ์ ์ด๋ค (์์ ๋ค๋ฅธ ํ์ผ์ ์๋ ํจ์๋ค์ ์ฌ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅ)
๋ํ ์๋ก๋ฅผ ํธ์ถํ๋ ํจ์๋ ์ฌ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅํ๋ค
**2\. ์ ๋ฐฉ์ ์ธ**
์ ๋ฐฉ์ ์ธ์ ์ปดํ์ผ๋ฌ์ ๋ฏธ๋ฆฌ ์๋ณ์๋ฅผ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค
ํจ์์ ์ ์ธ์ ๋ฏธ๋ฆฌ ์์ฑํ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ์ ํด๋น ํจ์ ์๋ณ์๋ฅผ ์๋ฆฌ๊ฒ ๋๊ณ ํจ์๊ฐ ์ด๋ป๊ฒ, ์ด๋์ ์ ์๋์ด์๋์ง ์๊ด ์์ด ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค
์ ๋ฐฉ์ ์ธ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค
```
int add(int x, int y); //์ ๋ฐฉ์ ์ธ, ์ด๋ฅผ ํจ์ ํ๋กํ ํ์
์ด๋ผ ํ๋ค
int main()
{
add(10, 20);
}
```
์ด๋ ํจ์์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ํจ์ ์ ์ธ๋ถ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์์ฑํ์ง ์์๋ ๋๋ค
```
int add(int, int); //์ด๋ ๊ฒ๋ ๊ฐ๋ฅ
```
ํ์ง๋ง ์ด๋ ๊ฒ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์์ฑํ์ง ์์ผ๋ฉด ํด๋น ๋งค๊ฐ๋ณ์๊ฐ ์ด๋ค ์๋ฏธ์ธ์ง ํ์
ํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ๊น์ง ๊ฐ์ด ์์ฑํ๋๊ฑธ ๊ถ์ฅํ๋ค
์ ๋ฐฉ์ ์ธ์ ์์๋ก๋ถํฐ ๋
๋ฆฝ์ ์ธ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ ์ํ ์ข
์์ฑ์ ํด๊ฒฐํ ์ ์๋ค
ํจ์๋ฅผ ์ ๋ฐฉ์ ์ธํ๊ณ ์ ์ํ์ง ์์ผ๋ฉด LNK์๋ฌ๊ฐ ๋ฐ์ํ๋ค (์ปดํ์ผ์ ๋์ง๋ง ๋งํฌ ๋จ๊ณ์์ ์คํจ)
# 2\. ์ ์ธ๊ณผ ์ ์
> ์ ์ธ์ด๋
์ ์ธ์ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ณ์์ ์กด์ฌ์ ์ฐ๊ด๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค
```
int add(int x, int y); //int๋ฐํํ์ int 2๊ฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ง๋ ํจ์ ์๋ณ์ ์ ๋ณด
int a; //intํ์
์ a๋ผ๋ ์ด๋ฆ์ ๋ณ์ ์๋ณ์ ์ ๋ณด
```
> ์ ์๋
์ ์๋ ์ ์ธํ ์๋ณ์๋ฅผ ์ค์ ๋ก ๊ตฌํํ๊ฑฐ๋ ์ธ์คํด์คํ ํ๋๊ฒ์ด๋ค
```
int add(int x, int y)
{
return x + y;
}
int a; //์ ์์ด์ ์ ์ธ
int a { 10 }; //์ด๊ฑด ์ด๊ธฐํ์
```
C++์์ ๋ชจ๋ ์ ์๋ ๊ณง ์ ์ธ์ด๋ค ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ int a์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ ์์ด์ ์ ์ธ์ด ๋๋ค
ํ์ง๋ง ์ญ์ ์ฑ๋ฆฝํ์ง ์๋๋ค ๋ชจ๋ ์ ์ธ์ด ์ ์๋ ์๋๋ค, ์ ์๊ฐ ์๋ ์ ์ธ์ ์์ ์ ์ธ (pure declaration)์ด๋ผ ํ๋ฉฐ ์ ๋ฐฉ์ ์ธ์ด ์ฌ๊ธฐ์ ํฌํจ๋๋ค
์ปดํ์ผ๋ฌ๋ ์๋ณ์๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ํด๋น ์๋ณ์์ ์ฌ์ฉ์ด validํ์ง ์ฒดํฌํ๋ค (์ด๋ ์ ์ธ๋ง ํ์ธํ๊ณ ์ ์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ค์ ๋ก ๋ณด์ง ์์๋ ๋๋ค, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ์ผ์์ ์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฒ, ๋ฌผ๋ก ์์ธ๋ ์๋ค (template))
> One Definition Rule (ODR)
C++์๋ ODR์ด๋ผ๋ ๊ท์น์ด ์กด์ฌํ๋ค
**1\. ๊ฐ์ ๋ฒ์์์์ ํจ์, ๋ณ์, type ํน์ template๋ค์ ํ๋์ ์ ์๋ง ๊ฐ์ง ์ ์๋ค**
```
int add(int x, int y)
{
return x + y;
}
int add(int x, int y)
{
return x + y;
}
int main()
{
int x{};
int x{ 5 };
}
//ODR 1๋ฒ ๊ท์น ์๋ฐฐ (์ค๋ณต ์ ์)
```
**2\. type, template, inline function/variable์ ์ ์๊ฐ ๋์ผํ ํ ๋ค๋ฅธ ํ์ผ์ ์ค๋ณต๋ ์ ์๋ฅผ ๊ฐ์ง ์ ์๋ค**
# 2\. C++ ์ปดํ์ผ ๋ฐฉ์
์๋ก์ด cppํ์ผ์ ๋ง๋ค๊ณ ์ฌ๊ธฐ์ ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์
```
//Add.cpp
int add(int x, int y)
{
return x + y;
}
```
์ปดํ์ผ๋ฌ๋ ํ์ผ๋ค์ ๊ฐ๋ณ์ ์ผ๋ก ์ปดํ์ผํ๋ค ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๋ ๋ค๋ฅธ ํ์ผ์ ์์ค์ฝ๋๋ฅผ ์์ง ๋ชปํ๊ณ ์ด์ ์ ์ปดํ์ผ ๋ ์ฝ๋์ ๋ด์ฉ๋ ์์ง ๋ชปํ๋ค
```
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n'; // compile error
return 0;
}
```
๋ฐ๋ผ์ ์ ์ฝ๋๋ add์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
์ด๋ฌํ ๋ฐฉ์์ ๊ต์ฅํ ๋ถํธํด๋ณด์ด์ง๋ง ์ ๋ถ ๋ถ๋ช
ํ ์๋๊ฐ ์๋ค
**1\. ์์ค ํ์ผ์ ์ด๋ค ์์๋ก๋ ์ปดํ์ผ์ด ๊ฐ๋ฅ**
**2\. ํน์ ์์คํ์ผ์ ์์ ํ๋ฉด ์์ ํ ํด๋น ์์ค ํ์ผ๋ง ๋ฐ๋ก ์ปดํ์ผ์ด ๊ฐ๋ฅ**
**3\. ์๋ก ๋ค๋ฅธ ์์คํ์ผ์์์ ์๋ณ์ ์ด๋ฆ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค**
๊ฒฐ๊ตญ ์์ ์ปดํ์ผ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ ๋ฐฉ์ ์ธ์ ํด์ผํ๋ค
์ ๋ฐฉ์ ์ธ์ ํ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ์๋ณ์๊ฐ validํ๋ค๊ณ ํ๋จํด add()๋ฅผ ํธ์ถํ ์ ์๊ณ ๋ง์ปค๊ฐ add.cpp์ addํจ์ ์ ์์ ์ฐ๊ฒฐํ๋ค
# 3\. ์ด๋ฆ ์ถฉ๋, namespace
> ์๋ณ์ ๋ช
๋ช
์ถฉ๋
C++์์๋ ๋ชจ๋ ์๋ณ์๊ฐ ๋ชจํธํ์ง ์์์ผ ํ๋ค (๊ฐ์ ๋ฒ์์์ ๊ฐ์ ์๋ณ์ ์ด๋ฆ ์ฌ์ฉX)
์ด๋ ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ง์ปค๋ ์ด๋ค ์๋ณ์๋ฅผ ์ฌ์ฉ ํด์ผํ ์ง ๊ตฌ๋ถ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
(๋ช
๋ช
์ถฉ๋)
```
//Add.cpp
int add(int x, int y)
{
return x + y;
}
//main.cpp
int add(int x, int y)
{
return x + y;
}
int main()
{
add(10, 20);
}
```
ํด๋น ์ฝ๋๋ ๋
๋ฆฝ์ ์ผ๋ก ์ปดํ์ผ ๋์ด ์ปดํ์ผ ์๋ฌ๋ ๋ฐ์ํ์ง ์์ง๋ง add๋ผ๋ ํจ์ ์ด๋ฆ ์ถฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋งํฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
(add() ํธ์ถ ์ ์ด๋ค add()๋ฅผ ํธ์ถํ ์ง ๋ชจํธํ๊ธฐ ๋๋ฌธ)
ํ๋ก์ ํธ์ ์ฌ์ด์ฆ๊ฐ ์ ์ ์ปค์ง์๋ก ์ด๋ฌํ ๋ช
๋ช
์ถฉ๋์ ๋ ์์ฃผ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค, C++์๋ ์ด๋ฌํ ๋ช
๋ช
์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค
(local variable ์ด๋ฆ ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํ { }์ ๊ฐ์ ๋ฐฉ๋ฒ๋ค)
> namespace
namespace๋ namespace์์ ์ ์ธ๋ ์๋ณ์๊ฐ ๋ค๋ฅธ ๋ฒ์์์ ์ ์ธ๋ ์๋ณ์์ ๋ณ๊ฐ๋ก ๊ฐ์ฃผ๋๋ ์์ค์ฝ๋ ์์ญ์ด๋ค (๋์ผํ ์๋ณ์๋ช
์ ๊ฐ์ ธ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค)
ํ์ง๋ง ๊ฐ์ namespace ์์์๋ ๋ชจ๋ ์๋ณ์๋ ๊ณ ์ ํด์ผ ํ๋ค
ํจ์์์๋ { }๋ฅผ ์ด์ฉํ์ฌ local variable์ ์๋ณ์๋ฅผ ๊ณ ์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค
```
int Foo()
{
int a;
{
int a;
}
}
```
namespace ๋ด๋ถ์๋ ์ ์ธ๊ณผ ์ ์๋ง ๊ฐ๋ฅํ๋ค (์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ๊ณผ ๊ฐ์ ์คํ ๊ฐ๋ฅํ ๋ฌธ์ฅ (Executable Statement)๋ค์ namespace์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง namespace์์ ํจ์๋ฅผ ์ ์ ํ๋ ๋ถ๋ถ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค)
```
namespace Math
{
const double PI = 3.14159; // ์ ์ธ ๋ฐ ์ ์
double square(double x)
{
return x * x; // ์คํ ๊ฐ๋ฅํ ๋ฌธ์ฅ
}
}
```
namespace์๋ ์ด๋ฆ์ ๋ถํ ์ ์๋ค
```
namespace ์ด๋ฆ
{
}
namespace Math
{
double PI = 3.141592;
}
```
ํน์ namespace ๋ด๋ถ์ ์๋ณ์๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค
```
Math::PI; //๋ช
์์ ์ผ๋ก namespace:: ๋ฒ์๋ฅผ ์ง์ ํ์ฌ ์๋ณ์ ์ ๊ทผ
```
์ฌ๊ธฐ์ ::๋ ๋ฒ์ ์ง์ ์ฐ์ฐ์์ด๋ค
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ using์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค
```
using namepsace std;
PI;
```
์ด๋ ๊ฒ ํ๋ฉด ๋ช
์์ ์ผ๋ก namespace::๋ฅผ ํ ํ์๊ฐ ์๋ค, ํ์ง๋ง ์ด๋ ์ง์ํ๋ค ์๋ํ๋ฉด ๋ช
๋ช
์ถฉ๋์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค
```
using namespace std;
int cout()
{
return 5;
}
int main()
{
cout << "Hello, world!";
return 0;
}
```
์ ์ฝ๋๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค, Global namespace์ ์ ์ธ๋ cout()์ ํธ์ถํ๋์ง std::cout์ ํธ์ถํ๋์ง ๋ง์ปค๋ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค
๋ฐ๋ผ์ namespace::๋ก ๋ด๋ถ ์๋ณ์์ ์ ๊ทผํ๋๊ฒ namespace์ ์กด์ฌ ์์์ ๋ ์ ํฉํ๋ค
> Global namespace
๋ง์ฝ ํจ์๋ ๋ณ์๋ฅผ ์ ์ญ์ผ๋ก ์ ์ธํ๊ฒ ๋๋ฉด ์ด ์๋ณ์๋ค์ ์๋ฌต์ ์ผ๋ก Global namespace์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ค ๋ฐ๋ผ์ ๊ฐ์ namespace๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ๋ช
๋ช
์ถฉ๋์ด ๋ฐ์ํ๊ฒ ๋๋ค
(์์์ add() ์๋ฌ๊ฐ ๋ฐ์ํ ์ด์ )
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ namespace ๊ท์น๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค
```
void foo();
int x;
int y { 5 };
x = 5; //Global namespace์์ executable statement๋ฅผ ์ฌ์ฉํ ์ ์๋ค
```
> std namespace
C++์ด ์ฒ์ ์ค๊ณ ๋์์ ๋ std namespace์ ์๋ณ์๋ค์ std::์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ์์ง๋ง ์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉฐ ๋ช
๋ช
์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ ธ std namespace๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค (standard) (cout, cin ๋ฑ ๋ค์ํ ํจ์๋ฅผ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค)
# 4\. ์ ์ฒ๋ฆฌ๊ธฐ
> ์ ์ฒ๋ฆฌ
ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผ ํ๊ธฐ ์ ์ ๊ฐ ์์ค์ฝ๋ ํ์ผ๋ค์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ค, ์ด๋ ์ ์ฒ๋ฆฌ๊ธฐ๋ ์์ค์ฝ๋ ํ์ผ์ ํ
์คํธ์ ๋ค์ํ ์กฐ์์ ํ๋ค
์ด๋ ์ค์ง์ ์ผ๋ก ์๋ณธ ์์ค ์ฝ๋ ํ์ผ์ ์์ ํ๋ ๋ฐฉ์์ ์๋๊ณ ์ผ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ์์ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝํ๋ค
์ ์ฒ๋ฆฌ๊ธฐ๋ ์ฃผ์์ ์ ๊ฑฐํ๊ณ ๊ฐ ์ฝ๋ํ์ผ์ด endline(์ค๋ฐ๊ฟ)์ผ๋ก ๋๋๊ฒ ํ๋ค, ๊ทธ๋ฆฌ๊ณ ์์ฃผ ์ค์ํ \#include ์ง์๋ฌธ์ ์ฒ๋ฆฌํ๋ค
์ด๋ ๊ฒ ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ฝ๋ ํ์ผ ์ฒ๋ฆฌ๋ฅผ ๋๋ธ ๊ฒฐ๊ณผ๋ฅผ Translation Unit์ด๋ผ ํ๊ณ ์ด๋ ์ปดํ์ผ๋ฌ์ ์ํด ์ปดํ์ผ ๋๋ค (์ด ๊ฒฐ๊ณผ์๋ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ์ด ํฌํจ๋์ง ์๊ณ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ ์ถ๋ ฅ๋ง ์ปดํ์ผ๋ฌ๋ก ์ ๋ฌ๋๋ค)
์ด๋ฌํ Translation Unit์ ๋จ์ผ cpp์ ๊ทธ cpp์ ์ฐ๊ฒฐ๋ ๋ชจ๋ .h๋ก ๊ตฌ์ฑ๋๋ค (๋ค๋ฅธ .h๋ฅผ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ .hํ์ผ์)
์ ์ฒ๋ฆฌ, ์ปดํ์ผ ,๋งํฌ ์ ์ฒด ๊ณผ์ ์ translation์ด๋ผ ํ๋ค
> \#include
์ ์ฒ๋ฆฌ๊ธฐ๋ ์์ค์ฝ๋ ํ์ผ์ ์์์ ์๋๋ก ์งํํ๋ฉฐ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ (\#์ผ๋ก ์์ํ๊ณ ์ค๋ฐ๊ฟ์ผ๋ก ๋๋๋ ์ง์๋ฌธ)์ ์ฐพ๋๋ค
์ด๋ฌํ ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ์ ์ฒ๋ฆฌ๊ธฐ์ ์์์ ์ ๋ฆฌํ ํน์ ํ
์คํธ ์กฐ์์ ์ง์ํ๋ค
(์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ C++๊ตฌ๋ฌธ์ ์ดํดํ์ง ๋ชปํ๋ค, ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ์์ฒด ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์์)
๋ํ์ ์ธ ์ ์ฒ๋ฆฌ๋ฌธ \#include \< iostream \> ์ผ๋ก ์ ๋ฆฌํด๋ณด์
```
#include <iostream>
int main()
{
std::cout << "Hello World" << std::endl;
}
```
์ ์ฒ๋ฆฌ๊ธฐ๋ \#include \< iostream \>์ iostream์ด๋ผ๋ ํ์ผ์ ๋ด์ฉ์ผ๋ก ๋ฐ๊พผ๋ค, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ iostream์ ์๋ณ์๋ค์ ์ ๋ถ ์ฌ์ฉํ ์ ์๋๊ฒ์ด๋ค
> macro
\#define์ผ๋ก ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค, ๋งคํฌ๋ก๋ ์
๋ ฅ๊ฐ์ ๋์ฒด ์ถ๋ ฅ๊ฐ์ผ๋ก ๋ณํ๋๋ ๋ฐฉ์์ ์ ์ํ ๊ฒ์ด๋ค
๋งคํฌ๋ก์๋ ;์ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ ์๋ณ์์ ๊ฐ์ ๋ช
๋ช
๊ท์น์ ์ฌ์ฉํ๋ค, ๋ณดํต ๋๋ฌธ์๋ก ๋ง์ด ์ฌ์ฉํ๋ค
```
#define NAME "Kelvin"
```
Kelvin์ด๋ผ๋ ์
๋ ฅ๊ฐ์ด NAME์ด๋ผ๋ ๋์ฒด ์ถ๋ ฅ ๊ฐ์ผ๋ก ๋ณํ๋ ๊ฒ์ด๋ค
```
std::cout << NAME < std::Endl; //KELVIN
```
์ด๋ฌํ ๋งคํฌ๋ก๋ฅผ Object-like macro๋ผ๊ณ ํ๋ค
Object-like macro๋ C Style์ ์์ ํํ๋ฒ์ด๋ค, ์ด๋ C++์์ ๋๋ ํ์ํ์ง ์์ ๋ฐฉ์์ด๊ณ ์ด๋ฏธ ๊ฑฐ์ Legacy ์ฝ๋์๋ง ์กด์ฌํ๋ค (์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค)
> Conditional Compile (์กฐ๊ฑด๋ถ ์ปดํ์ผ)
์กฐ๊ฑด๋ถ ์ปดํ์ผ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์์๋ง ์ปดํ์ผ, ์ปดํ์ผ ํ์ง ์์ ์ ์๋ค
๋ํ์ ์ผ๋ก \#ifdef, \#ifndef, \#endif๊ฐ ์๋ค
```
#define TESTDEF
int main()
{
#ifdef TESTDEF
std::cout << "TESTDEF is def!" << std::endl;
#endif
#ifdef TESTDEFFFFF
std::cout << "TESTDEFFFFF is def!" << std::endl;
#endif
}
```
\#ifdef๋ ์์ ์์ฑํ ์๋ณ์๊ฐ \#define์ ํตํด ์ด๋ฏธ ์ ์๋์๋์ง ์ฒดํฌํ๊ณ ์ ์ ๋์๋ค๋ฉด ์๋๋ฅผ ์ปดํ์ผํ๋ค, ์ด๋ ์ด๋ฅผ ๋ซ์์ฃผ๋ ์ญํ ์ด \#endif๋ค (ifndef๋ ๋ฐ๋์, ์ ์๋์ง ์์ผ๋ฉด ์ปดํ์ผ)
๋ฐ๋ผ์ ์์ ์ฝ๋๋ TESTDEF is def! ๊ฐ ์ถ๋ ฅ๋๊ณ ๋ฐ์๋ ์ปดํ์ผ ๋์ง ์๋๋ค
์ด๋ ์กฐ๊ธ ๋ C++์คํ์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค
```
#if defined(TESTDEF)
#endif
```
์ํ๋ ๋ถ๋ถ์ ์ปดํ์ผ์์ ๊ทธ๋ฅ ์ ์ธ์ํค๊ณ ์ถ๋ค๋ฉด \#if 0์ ์ฌ์ฉํ๋ค, \#if 1๋ก ๋ณ๊ฒฝํ๋ฉด ๋ค์ ์ปดํ์ผ์ ํฌํจ์ํจ๋ค
```
int main()
{
std::cout << "TESTDEF is def!" << std::endl;
#if 0
std::cout << "TESTDEFFFFF is def!" << std::endl; //์ปดํ์ผ ๋์ง ์์
#endif
}
```
์์์ ์ ๋ฆฌํ ๋งคํฌ๋ก ๋์ฒด๊ฐ์ ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์์๋ ๊ฐ์ ๋์ฒดํ์ง ์๋๋ค
```
#define FOO 9
#ifdef FOO //์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ด๊ธฐ ๋๋ฌธ์ 9๋ก ๋์ฒด๋์ง ์๋๋ค
std::cout << FOO << '\n'; //์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ด ์๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ 9๋ก ๋์ฒด๋๋ค
#endif
```
์ถ๊ฐ๋ก \#define์ ๋ํ
์ผ์ ์ ๋ฆฌํด๋ณด์
```
void foo()
{
#define NAME "Kelvin"
}
int main()
{
std::cout << NAME << std::endl;
}
```
์ ์ฝ๋๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค, ๋ถ๋ช
๋ณด๋ฉด NAME์ด foo() ๋ด๋ถ์ ์ ์ธ๋์ด ์ ํจ๋ฒ์๊ฐ { }์ผ ๊ฒ ๊ฐ์ main()์๋ ์ฌ์ฉํ์ง ๋ชปํ ๊ฒ ๊ฐ์ง๋ง ์ ์ฒ๋ฆฌ๊ธฐ๋ C++๊ตฌ๋ฌธ์ ์ดํดํ์ง ์๊ธฐ ๋๋ฌธ์ local๋ก ์ ์ธ๋ ๊ฒ์ด ์๋์ฌ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
๋ง์ง๋ง์ผ๋ก ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ํด๋น ์ง์๋ฌธ์ด ์์ฑ๋ ํ์ผ ๋ด๋ถ์์๋ง ์ ํจํ๋ค, ๋ฐ๋ผ์ \#include๋์ง ์์๋ค๋ฉด ๋ค๋ฅธ ํ์ผ์์๋ ์ํฅ์ ์ค ์ ์๋ค
```
//Add.cpp
#include <iostream>
void doSomething()
{
#ifdef PRINT
std::cout << "Printing!\n";
#endif
#ifndef PRINT
std::cout << "Not printing!\n";
#endif
}
//main.cpp
void doSomething();
#define PRINT
int main()
{
doSomething();
}
```
PRINT๊ฐ main์์ define๋์์ง๋ง main.cpp์์๋ง ์ ํจํ๊ธฐ ๋๋ฌธ์ Add.cpp์ ์ฝ๋์์๋ ์ ํ ์ํฅ์ ๋ฐ์ง ์๋๋ค ๋ฐ๋ผ์ Not Printing์ด ์ถ๋ ฅ๋๋ค
[](https://velog.io/@devkelvin/posts)
[dev.kelvin](https://velog.io/@devkelvin/posts)
GameDeveloper๐ฎ Dev C++, DataStructure, Algorithm, UE5, Assembly๐ , Git/Perforce๐
ํ๋ก์ฐ
[์ด์ ํฌ์คํธ \[Advanced C++\] 3. Function, Local Variable, ์์๊ฐ์ฒด](https://velog.io/@devkelvin/Advanced-C-3.-Function-Local-Variable-%EC%9E%84%EC%8B%9C%EA%B0%9D%EC%B2%B4)
[๋ค์ ํฌ์คํธ \[Advanced C++\] 5. ํค๋ํ์ผ, ํค๋๊ฐ๋](https://velog.io/@devkelvin/Advanced-C-5.-%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC-%ED%97%A4%EB%8D%94%EA%B0%80%EB%93%9C)
#### 0๊ฐ์ ๋๊ธ
๋๊ธ ์์ฑ |
| Readable Markdown | ## 1\. Forward Declaration
> ์ ๋ฐฉ์ ์ธ
๋ค์ ์ฝ๋๋ ์ปดํ์ผ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค ์์ผ๊น?
```
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
int add(int x, int y)
{
return x + y;
}
```
์ด์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค, ๋ฐ๋ผ์ main()์์ add()๋ฅผ ํธ์ถํ ๋ add์ ์ ์ธ์ด ๋ณด๋ค ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ add ์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ์ฌ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
์ด๋ฌํ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค
**1\. ํจ์ ์ ์ ์ฌ์ ๋ ฌ**
```
int add(int x, int y)
{
return x + y;
}
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
```
add()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ ์๋ฅผ ํด๋๋ ๋ฐฉ์์ผ๋ก ์ฌ์ ๋ ฌ ํ๊ฒ ๋๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์์ ์ ์๋ค (main()์์ ํธ์ถํ๋ add()๊ฐ ๋ฌด์์ธ์ง ์๊ธฐ ๋๋ฌธ์)
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ์์๋ ๋นํจ์จ์ ์ด๋ค (์์ ๋ค๋ฅธ ํ์ผ์ ์๋ ํจ์๋ค์ ์ฌ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅ)
๋ํ ์๋ก๋ฅผ ํธ์ถํ๋ ํจ์๋ ์ฌ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅํ๋ค
**2\. ์ ๋ฐฉ์ ์ธ**
์ ๋ฐฉ์ ์ธ์ ์ปดํ์ผ๋ฌ์ ๋ฏธ๋ฆฌ ์๋ณ์๋ฅผ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค
ํจ์์ ์ ์ธ์ ๋ฏธ๋ฆฌ ์์ฑํ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ์ ํด๋น ํจ์ ์๋ณ์๋ฅผ ์๋ฆฌ๊ฒ ๋๊ณ ํจ์๊ฐ ์ด๋ป๊ฒ, ์ด๋์ ์ ์๋์ด์๋์ง ์๊ด ์์ด ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค
์ ๋ฐฉ์ ์ธ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค
```
int add(int x, int y); //์ ๋ฐฉ์ ์ธ, ์ด๋ฅผ ํจ์ ํ๋กํ ํ์
์ด๋ผ ํ๋ค
int main()
{
add(10, 20);
}
```
์ด๋ ํจ์์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ํจ์ ์ ์ธ๋ถ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์์ฑํ์ง ์์๋ ๋๋ค
```
int add(int, int); //์ด๋ ๊ฒ๋ ๊ฐ๋ฅ
```
ํ์ง๋ง ์ด๋ ๊ฒ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์์ฑํ์ง ์์ผ๋ฉด ํด๋น ๋งค๊ฐ๋ณ์๊ฐ ์ด๋ค ์๋ฏธ์ธ์ง ํ์
ํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ๊น์ง ๊ฐ์ด ์์ฑํ๋๊ฑธ ๊ถ์ฅํ๋ค
์ ๋ฐฉ์ ์ธ์ ์์๋ก๋ถํฐ ๋
๋ฆฝ์ ์ธ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ ์ํ ์ข
์์ฑ์ ํด๊ฒฐํ ์ ์๋ค
ํจ์๋ฅผ ์ ๋ฐฉ์ ์ธํ๊ณ ์ ์ํ์ง ์์ผ๋ฉด LNK์๋ฌ๊ฐ ๋ฐ์ํ๋ค (์ปดํ์ผ์ ๋์ง๋ง ๋งํฌ ๋จ๊ณ์์ ์คํจ)
## 2\. ์ ์ธ๊ณผ ์ ์
> ์ ์ธ์ด๋
์ ์ธ์ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ณ์์ ์กด์ฌ์ ์ฐ๊ด๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค
```
int add(int x, int y); //int๋ฐํํ์ int 2๊ฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ง๋ ํจ์ ์๋ณ์ ์ ๋ณด
int a; //intํ์
์ a๋ผ๋ ์ด๋ฆ์ ๋ณ์ ์๋ณ์ ์ ๋ณด
```
> ์ ์๋
์ ์๋ ์ ์ธํ ์๋ณ์๋ฅผ ์ค์ ๋ก ๊ตฌํํ๊ฑฐ๋ ์ธ์คํด์คํ ํ๋๊ฒ์ด๋ค
```
int add(int x, int y)
{
return x + y;
}
int a; //์ ์์ด์ ์ ์ธ
int a { 10 }; //์ด๊ฑด ์ด๊ธฐํ์
```
C++์์ ๋ชจ๋ ์ ์๋ ๊ณง ์ ์ธ์ด๋ค ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ int a์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ ์์ด์ ์ ์ธ์ด ๋๋ค
ํ์ง๋ง ์ญ์ ์ฑ๋ฆฝํ์ง ์๋๋ค ๋ชจ๋ ์ ์ธ์ด ์ ์๋ ์๋๋ค, ์ ์๊ฐ ์๋ ์ ์ธ์ ์์ ์ ์ธ (pure declaration)์ด๋ผ ํ๋ฉฐ ์ ๋ฐฉ์ ์ธ์ด ์ฌ๊ธฐ์ ํฌํจ๋๋ค
์ปดํ์ผ๋ฌ๋ ์๋ณ์๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ํด๋น ์๋ณ์์ ์ฌ์ฉ์ด validํ์ง ์ฒดํฌํ๋ค (์ด๋ ์ ์ธ๋ง ํ์ธํ๊ณ ์ ์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ค์ ๋ก ๋ณด์ง ์์๋ ๋๋ค, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ์ผ์์ ์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฒ, ๋ฌผ๋ก ์์ธ๋ ์๋ค (template))
> One Definition Rule (ODR)
C++์๋ ODR์ด๋ผ๋ ๊ท์น์ด ์กด์ฌํ๋ค
**1\. ๊ฐ์ ๋ฒ์์์์ ํจ์, ๋ณ์, type ํน์ template๋ค์ ํ๋์ ์ ์๋ง ๊ฐ์ง ์ ์๋ค**
```
int add(int x, int y)
{
return x + y;
}
int add(int x, int y)
{
return x + y;
}
int main()
{
int x{};
int x{ 5 };
}
//ODR 1๋ฒ ๊ท์น ์๋ฐฐ (์ค๋ณต ์ ์)
```
**2\. type, template, inline function/variable์ ์ ์๊ฐ ๋์ผํ ํ ๋ค๋ฅธ ํ์ผ์ ์ค๋ณต๋ ์ ์๋ฅผ ๊ฐ์ง ์ ์๋ค**
## 2\. C++ ์ปดํ์ผ ๋ฐฉ์
์๋ก์ด cppํ์ผ์ ๋ง๋ค๊ณ ์ฌ๊ธฐ์ ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์
```
//Add.cpp
int add(int x, int y)
{
return x + y;
}
```
์ปดํ์ผ๋ฌ๋ ํ์ผ๋ค์ ๊ฐ๋ณ์ ์ผ๋ก ์ปดํ์ผํ๋ค ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๋ ๋ค๋ฅธ ํ์ผ์ ์์ค์ฝ๋๋ฅผ ์์ง ๋ชปํ๊ณ ์ด์ ์ ์ปดํ์ผ ๋ ์ฝ๋์ ๋ด์ฉ๋ ์์ง ๋ชปํ๋ค
```
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n'; // compile error
return 0;
}
```
๋ฐ๋ผ์ ์ ์ฝ๋๋ add์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
์ด๋ฌํ ๋ฐฉ์์ ๊ต์ฅํ ๋ถํธํด๋ณด์ด์ง๋ง ์ ๋ถ ๋ถ๋ช
ํ ์๋๊ฐ ์๋ค
**1\. ์์ค ํ์ผ์ ์ด๋ค ์์๋ก๋ ์ปดํ์ผ์ด ๊ฐ๋ฅ**
**2\. ํน์ ์์คํ์ผ์ ์์ ํ๋ฉด ์์ ํ ํด๋น ์์ค ํ์ผ๋ง ๋ฐ๋ก ์ปดํ์ผ์ด ๊ฐ๋ฅ**
**3\. ์๋ก ๋ค๋ฅธ ์์คํ์ผ์์์ ์๋ณ์ ์ด๋ฆ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค**
๊ฒฐ๊ตญ ์์ ์ปดํ์ผ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ ๋ฐฉ์ ์ธ์ ํด์ผํ๋ค
์ ๋ฐฉ์ ์ธ์ ํ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ์๋ณ์๊ฐ validํ๋ค๊ณ ํ๋จํด add()๋ฅผ ํธ์ถํ ์ ์๊ณ ๋ง์ปค๊ฐ add.cpp์ addํจ์ ์ ์์ ์ฐ๊ฒฐํ๋ค
## 3\. ์ด๋ฆ ์ถฉ๋, namespace
> ์๋ณ์ ๋ช
๋ช
์ถฉ๋
C++์์๋ ๋ชจ๋ ์๋ณ์๊ฐ ๋ชจํธํ์ง ์์์ผ ํ๋ค (๊ฐ์ ๋ฒ์์์ ๊ฐ์ ์๋ณ์ ์ด๋ฆ ์ฌ์ฉX)
์ด๋ ๊ฒ ๋๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ง์ปค๋ ์ด๋ค ์๋ณ์๋ฅผ ์ฌ์ฉ ํด์ผํ ์ง ๊ตฌ๋ถ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
(๋ช
๋ช
์ถฉ๋)
```
//Add.cpp
int add(int x, int y)
{
return x + y;
}
//main.cpp
int add(int x, int y)
{
return x + y;
}
int main()
{
add(10, 20);
}
```
ํด๋น ์ฝ๋๋ ๋
๋ฆฝ์ ์ผ๋ก ์ปดํ์ผ ๋์ด ์ปดํ์ผ ์๋ฌ๋ ๋ฐ์ํ์ง ์์ง๋ง add๋ผ๋ ํจ์ ์ด๋ฆ ์ถฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋งํฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
(add() ํธ์ถ ์ ์ด๋ค add()๋ฅผ ํธ์ถํ ์ง ๋ชจํธํ๊ธฐ ๋๋ฌธ)
ํ๋ก์ ํธ์ ์ฌ์ด์ฆ๊ฐ ์ ์ ์ปค์ง์๋ก ์ด๋ฌํ ๋ช
๋ช
์ถฉ๋์ ๋ ์์ฃผ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค, C++์๋ ์ด๋ฌํ ๋ช
๋ช
์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค
(local variable ์ด๋ฆ ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํ { }์ ๊ฐ์ ๋ฐฉ๋ฒ๋ค)
> namespace
namespace๋ namespace์์ ์ ์ธ๋ ์๋ณ์๊ฐ ๋ค๋ฅธ ๋ฒ์์์ ์ ์ธ๋ ์๋ณ์์ ๋ณ๊ฐ๋ก ๊ฐ์ฃผ๋๋ ์์ค์ฝ๋ ์์ญ์ด๋ค (๋์ผํ ์๋ณ์๋ช
์ ๊ฐ์ ธ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค)
ํ์ง๋ง ๊ฐ์ namespace ์์์๋ ๋ชจ๋ ์๋ณ์๋ ๊ณ ์ ํด์ผ ํ๋ค
ํจ์์์๋ { }๋ฅผ ์ด์ฉํ์ฌ local variable์ ์๋ณ์๋ฅผ ๊ณ ์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค
```
int Foo()
{
int a;
{
int a;
}
}
```
namespace ๋ด๋ถ์๋ ์ ์ธ๊ณผ ์ ์๋ง ๊ฐ๋ฅํ๋ค (์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ๊ณผ ๊ฐ์ ์คํ ๊ฐ๋ฅํ ๋ฌธ์ฅ (Executable Statement)๋ค์ namespace์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง namespace์์ ํจ์๋ฅผ ์ ์ ํ๋ ๋ถ๋ถ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค)
```
namespace Math
{
const double PI = 3.14159; // ์ ์ธ ๋ฐ ์ ์
double square(double x)
{
return x * x; // ์คํ ๊ฐ๋ฅํ ๋ฌธ์ฅ
}
}
```
namespace์๋ ์ด๋ฆ์ ๋ถํ ์ ์๋ค
```
namespace ์ด๋ฆ
{
}
namespace Math
{
double PI = 3.141592;
}
```
ํน์ namespace ๋ด๋ถ์ ์๋ณ์๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค
```
Math::PI; //๋ช
์์ ์ผ๋ก namespace:: ๋ฒ์๋ฅผ ์ง์ ํ์ฌ ์๋ณ์ ์ ๊ทผ
```
์ฌ๊ธฐ์ ::๋ ๋ฒ์ ์ง์ ์ฐ์ฐ์์ด๋ค
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ using์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค
```
using namepsace std;
PI;
```
์ด๋ ๊ฒ ํ๋ฉด ๋ช
์์ ์ผ๋ก namespace::๋ฅผ ํ ํ์๊ฐ ์๋ค, ํ์ง๋ง ์ด๋ ์ง์ํ๋ค ์๋ํ๋ฉด ๋ช
๋ช
์ถฉ๋์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค
```
using namespace std;
int cout()
{
return 5;
}
int main()
{
cout << "Hello, world!";
return 0;
}
```
์ ์ฝ๋๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค, Global namespace์ ์ ์ธ๋ cout()์ ํธ์ถํ๋์ง std::cout์ ํธ์ถํ๋์ง ๋ง์ปค๋ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค
๋ฐ๋ผ์ namespace::๋ก ๋ด๋ถ ์๋ณ์์ ์ ๊ทผํ๋๊ฒ namespace์ ์กด์ฌ ์์์ ๋ ์ ํฉํ๋ค
> Global namespace
๋ง์ฝ ํจ์๋ ๋ณ์๋ฅผ ์ ์ญ์ผ๋ก ์ ์ธํ๊ฒ ๋๋ฉด ์ด ์๋ณ์๋ค์ ์๋ฌต์ ์ผ๋ก Global namespace์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ค ๋ฐ๋ผ์ ๊ฐ์ namespace๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ๋ช
๋ช
์ถฉ๋์ด ๋ฐ์ํ๊ฒ ๋๋ค
(์์์ add() ์๋ฌ๊ฐ ๋ฐ์ํ ์ด์ )
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ namespace ๊ท์น๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค
```
void foo();
int x;
int y { 5 };
x = 5; //Global namespace์์ executable statement๋ฅผ ์ฌ์ฉํ ์ ์๋ค
```
> std namespace
C++์ด ์ฒ์ ์ค๊ณ ๋์์ ๋ std namespace์ ์๋ณ์๋ค์ std::์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ์์ง๋ง ์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉฐ ๋ช
๋ช
์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ ธ std namespace๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค (standard) (cout, cin ๋ฑ ๋ค์ํ ํจ์๋ฅผ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค)
## 4\. ์ ์ฒ๋ฆฌ๊ธฐ
> ์ ์ฒ๋ฆฌ
ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผ ํ๊ธฐ ์ ์ ๊ฐ ์์ค์ฝ๋ ํ์ผ๋ค์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ค, ์ด๋ ์ ์ฒ๋ฆฌ๊ธฐ๋ ์์ค์ฝ๋ ํ์ผ์ ํ
์คํธ์ ๋ค์ํ ์กฐ์์ ํ๋ค
์ด๋ ์ค์ง์ ์ผ๋ก ์๋ณธ ์์ค ์ฝ๋ ํ์ผ์ ์์ ํ๋ ๋ฐฉ์์ ์๋๊ณ ์ผ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ์์ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝํ๋ค
์ ์ฒ๋ฆฌ๊ธฐ๋ ์ฃผ์์ ์ ๊ฑฐํ๊ณ ๊ฐ ์ฝ๋ํ์ผ์ด endline(์ค๋ฐ๊ฟ)์ผ๋ก ๋๋๊ฒ ํ๋ค, ๊ทธ๋ฆฌ๊ณ ์์ฃผ ์ค์ํ \#include ์ง์๋ฌธ์ ์ฒ๋ฆฌํ๋ค
์ด๋ ๊ฒ ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ฝ๋ ํ์ผ ์ฒ๋ฆฌ๋ฅผ ๋๋ธ ๊ฒฐ๊ณผ๋ฅผ Translation Unit์ด๋ผ ํ๊ณ ์ด๋ ์ปดํ์ผ๋ฌ์ ์ํด ์ปดํ์ผ ๋๋ค (์ด ๊ฒฐ๊ณผ์๋ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ์ด ํฌํจ๋์ง ์๊ณ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ ์ถ๋ ฅ๋ง ์ปดํ์ผ๋ฌ๋ก ์ ๋ฌ๋๋ค)
์ด๋ฌํ Translation Unit์ ๋จ์ผ cpp์ ๊ทธ cpp์ ์ฐ๊ฒฐ๋ ๋ชจ๋ .h๋ก ๊ตฌ์ฑ๋๋ค (๋ค๋ฅธ .h๋ฅผ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ .hํ์ผ์)
์ ์ฒ๋ฆฌ, ์ปดํ์ผ ,๋งํฌ ์ ์ฒด ๊ณผ์ ์ translation์ด๋ผ ํ๋ค
> \#include
์ ์ฒ๋ฆฌ๊ธฐ๋ ์์ค์ฝ๋ ํ์ผ์ ์์์ ์๋๋ก ์งํํ๋ฉฐ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ (\#์ผ๋ก ์์ํ๊ณ ์ค๋ฐ๊ฟ์ผ๋ก ๋๋๋ ์ง์๋ฌธ)์ ์ฐพ๋๋ค
์ด๋ฌํ ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ์ ์ฒ๋ฆฌ๊ธฐ์ ์์์ ์ ๋ฆฌํ ํน์ ํ
์คํธ ์กฐ์์ ์ง์ํ๋ค
(์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ C++๊ตฌ๋ฌธ์ ์ดํดํ์ง ๋ชปํ๋ค, ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ์์ฒด ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์์)
๋ํ์ ์ธ ์ ์ฒ๋ฆฌ๋ฌธ \#include \< iostream \> ์ผ๋ก ์ ๋ฆฌํด๋ณด์
```
#include <iostream>
int main()
{
std::cout << "Hello World" << std::endl;
}
```
์ ์ฒ๋ฆฌ๊ธฐ๋ \#include \< iostream \>์ iostream์ด๋ผ๋ ํ์ผ์ ๋ด์ฉ์ผ๋ก ๋ฐ๊พผ๋ค, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ iostream์ ์๋ณ์๋ค์ ์ ๋ถ ์ฌ์ฉํ ์ ์๋๊ฒ์ด๋ค
> macro
\#define์ผ๋ก ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค, ๋งคํฌ๋ก๋ ์
๋ ฅ๊ฐ์ ๋์ฒด ์ถ๋ ฅ๊ฐ์ผ๋ก ๋ณํ๋๋ ๋ฐฉ์์ ์ ์ํ ๊ฒ์ด๋ค
๋งคํฌ๋ก์๋ ;์ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ ์๋ณ์์ ๊ฐ์ ๋ช
๋ช
๊ท์น์ ์ฌ์ฉํ๋ค, ๋ณดํต ๋๋ฌธ์๋ก ๋ง์ด ์ฌ์ฉํ๋ค
```
#define NAME "Kelvin"
```
Kelvin์ด๋ผ๋ ์
๋ ฅ๊ฐ์ด NAME์ด๋ผ๋ ๋์ฒด ์ถ๋ ฅ ๊ฐ์ผ๋ก ๋ณํ๋ ๊ฒ์ด๋ค
```
std::cout << NAME < std::Endl; //KELVIN
```
์ด๋ฌํ ๋งคํฌ๋ก๋ฅผ Object-like macro๋ผ๊ณ ํ๋ค
Object-like macro๋ C Style์ ์์ ํํ๋ฒ์ด๋ค, ์ด๋ C++์์ ๋๋ ํ์ํ์ง ์์ ๋ฐฉ์์ด๊ณ ์ด๋ฏธ ๊ฑฐ์ Legacy ์ฝ๋์๋ง ์กด์ฌํ๋ค (์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค)
> Conditional Compile (์กฐ๊ฑด๋ถ ์ปดํ์ผ)
์กฐ๊ฑด๋ถ ์ปดํ์ผ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์์๋ง ์ปดํ์ผ, ์ปดํ์ผ ํ์ง ์์ ์ ์๋ค
๋ํ์ ์ผ๋ก \#ifdef, \#ifndef, \#endif๊ฐ ์๋ค
```
#define TESTDEF
int main()
{
#ifdef TESTDEF
std::cout << "TESTDEF is def!" << std::endl;
#endif
#ifdef TESTDEFFFFF
std::cout << "TESTDEFFFFF is def!" << std::endl;
#endif
}
```
\#ifdef๋ ์์ ์์ฑํ ์๋ณ์๊ฐ \#define์ ํตํด ์ด๋ฏธ ์ ์๋์๋์ง ์ฒดํฌํ๊ณ ์ ์ ๋์๋ค๋ฉด ์๋๋ฅผ ์ปดํ์ผํ๋ค, ์ด๋ ์ด๋ฅผ ๋ซ์์ฃผ๋ ์ญํ ์ด \#endif๋ค (ifndef๋ ๋ฐ๋์, ์ ์๋์ง ์์ผ๋ฉด ์ปดํ์ผ)
๋ฐ๋ผ์ ์์ ์ฝ๋๋ TESTDEF is def! ๊ฐ ์ถ๋ ฅ๋๊ณ ๋ฐ์๋ ์ปดํ์ผ ๋์ง ์๋๋ค
์ด๋ ์กฐ๊ธ ๋ C++์คํ์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค
```
#if defined(TESTDEF)
#endif
```
์ํ๋ ๋ถ๋ถ์ ์ปดํ์ผ์์ ๊ทธ๋ฅ ์ ์ธ์ํค๊ณ ์ถ๋ค๋ฉด \#if 0์ ์ฌ์ฉํ๋ค, \#if 1๋ก ๋ณ๊ฒฝํ๋ฉด ๋ค์ ์ปดํ์ผ์ ํฌํจ์ํจ๋ค
```
int main()
{
std::cout << "TESTDEF is def!" << std::endl;
#if 0
std::cout << "TESTDEFFFFF is def!" << std::endl; //์ปดํ์ผ ๋์ง ์์
#endif
}
```
์์์ ์ ๋ฆฌํ ๋งคํฌ๋ก ๋์ฒด๊ฐ์ ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์์๋ ๊ฐ์ ๋์ฒดํ์ง ์๋๋ค
```
#define FOO 9
#ifdef FOO //์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ด๊ธฐ ๋๋ฌธ์ 9๋ก ๋์ฒด๋์ง ์๋๋ค
std::cout << FOO << '\n'; //์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ด ์๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ 9๋ก ๋์ฒด๋๋ค
#endif
```
์ถ๊ฐ๋ก \#define์ ๋ํ
์ผ์ ์ ๋ฆฌํด๋ณด์
```
void foo()
{
#define NAME "Kelvin"
}
int main()
{
std::cout << NAME << std::endl;
}
```
์ ์ฝ๋๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค, ๋ถ๋ช
๋ณด๋ฉด NAME์ด foo() ๋ด๋ถ์ ์ ์ธ๋์ด ์ ํจ๋ฒ์๊ฐ { }์ผ ๊ฒ ๊ฐ์ main()์๋ ์ฌ์ฉํ์ง ๋ชปํ ๊ฒ ๊ฐ์ง๋ง ์ ์ฒ๋ฆฌ๊ธฐ๋ C++๊ตฌ๋ฌธ์ ์ดํดํ์ง ์๊ธฐ ๋๋ฌธ์ local๋ก ์ ์ธ๋ ๊ฒ์ด ์๋์ฌ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
๋ง์ง๋ง์ผ๋ก ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ํด๋น ์ง์๋ฌธ์ด ์์ฑ๋ ํ์ผ ๋ด๋ถ์์๋ง ์ ํจํ๋ค, ๋ฐ๋ผ์ \#include๋์ง ์์๋ค๋ฉด ๋ค๋ฅธ ํ์ผ์์๋ ์ํฅ์ ์ค ์ ์๋ค
```
//Add.cpp
#include <iostream>
void doSomething()
{
#ifdef PRINT
std::cout << "Printing!\n";
#endif
#ifndef PRINT
std::cout << "Not printing!\n";
#endif
}
//main.cpp
void doSomething();
#define PRINT
int main()
{
doSomething();
}
```
PRINT๊ฐ main์์ define๋์์ง๋ง main.cpp์์๋ง ์ ํจํ๊ธฐ ๋๋ฌธ์ Add.cpp์ ์ฝ๋์์๋ ์ ํ ์ํฅ์ ๋ฐ์ง ์๋๋ค ๋ฐ๋ผ์ Not Printing์ด ์ถ๋ ฅ๋๋ค |
| Shard | 105 (laksa) |
| Root Hash | 10166624061664201905 |
| Unparsed URL | io,velog!/@devkelvin/Advanced-C-4 s443 |