using namespace std;는 무엇인가요?

김기루·2024년 3월 4일

이번 글에서는 입력과 출력 단계에 넘어가기 전에 전 시간에서 말했던 using namespace std;는 무엇인지에 대해서 알아보겠습니다.


저번시간에 처음 c++을 시작하면서

#include <iostream>
using namespace std;

int main()
{

	cout<<"Hello World!";

}

라는 코드를 배웠습니다.

텍스트를 출력하는 코드인 cout는 사실 앞에 std::가 붙은

std::cout<<"Hello World!";

로 사용되어야 합니다.

하지만 근데 저번 글에서는 그냥 cout로 문제를 해결해 나갔습니다. 어떻게
어떻게 가능했던 거였을까요??

이번 글에서는 std::를 안 써도 되었던 이유랑, using namespace std;가 무엇인지에 대해서 알아보겠습니다.


#namespace(이름공간)

오늘 소개하는 내용을 이해하기 위해서는 먼저 namespace가 무엇인지에 대해서 알아야 합니다.

namespace는 프로젝트에서 이름이 같아 충돌이 일어나는 상황을 방지하는 매커니즘입니다.

예를들어, 교장선생님이 " 김기루 학생은 상장 수여가 있을 예정이니 교장실로 와주십시오" 라는 방송을 한다면, 학교에 있는 모든 김기루들이 교장실로 모여 같은 이름이 충돌하는 경우가 생깁니다.
(사실 김기루 라는 이름은 그렇게 흔하지 않기 때문에 충돌이 생기는 일이 없습니다)
위 상황을 방지하기 위해 "3학년 6반의 김기루 학생은 교장실로 와주십시오" 처럼 이름충돌을 방지하는 역할을 하는 것이 바로 namespace입니다.

이처럼 namespace는 함수나 구조체, 변수 등에 소속을 정해주는 것 입니다.


#std

std는 스탠다드(standard)의 줄임말로

진짜 간단하게 std = 소속명

이라고 생각하면 됩니다.

사실 이게 이해가 어려웠어서 이 부분 이해하는데 엄청 시간이 들었습니다.

까지만 알아 둔 채로 더 자세한 이해를 하기 전, 라이브러리가 무엇인지 알고 넘어가야 합니다.


#라이브러리

라이브러리란 재사용 가능한 코드나 함수 등에 모아져있는 도구상자입니다.

이해를 돕기 위해 예시를 들면,

새 집을 짓는다고 생각해봅시다. 집을 짓기 위해선 망치나, 톱, 나사 등 여러 도구들이 필요합니다. 하지만 도구상자가 있다면, 이런 망치나 톱 같은 도구들을 직접만들지 않아도 도구상자에서 꺼내서 사용하면 됩니다.

여기서 바로 '도구상자 = 라이브러리' 입니다.

실제 전 글에서 사용했던 라이브러리 중

<iostream>

을 예시로 들자면, iostream이 도구상자가 되고 출력문인 cout<<"";가 바로 톱이나 망치 같은 도구인 것입니다.


#다시 std로 돌아가서...

c++는 iostream, vector, string 등 표준 라이브러리가 존재하는데 이 표준 라이브러리들의 소속이 std 소속입니다.

#include <iostream>


int main()
{
	
	std::cout<<"hello World!";

}

이 코드의 목적은 hello World! 라는 문장을 출력하는 것 입니다.
문장을 출력하는 기능을 하는 cout는 std에 소속되어 있습니다.

그런데 만약 std를 앞에 선언하지 않는다면,

#include <iostream>


int main()
{
	
	cout<<"hello World!";

}

이 코드에서 우리가 입력한 cout가 문장을 출력하는 기능을 하는 cout인지 아닌지 구분할 수 없기 때문에 sdt::cout<<"Hello World!" ;라고 따로 입력하는 이유입니다.!

그렇다면

#include <iostream>
using namespace std;

int main()
{
	
	cout<<"hello World!";

}

이 코드가 가능한 이유는 2번째 줄에 'using namespace std;'가 의미하는 바를 알면 이해할 수 있습니다.


#using namespace std;

이 코드를 간단하게 설명하면

지금 프로젝트의 cout를 포함한 모든 식별자들은 std 소속이다.

라는 뜻입니다.

#include <iostream>
using namespace std;

int main()
{
	
	cout<<"hello World!";

}

그렇기 때문에 해당 코드에서 cout만 입력했어도 2번줄에서 '이 프로젝트의 cout는 무조건 std소속인데?' 라고 말을 한 상태이기에

코드 속 cout가 문자 출력을 하는 기능을 가진 cout인지 구분할 필요가 없어지기 때문에

using namespace std; 선언을 한다면
모든 cout<<""; 출력문 앞에 std::를 선언하지 않아도 되는 것입니다.

0개의 댓글