๐Ÿ•ท๏ธ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 105 (from laksa092)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

โ„น๏ธ Skipped - page is already crawled

๐Ÿ“„
INDEXABLE
โœ…
CRAWLED
20 days ago
๐Ÿค–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.7 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://velog.io/@devkelvin/Advanced-C-4
Last Crawled2026-03-20 00:51:30 (20 days ago)
First Indexed2025-08-06 16:33:26 (8 months ago)
HTTP Status Code200
Meta Title[Advanced C++] 4. ์ „๋ฐฉ์„ ์–ธ , ์‹๋ณ„์ž ์„ ์–ธ&์ •์˜์— ๋Œ€ํ•ด, C++์ปดํŒŒ์ผ๋ฐฉ์‹, ๋ช…๋ช…์ถฉ๋Œ & namespace, ์ „์ฒ˜๋ฆฌ๊ธฐ & ์ „์ฒ˜๋ฆฌ์ง€์‹œ๋ฌธ
Meta Description์ „๋ฐฉ์„ ์–ธ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค ์™œ์ผ๊นŒ?์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค, ๋”ฐ๋ผ์„œ main()์—์„œ add()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ add์˜ ์„ ์–ธ์ด ๋ณด๋‹ค ๋ฐ‘์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— add ์‹๋ณ„์ž๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜์—ฌ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค์ด๋Ÿฌํ•œ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„
Meta Canonicalnull
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 ![post-thumbnail](https://velog.velcdn.com/images/devkelvin/post/186fccea-3344-42c2-8a28-b0bbd90bb453/image.png) # 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์ด ์ถœ๋ ฅ๋œ๋‹ค [![profile](https://velog.velcdn.com/images/devkelvin/profile/20d348a4-448f-41ea-9460-5b96cfdbbf9c/image.jpg)](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์ด ์ถœ๋ ฅ๋œ๋‹ค
Shard105 (laksa)
Root Hash10166624061664201905
Unparsed URLio,velog!/@devkelvin/Advanced-C-4 s443