Computer-Science

00. C++ Tutorial

Hello World

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•  ์‚ฌ์‹ค ๋ช‡ ๊ฐ€์ง€

  1. ํ—ค๋”ํŒŒ์ผ์˜ ์„ ์–ธ - #include <iostream>
  2. ์ถœ๋ ฅ์˜ ๊ธฐ๋ณธ๊ตฌ์„ฑ - std::cout<<"์ถœ๋ ฅ๋Œ€์ƒ1"<<"์ถœ๋ ฅ๋Œ€์ƒ2";
  3. ๊ฐœํ–‰์˜ ์ง„ํ–‰ - std::endl
#include <iostream>

int main(void)
{
  int num=20;
  std::cout<<"Hello World!"<<std::endl;
  return 0;
}

scanf๋ฅผ ๋Œ€์‹ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ

  1. ์ž…๋ ฅ์˜ ๊ธฐ๋ณธ๊ตฌ์„ฑ - std::cin>>๋ณ€์ˆ˜
  2. ๋ณ€์ˆ˜์˜ ์„ ์–ธ์œ„์น˜ - ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ๋ถ€๋ถ„์—์„œ๋„ ๋ณ€์ˆ˜์˜ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
std::cin>>val1>>val2;

์ด๋ ‡๋“ฏ ์—ฐ์ด์€ ๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ์„ ๋ช…๋ นํ•  ์ˆ˜ ์žˆ๋‹ค. std::cin์„ ํ†ตํ•ด์„œ ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ๋ถ„์€ ์ŠคํŽ˜์ด์Šค ๋ฐ”, ์—”ํ„ฐ, ํƒญ๊ณผ ๊ฐ™์€ ๊ณต๋ฐฑ์„ ํ†ตํ•ด์„œ ์ด๋ค„์ง„๋‹ค.

๋ฐฐ์—ด ๊ธฐ๋ฐ˜์˜ ๋ฌธ์ž์—ด ์ž…์ถœ๋ ฅ

#include <iostream>

int main(void)
{
  char name[100];

  std::cout<<"What's your name?";
  std::cin>>name;

  std::cout<<"Your name is "<<name<<".\n";

  return 0;
}

๋ฌธ์ž์—ด์˜ ์ž…๋ ฅ๋ฐฉ์‹๋„ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ๋ฐฉ์‹๊ณผ ํฐ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ

int MyFunc(int num)
{
    num++;
    return num;
}

int MyFunc(int a, int b)
{
    return a + b;
}

int main(void)
{
    MyFunc(20);     // MyFunc(int num) ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ
    MyFunc(30, 40); // MyFunc(int a, int b) ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ
    return 0;
}

C++์€ ํ•จ์ˆ˜ํ˜ธ์ถœ ์‹œ โ€˜ํ•จ์ˆ˜์˜ ์ด๋ฆ„โ€™๊ณผ โ€˜์ „๋‹ฌ๋˜๋Š” ์ธ์ž์˜ ์ •๋ณดโ€™๋ฅผ ๋™์‹œ์— ์ฐธ์กฐํ•˜์—ฌ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ ‡๋“ฏ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์„ ์–ธ์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋„ ์ •์˜ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ํ•จ์ˆ˜ ์ •์˜๋ฅผ ๊ฐ€๋ฆฌ์ผœ โ€˜ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ(Function Overloading)โ€™์ด๋ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ์˜ˆ

int MyFunc(char c) {...}
int MyFunc(int n) {...}

-> ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜•์ด ๋‹ค๋ฅด๋ฏ€๋กœ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ ์„ฑ๋ฆฝ

int MyFunc(int n) {...}
int MyFunc(int n1, int n2) {...}

-> ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ ์„ฑ๋ฆฝ

void MyFunc(int n) {...}
int MyFunc(int n) {...}

-> ๋ฐ˜ํ™˜ํ˜•์˜ ์ฐจ์ด๋Š” ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

๋ฐฐ๊ฐœ๋ณ€์ˆ˜์— ์„ค์ •ํ•˜๋Š” โ€˜๋””ํดํŠธ ๊ฐ’โ€™์˜ ์˜๋ฏธ

int MyFuncOne(int num=7) { return num+1; }

-> ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด 7์ด ์ „๋‹ฌ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ ๋””ํดํŠธ ๊ฐ’์€ 7 ๋”ฐ๋ผ์„œ ์ด ํ•จ์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋‹ค์Œ ๋‘ ํ•จ ์ˆ˜์˜ ํ˜ธ์ถœ์€ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค.
MyFuncOne( ); MyFuncOne(7);

