ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • _C++_Scope
    Programming/_C++ 2023. 9. 20. 17:02

    스코프(scope)는 변수 또는 함수 등의 이름이 통용되는 범위를 이야기한다.

    중괄호 블럭 없이 정의되거나 선언된 이름은 전역 스코프를 갖는다.

    전역스코프는 모든 곳에서 언제든지 접근이 가능하다.

    외부 링킹이 적용되어 다른 소스코드 파일에서도 extern 키워드로 접근할 수 있다.

    #include <iostream>
    
    using namespace std;
    
    struct Test{ //전역 스코프에서 정의됨
    	Test(int num){
        	cout << num << '\n';
        }
        ~Test(){
        	cout << "~test\n";
        }
    };
    
    int a = 10; // 전역 스코프
    int main(){
        for(int i = 0; i < a; i++){ //i는 for문의 블럭 스코프
        	// static으로 선언된 sConunter는 전역변수, 하지만 블럭 스코프를 가짐.
            static int sCounter = 0;
            {
                int i = 1;
                Test t(sCounter) //Test 생성자 호출
            }//t소멸, Test소멸자 호출
        }//i소멸
        ::x = 10; //::는 스코피 지정 연산자. 가려진 전역 변수에 접근할 수 있다.
        return 0;
    }

    블럭 스코프를 갖는 변수는 밖에서 접근이 불가능하다.

    런타임에 제어흐름이 그 블럭을 벗어나는 순간 변수가 소멸되며 클래스는 소멸자가 자동으로 호출된다.

    그러나 지역 변수가 블럭 스코프를 벗어나서 유효하지 않게 되더라도 스택의 크기는 함수가 끝날 때까지 변하지 않기에 함수 종료 시점까지 메모리를 점유한다.

     

    static으로 선언된 sCounter는 전역 변수이며 동시에 블럭 스코프를 갖는다. sCounter는 for문을 벗어나도 소멸되지 않는다. sCounter는 프로그램이 로드되며 순간 메모리를 점유하고 선언 위치에서 생성 및 초기화가 된다.(선언 위치가 반복문 안에 있더라도 생성 및 초기화는 처음 한번만 수행!!)

    static으로 선언된 method는 static 멤버 변수로 접근이 가능하다.

     

    클래스 멤버 정의 중 static 키워드가 사용된다면, 클래스 변수를 만든다는 의미.

    클래스 변수는 전역 변수이지만, 클래스 스코프를 갖는 변수이다.

    method 내에서 클래스 변수, 멤버 변수 모두 접근 가능.

    static method에서는 클래스 변수에만 접근 가능.

     

    무명 namespace

    namespace는 스코프의 경계를 만드는 도구이다.

    함수나 전역 변수가 외부 링킹이 적용되며 그 외에는 내부 링킹이 적용되는데, 함수의 외부 링킹으로 인해, 서로 다른 개발자가 작성한 코드들이 심볼 중복으로 빌드를 못하게 될 수 있다.

    이러한 심볼 중복을 방지하기 위해 namespace를 달리하여 구분된다.

    함수나 전역 변수를 내부 링킹으로 바꾸는 방법으로 무명 namespace가 사용될 수 있다.

    namespace{ // 무명 네임스페이스
    
    }

     

    'Programming > _C++' 카테고리의 다른 글

    _C++_컨테이너 어댑터와 비트셋 컨테이너  (0) 2023.09.20
    _C++_lambda  (0) 2023.09.20
    _C++_알고리즘_Part_1  (0) 2023.09.19
    _C++_Smart_Pointer  (1) 2023.09.19
    C++_map  (0) 2023.07.27
Designed by Tistory.