본문 바로가기

프로그래밍/C++

[Study] C++ 기초(1) - namespace

[ C++ 에 대해.. ]

 

프로그래밍 언어를 가장 처음 접한 케이스로 C언어가 가장 많을 것이라 생각한다.

필자도 대학교 1학년 무렵 프로그래밍 언어의 시작을 C로 시작했고, 지금까지도 C를 가장 많이 사용해본 것 같다.

 

그렇다면 C++은 그럼 어떤 언어일까?

C++은 한 덴마크의 컴퓨터 과학자가 C언어를 바탕으로 제작한 프로그래밍 언어인데,

말 그대로 C의 향상 버전이라고 생각하면 될 듯하지만..

C와는 완전히 다른 언어로 파악하고 접근해야한다!

 

C는 절차 지향 프로그래밍으로 설계되었으며, 메모리와 Low Level 프로그래밍을 위한 언어라면,

C++은 절차/객체 지향, 일반화, 함수형 프로그래밍을 모두 지원하는 언어이다.

 

차이점부터 굉장히 어렵게 느껴지는데,

딱 절차지향 vs 객체지향만 놓고본다면 C는 절차대로만 코드를 처리해간다면,

C++은 객체라는 기본 단위로 나눈 뒤 이들의 상호 작용으로 처리해간다고 보면 된다.

 

당장 어떤 차이인지 파악하고 들어가기보다는 공부를 해가면서 '이런 확연한 차이가 있구나'를 직접 느껴보자.

(본 게시물은 C언어에 이해도가 있는 사람들을 대상으로 작성한 게시물입니다!)


역시나 코딩을 처음 시작한다면, Hello, World! 를 출력해보는 게 가장 먼저다.

#include <iostream>

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

 

실행 결과 )

Hello, World!

 

코드를 살펴보면,

C언어에서 사용하던 것처럼 header 파일을 include 해주는 것을 볼 수 있다.

 

여기서는 iostream이라는 표준 입출력에 필요한 header 파일을 가져오는데,

C언어에서 printf, scanf 등을 사용하기 위해 stdio.h 를 가져오는 것과 비슷하다.

해당 iostream을 include 해주면 std::cout, std::cin 등을 사용할 수 있게 된다.

 

그리고 main문이 선언되고 프로그램 실행 시 가장 먼저 실행된다.

내용을 살펴보면, std::cout << "Hello, World!" << std::endl; 이라는 부분이 있는데,

생소하지만 printf문 처럼 어떤 것을 출력하는 코드임을 알 수 있다.

이번 게시물에서는 <<, cout, endl 에 대해서는 다루지 않고, 'std' 에 대해서만 알아보겠다! 

 

앞에 붙은 std의 정체는 '이름 공간(namespace)' 이라는 것인데, 이는 어디 소속인지 지정해주는 것이다.

만약 중복된 이름을 가진 함수가 존재할 때, 같은 이름이라도 소속된 이름 공간이 다르면 다른 것으로 취급하게 된다.

여기서 std는 'C++ 표준 라이브러리의 모든 함수, 객체 등이 정의되어있는' namespace 이다.

 

만약, 위의 코드에서 std::cout 이 아니라, cout만 덩그러니 와있으면 컴파일러는

어디에 소속된 cout 인지 알 수 없다. (abc::cout?? efg::cout??? std::cout????)


이름 공간(namespace) 정의하는 방법

// doyou1.h
namespace doyou1
{
    int do();
    void you();
    int function()
    {
        do();
    }
}

// doyou2.h
namespace doyou2
{
    int do();
    void you();
    int function()
    {
        doyou1::do();
    }
}

 

두 이름공간을 위와 같이 정의해보았다.

각각의 다른 이름공간에 존재하지만, 이름은 같은 변수들이 존재하고 있다.

 

위 doyou1의 이름공간을 보면, function 이라는 함수에서 do()를 호출하고 있다.

이때는, 이름공간 doyou1 에서 호출하였기 때문에, 알아서 doyou1::do()가 호출된다.

doyou2 에서는 function에서 doyou1::do()를 호출하고 있다.

이처럼 다른 이름공간에 있는 함수를 불러오고 싶다면 위와 같이 적어준다면 가능하다.

 

하지만 만약 두 이름공간 어디에도 소속되어 있지 않은 상태라면,

doyou1의 do와 doyou2의 do가 구분이 필요할 것이다.

 

#include "doyou1.h"
#include "doyou2.h"

int main()
{
    doyou1::do();
}

 

위처럼 명시적으로 이름 공간을 지정해준다면, 원하는 함수를 실행할 수 있게 된다.

하지만, 매번 이렇게 지정해서 작성해야하나..? 의문이 든다.

자, 여기서 편하게 쓰는 방법이 하나 있다.

 

#include "doyou1.h"
#include "doyou2.h"
using namespace doyou1;

int main()
{
    do();
    doyou2::do();
}

 

using namespace doyou1 이 추가되었다.

그럼 doyou1::do()를 사용하고 싶으면 위와 같이 이름공간을 붙이지 않고도 사용할 수 있게 된다.

물론 doyou2 에 존재하는 do()를 사용하고 싶다면 doyou2::do() 처럼 명시하면 된다.

 

이를 활용한다면,

#include <iostream>
using namespace std;

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

 

맨 처음 코드에서 using namespace std; 를 넣어주면, cout 과 endl 을 std:: 없이도 사용할 수 있게 되는 것이다.


※ 단, using namespace 의 사용은 권장하지 않는다. 만약 using namespace std를 해둔 상태에서,

std에 존재하는 함수와 이름이 겹치는 함수를 만들게 된다면 오류가 발생하기 때문이다.

이러한 상황처럼, 이름 충돌 가능성이 잦을 수 있으므로, 직접 std:: 를 붙이는 방식을 권장한다.


+ 논외) 변수 이름 정하는 방법

 

그동안 변수나 함수 이름을 지을 때, 제각각 do_you_code, do_IsAlpha .. 등 다양하게 멋대로 써왔다.

이번에 공부를 하며 알게된 사실은 정해진 변수명 표기법들이 존재한다는 것.

메인으로 다루기엔 간단한 부분이라 이렇게 끼워넣도록 하겠다.

 

- 헝가리안 표기법(hungarian notation)

- 카멜 표기법(camel case)

- 파스칼 표기법(pascal case)

- 스네이크 표기법(snake case)

 

이런 표기법들이 존재하는데, 일반적으로 카멜 또는 언더바 방식으로 많이 사용하므로 두 표기법에 대해서 알아보겠다.

 

1. 카멜 표기법 (camel case)

 

ex)     fishShell     camelCase     helloWorld

 

: 여러 단어를 연달아 사용할 때 각 단어의 첫 글자를 대문자로 적되, 맨 앞 글자는 소문자로 표기하는 방법.

낙타 등의 혹처럼 생겼다고 해서 카멜 표기법이라 한다.

 

2. 언더바 표기법 (snake case)

 

ex)     fish_shell     camel_case     hello_world

 

: 단어 사이사이에 언더바( _ )를 넣어서 표기하는 방법.

보통 파일명에 공백이 들어가면 터미널에서 작성하기 어려워 파일명에 주로 사용된다고 한다.

'프로그래밍 > C++' 카테고리의 다른 글

[Study] C++ 기초(2) - reference  (0) 2025.03.21
Recent Posts
Popular Posts
Recent Comments