int MyFuncTwo(int num1=5; int num2=7) { return num1+num2; }

-> ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ๊ฐ 5์™€ 7์ด ์ „๋‹ฌ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํ•จ์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋‹ค์Œ ๋‘ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์€ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค.
MyFuncTwo( ); MyFuncTwo(5, 7);

๋ถ€๋ถ„์  ๋””ํดํŠธ ๊ฐ’ ์„ค์ •

int YourFunc(int num1, int num2=5, int num3=7) { ... }

YourFunc(10);     // YourFunc(10,5,7)
YourFunc(10, 20); // YourFunc(10,20,7)

-> ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ผ๋ถ€์—๋งŒ ๋””ํดํŠธ ๊ฐ’์„ ์ง€์ • ํ•˜๊ณ , ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋งŒ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

int YourFunc(int num1, int num2, int num3=30) {...}       // (O)
int YourFunc(int num1, int num2=20, int num3=30) {...}    // (O)
int YourFunc(int num1=10, int num2=20, int num3=30) {...} // (O)

-> ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๊ฐ€ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง€๋ฏ€๋กœ, ๋””ํดํŠธ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ์•ผ ํ•œ๋‹ค.

int WrongFunc(int num1=10, int num2, int num3) { ... }    // (X)
int WrongFunc(int num1=10, int num2=20, int num3) { ... } // (X)

-> ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๊ฐ€ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง€๋ฏ€๋กœ, ์˜ค๋ฅธ์ชฝ์ด ๋นˆ ์ƒํƒœ๋กœ ์™ผ์ชฝ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋งŒ ์ผ๋ถ€ ์ฑ„์›Œ์ง„ ๋””ํดํŠธ ๊ฐ’์€ ์˜๋ฏธ๋ฅผ ๊ฐ–์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚จ๋‹ค.

์ด๋ฆ„๊ณต๊ฐ„์˜ ๊ธฐ๋ณธ์›๋ฆฌ

๋™์ผํ•œ ์ด๋ฆ„๊ณต๊ฐ„ ๋‚ด์—์„œ์˜ ํ•จ์ˆ˜ํ˜ธ์ถœ

using์„ ์ด์šฉํ•œ ์ด๋ฆ„๊ณต๊ฐ„์˜ ๋ช…์‹œ

using namrspace std; ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•œ using namrspace์˜ ์„ ์–ธ์€ ์ด๋ฆ„์˜ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ์œ„ํ•œ ์ด๋ฆ„๊ณต๊ฐ„์˜ ์„ ์–ธ์„ ์˜๋ฏธ ์—†๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋”ฐ๋ผ์„œ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค!

์ฐธ์กฐ์ž(Reference)

int num1 = 2010;  // ๋ณ€์ˆ˜์˜ ์„ ์–ธ์œผ๋กœ ์ธํ•ด์„œ num1์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ• ๋‹น๋œ๋‹ค.
int &num2 = num1; // ์ฐธ์กฐ์ž์˜ ์„ ์–ธ์œผ๋กœ ์ธํ•ด์„œ num1์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— num2๋ผ๋Š” ์ด๋ฆ„์ด ์ถ”๊ฐ€๋กœ ๋ถ™๊ฒŒ ๋œ๋‹ค.

๋ถˆ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ์ž์˜ ์„ ์–ธ์˜ ์˜ˆ

int &ref=20;    // (X) ์ƒ์ˆ˜ ๋Œ€์ƒ์œผ๋กœ์˜ ์ฐธ์กฐ์ž ์„ ์–ธ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
int &ref;       // (X) ์ฐธ์กฐ์ž๋Š” ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค.
int &ref=NULL;  // (X) ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ NULL๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, ์ฐธ์กฐ์ž๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ์ฐธ์กฐ์˜ ๋Œ€์ƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€์ˆ˜๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฐธ์กฐ์ž๋Š” ์ฐธ์กฐ์˜ ๋Œ€์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

int arr[3] = {1, 3, 5};

int &ref1 = arr[0];
int &ref2 = arr[1];
int &ref3 = arr[2];

cout<<ref1<<ref2<<ref3; // 135

