따배씨++ (4.1 Scope & Duration)

김동우·2021년 4월 15일
0

안녕하십니까. 김동우입니다.

이번 노트에서는 간단히 지난 시간들의 복습과 변수의 범위에 대해 적어보려 합니다.

그럼 코드부터 보여드리겠습니다.

#include <iostream>
using namespace std;

// int a = 1;
// int a = 1;
// 위와 같은 정의는 충돌을 야기한다.
// 메모리를 차지하는 정의는 해당 영역에 오직 하나만 존재해야 한다.

namespace work1 // block 구분에 필수선언
{
    int a = 1;
    void doSomething()
    {
        a += 3;
    }
}

namespace work2
{
    int a = 1;
    void doSomething()
    {
        a += 5;
    }
}

namespace work3
{
    namespace work33
    {
        namespace work333
        {
            int a = 1;
            void doSomething()
            {
                a += 7;
            }
        }
    }
}
// Cpp 17 이전의 문법

namespace work4::work44::work444
{
    int a = 1;
    void doSomething()
    {
        a += 7;
    }
}
// Cpp 17 버전 이후의 최신문법

int main()
{   
    int apple(0); // define & initialize

    apple = 5; // define했기에 assign이 가능하다.

    cout << apple << endl; // output : 5

    // nested block
    {
        apple = 4; // 위 apple과 같은 apple이다.

        cout << apple << endl; // output : 4
    }

    {
        int apple(10); // 동명의 변수지만, 위 apple과는 아예 다르다.
        // 이에 변수명을 다르게 작명하는 것을 요구한다.

        cout << apple << endl; // output : 10
    }
    // 현대 프로그래밍에서는 변수의 소멸을 신경쓰기 때문에, 사용하는 곳 인근에서만
    // 살아남을 수 있도록 코딩을 해야 한다.

    cout << apple << endl; // output : 4

    work1::a;
    work1::doSomething();

    work2::a;
    work2::doSomething();

    cout << work1::a << " " << work2::a << endl;
    // output : 4 6 warning 발생

    work3::work33::work333::doSomething();
    work4::work44::work444::doSomething();
    // 사용은 이런 방식으로 하면 된다.
    // 그러나 depth가 너무 높은 방식의 namespace 정의는 효율이 떨어질 수 있다.

    return 0;
}
// apple = 3; 
// 위와 같은 assign은 scope를 벗어났기에 불가능하다. -> 메모리가 이미 반납되었다.

그럼 이번 글은 이만 마치도록 하겠습니다. 감사합니다.

0개의 댓글

관련 채용 정보