๋ณ€์ˆ˜์˜ ์„ฑํ–ฅ์„ ์ง€๋‹ˆ๋Š” ๋Œ€์ƒ์ด๋ผ๋ฉด ์ฐธ์กฐ์ž์˜ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐฐ์—ด์˜ ์š”์†Œ ์—ญ์‹œ ๋ณ€์ˆ˜์˜ ์„ฑํ–ฅ์„ ์ง€๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ์ž์˜ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Call-by-value & Call-by-reference

void SwapByValue(int num1, int num2)
{
    int temp = num1;
    num1 = num2;
    num2 = temp;
} // Call-by-value

void SwapByPtr(int *ptr1, int *ptr2)
{
    int temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
} // Call-by-pointer

void SwapByRef(int &ref1, int &ref2)
{
    int temp = ref1;
    ref1 = ref2;
    ref2 = temp;
} // Call-by-reference

C++์˜ ํ‘œ์ค€ ํ—ค๋”

c๋ฅผ ๋”ํ•˜๊ณ , .h๋ฅผ ๋นผ๋ผ #include <math.h> to #include <cmath>

์ด๋ฆ„๊ณต๊ฐ„(namespace)์— ๋Œ€ํ•œ ์ดํ•ด

๋จผ์ € cout ์•ž์— ๋ถ™์–ด ์žˆ๋Š” std ์˜ ์ •์ฒด๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž. std ๋Š” C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  ํ•จ์ˆ˜, ๊ฐ์ฒด ๋“ฑ์ด ์ •์˜๋œ ์ด๋ฆ„ ๊ณต๊ฐ„(namespace) ์ด๋‹ค.

โ€œํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€ ๋‚˜ โ€œ๊ฐ์ฒดโ€ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•„์ง ๋ชฐ๋ผ๋„ ๊ดœ์ฐฎ๋‹ค. ๊ทธ๋ƒฅ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜์ž๋ฉด stdio.h ๊ฐ€ C ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ฏ์ด iostream ๋„ C++ ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ถœ๋ ฅ์„ ์œ„ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฆ„ ๊ณต๊ฐ„์ด๋ž€ ๊ฒƒ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ผ๊นŒ? ์ด๋ฆ„ ๊ณต๊ฐ„์€ ๋ง๊ทธ๋Œ€๋กœ ์–ด๋–ค ์ •์˜๋œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์–ด๋”” ์†Œ์†์ธ์ง€ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.

์ฝ”๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ, ํ˜น์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์“ด ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉด์„œ ์ค‘๋ณต๋œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋“ค์ด ๋งŽ์•„์ง„๋‹ค. ๋”ฐ๋ผ์„œ C++ ์—์„œ๋Š” ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ™์€ ์ด๋ฆ„์ด๋ผ๋„, ์†Œ์†๋œ ์ด๋ฆ„ ๊ณต๊ฐ„์ด ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๊ฐ™์€ ์ฒ ์ˆ˜๋ผ๊ณ  ํ•ด๋„, ์„œ์šธ ์‚ฌ๋Š” ์ฒ ์ˆ˜์™€ ๋ถ€์‚ฐ ์‚ฌ๋Š” ์ฒ ์ˆ˜์™€ ๋‹ค๋ฅด๋“ฏ์ด ๋ง์ด๋‹ค.

std::cout

์œ„์˜ ๊ฒฝ์šฐ std ๋ผ๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„์— ์ •์˜๋˜์–ด ์žˆ๋Š” cout ์„ ์˜๋ฏธํ•œ๋‹ค. ๋งŒ์•ฝ์— std:: ์—†์ด ๊ทธ๋ƒฅ cout ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ cout ์„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค. ์„œ์šธ์— ์‚ฌ๋Š” ์ฒ ์ˆ˜์ธ์ง€ ๋ถ€์‚ฐ์— ์‚ฌ๋Š” ์ฒ ์ˆ˜ ์ธ์ง€ ์•Œ ๊ธธ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ฆ„ ๊ณต๊ฐ„์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‘ ํ—ค๋”ํŒŒ์ผ header1.h ์™€ header2.h ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

// header1.h ์˜ ๋‚ด์šฉ
namespace header1 {
int foo();
void bar();
}
// header2.h ์˜ ๋‚ด์šฉ
namespace header2 {
int foo();
void bar();
}

์œ„ ์ฝ”๋“œ์—์„œ header1 ์— ์žˆ๋Š” foo๋Š” header1 ๋ผ๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„์— ์‚ด๊ณ  ์žˆ๋Š” foo๊ฐ€ ๋˜๊ณ , header2 ์— ์žˆ๋Š” foo ์˜ ๊ฒฝ์šฐ header2 ๋ผ๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„์— ์‚ด๊ณ  ์žˆ๋Š” foo ๊ฐ€ ๋œ๋‹ค.

์ž๊ธฐ ์ž์‹ ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„ ์•ˆ์—์„œ๋Š” ๊ตณ์ด ์•ž์— ์ด๋ฆ„ ๊ณต๊ฐ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ์ž์œ ๋กญ๊ฒŒ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ

#include "header1.h"

namespace header1 {
int func() {
  foo();  // ์•Œ์•„์„œ header1::foo() ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
}
}  // namespace header1

header1 ์ด๋ฆ„ ๊ณต๊ฐ„์•ˆ์—์„œ foo ๋ฅผ ๋ถ€๋ฅธ๋‹ค๋ฉด ์•Œ์•„์„œ header1::foo() ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ header1 ์˜ ์ด๋ฆ„ ๊ณต๊ฐ„ ์•ˆ์—์„œ header2 ์˜ foo ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๊ฐ„๋‹จํ•˜๊ฒŒ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

#include "header1.h"
#include "header2.h"

namespace header1 {
int func() {
  foo();           // ์•Œ์•„์„œ header1::foo() ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  header2::foo();  // header2::foo() ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
}
}  // namespace header1

๋ฐ˜๋ฉด์— ์–ด๋– ํ•œ ์ด๋ฆ„ ๊ณต๊ฐ„์—๋„ ์†Œ์†๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…์‹œ์ ์œผ๋กœ ์ด๋ฆ„ ๊ณต๊ฐ„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

#include "header1.h"
#include "header2.h"

int func() {
  header1::foo();  // header1 ์ด๋ž€ ์ด๋ฆ„ ๊ณต๊ฐ„์— ์žˆ๋Š” foo ๋ฅผ ํ˜ธ์ถœ
}

ํ•˜์ง€๋งŒ ๋งŒ์ผ ์œ„ ๊ฐ™์€ foo ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ์•ž์— ๋งค๋ฒˆ header1:: ์„ ๋ถ™์ด๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ๊ท€์ฐฎ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด โ€˜๋‚˜๋Š” ์•ž์œผ๋กœ header1 ์ด๋ž€ ์ด๋ฆ„ ๊ณต๊ฐ„์— ๋“ค์–ด์žˆ๋Š” foo ๋งŒ ์“ธ๊ฑฐ๋‹ค!โ€™ ๋ผ๊ณ  ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

#include "header1.h"
#include "header2.h"

using header1::foo;
int main() {
  foo();  // header1 ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
}

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ทธ๋ƒฅ ๊ธฐ๋ณธ์ ์œผ๋กœ header1 ์ด๋ฆ„ ๊ณต๊ฐ„์•ˆ์— ์ •์˜๋œ ๋ชจ๋“  ๊ฒƒ๋“ค์„ header1:: ์—†์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

#include "header1.h"
#include "header2.h"

using namespace header1;
int main() {
  foo();  // header1 ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
  bar();  // header1 ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
}

์•„์˜ˆ ์œ„์™€ ๊ฐ™์ด using namespace header1 ๊ณผ ๊ฐ™์ด ๋ช…์‹œํ•˜๋ฉด ๋œ๋‹ค.

๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ ์—ญ์‹œ header2 ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ชป ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œ์ ์œผ๋กœ ์จ์ฃผ๋ฉด ๋œ๋‹ค.

#include "header1.h"
#include "header2.h"
using namespace header1;

int main() {
  header2::foo();  // header2 ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
  foo();           // header1 ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
}

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์‹œ ์›๋ž˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

int main() {
  std::cout << "Hello, World!!" << std::endl;
  return 0;
}

์—ฌ๊ธฐ์„œ cout ๊ณผ endl ์€ ๋ชจ๋‘ iostream ํ—ค๋”ํŒŒ์ผ์˜ std ๋ผ๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ๋“ค์ด๋‹ค. std๋ฅผ ๋ถ™์ด๊ธฐ ๊ท€์ฐฎ์€ ์‚ฌ๋žŒ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ

#include <iostream>
using namespace std;

int main() {
  cout << "Hello, World!!" << endl;
  return 0;
}

๋กœ ์จ๋„ ๋œ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

์ฐธ๊ณ ๋กœ using namespace std; ์™€ ๊ฐ™์ด ์–ด๋– ํ•œ ์ด๋ฆ„ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋ผ๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด std ์— ์ด๋ฆ„์ด ๊ฒน์น˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค๋ฉด, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋งค์šฐ ๋งค์šฐ ๊ฑฐ๋Œ€ํ•˜๋ฏ€๋กœ, ์ •๋ง ์ˆ˜ ๋งŽ์€ ํ•จ์ˆ˜๋“ค์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ์ž์นซ ์ž˜๋ชปํ•˜๋‹ค๊ฐ€ ์ด๋ฆ„์„ ๊ฒน์น˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ณ ์น˜๋Š๋ผ ์‹œ๊ฐ„์„ ๋งŽ์ด ์žก์•„๋จน์„ ๊ฒƒ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ std ์—๋Š” ๋งค๋ฒˆ ์ˆ˜ ๋งŽ์€ ํ•จ์ˆ˜๋“ค์ด ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— C++ ๋ฒ„์ „์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ๊ธฐ์กด์— ์ž˜ ์ž‘๋™ํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ์ด๋ฆ„ ์ถฉ๋Œ๋กœ ์ธํ•ด ๋™์ž‘ํ•˜์ง€ ์•Š๊ฒŒ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์€ using namespace std; ๊ฐ™์€ ๊ฒƒ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , std:: ๋ฅผ ์ง์ ‘ ์•ž์— ๋ถ™์—ฌ์„œ โ€œstd ์˜ ์ด๋ฆ„๊ณต๊ฐ„์˜ ํ•จ์ˆ˜์ด๋‹คโ€ ๋ผ๊ณ  ๋ช…์‹œํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋˜ํ•œ, ๋ณธ์ธ์ด ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ณธ์ธ ๋งŒ์˜ ์ด๋ฆ„ ๊ณต๊ฐ„์— ๋„ฃ์–ด์„œ ํ˜น์‹œ ๋ชจ๋ฅผ ์ด๋ฆ„ ์ถฉ๋Œ๋กœ ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด cout ์€ ๋ฌด์—‡์ผ๊นŒ? ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ๋งํ•˜์ž๋ฉด ostream ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ํ‘œ์ค€ ์ถœ๋ ฅ(C ์–ธ์–ด์—์„œ์˜ stdout ์— ๋Œ€์‘๋œ๋‹ค) ์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋‹ค.

์ •ํ™•ํžˆ ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€๋Š” ๋ชฐ๋ผ๋„, ๊ทธ๋ƒฅ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ด๋‹ค๋Š” ๊ฒƒ๋งŒ ์•Œ์•„๋‘๋ฉด ๋œ๋‹ค.

์ด๋ฆ„ ์—†๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„

์ž ๊น ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž๋ฉด, C++ ์—์„œ๋Š” ์žฌ๋ฏธ์žˆ๊ฒŒ๋„ ์ด๋ฆ„ ๊ณต๊ฐ„์— ๊ตณ์ด ์ด๋ฆ„์„ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์ด๋ฆ„ ๊ณต๊ฐ„์— ์ •์˜๋œ ๊ฒƒ๋“ค์€ ํ•ด๋‹น ํŒŒ์ผ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด ๊ฒฝ์šฐ ๋งˆ์น˜ static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ธ๋‹ค.

#include <iostream>

namespace {
// ์ด ํ•จ์ˆ˜๋Š” ์ด ํŒŒ์ผ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
// ์ด๋Š” ๋งˆ์น˜ static int OnlyInThisFile() ๊ณผ ๋™์ผํ•˜๋‹ค.
int OnlyInThisFile() {}

// ์ด ๋ณ€์ˆ˜ ์—ญ์‹œ static int x ์™€ ๋™์ผํ•˜๋‹ค.
int only_in_this_file = 0;
}  // namespace

int main() {
  OnlyInThisFile();
  only_in_this_file = 3;
}

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์œ„ ๊ฒฝ์šฐ OnlyInThisFile ํ•จ์ˆ˜๋‚˜ only_in_this_file ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ํŒŒ์ผ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ํ—ค๋”ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์œ„ ํŒŒ์ผ์„ ๋ฐ›์•˜๋‹ค ํ•˜๋”๋ผ๋„ (๋ฌผ๋ก  main ํ•จ์ˆ˜ ๋ถ€๋ถ„์€ ๋ฌด์‹œํ•˜๊ณ ), ์ € ์ต๋ช…์˜ namespace ์•ˆ์— ์ •์˜๋œ ๋ชจ๋“  ๊ฒƒ๋“ค์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.