본문 바로가기
[공부]/C++

[C++] 기본 정리 12 - C++ 범위(유효 범위, 연결, 네임스페이스)

by 개발꿈냥무 2024. 2. 22.

유효 범위 (scope)

= 하나의 변환 단위(translation unit, 파일) 내에서 해당 변수가 사용될 수 있는 범위

  • 함수 내에서 선언된 변수 : 함수 내에서만 사용 가능
  • 함수 밖에서 선언된 변수 : 변수가 선언된 '이후'에 나오는 모든 함수에서 사용 가능 

 

연결 (linkage)

= 해당 변수를 사용할 수 있는 파일의 접근 가능 여부를 나타냄

  • 외부 연결을 갖는 변수 : 여러 파일에서 사용 가능
  • 내부 연결을 갖는 변수 : 하나의 파일에서만 사용 가능
  • 함수 내에서 선언된 변수 : 함수 밖에선 사용 불가하므로, 연결을 갖지 않음

 

 


C++ 변수의 종류

 

요약) 출처 : 코딩의 시작, TCP School

 

 

1. 자동 변수 (automatic variable)

  • 블록(중괄호 영역) 내에서 선언된 변수를 의미 (함수의 매개변수도 자동 변수에 포함됨)
  • 변수가 선언된 블록 내에서만 유효, 블록이 종료되면 메모리에서 사라짐
  • 메모리 스택(stack) 영역에 저장됨
  • 초기화하지 않으면 쓰레깃값으로 초기화됨
  • C언어의 지역 변수와 같은 의미로 사용됨

- 변수의 이름으로 같은 이름을 여러 번 사용하는 것은 매우 잘못된 방법임

- 한 블록 내에서 같은 이름의 변수를 또다시 선언하려 하면, 컴파일러 오류 발생

 

 

2. 레지스터 변수 (register variable)

  • 변수를 선언할 때, register 키워드를 붙여 선언
  • CPU의 레지스터 메모리에 저장되어 빠르게 접근 가능해짐
  • 컴퓨터의 레지스터는 매우 작은 크기의 메모리라서, 레지스터 영역에 변수 선언하기 어려운 경우도 많음 -> 그럴 경우, C 컴파일러는 해당 변수를 그냥 지역 변수로 선언함
  • C++11 부터는, 단순히 해당 변수가 자동 변수라는 것을 의미하는 역할로만 사용되는 중

 

3. 정적 변수 (static variable)

  • 프로그램 실행 내내 유지되는 변수
  • 메모리상의 데이터 영역에 저장되며, 초기화하지 않으면 자동으로 0으로 초기화됨

정적 변수 유형

  1. 연결을 가지지 않는 정적 변수
    • 블록 내부에서 static 키워드 사용하여 정의
    • 지역 변수(해당 블록 내에서만 접근 가능)와 전역 변수(단 한번만 초기화됨, 프로그램이 종료돼야 메모리상에서 사라짐)의 특징을 모두 가짐
    • void StaticVar(void)
      {
      	static int count = 1; // 연결을 가지지 않는 정적 변수
      	cout << count << " 번째 호출되었습니다.\n";
      	count++;
      }
      
      StaticVar(); -> 1 번째 호출되었습니다.
      StaticVar(); -> 2 번째 호출되었습니다.
      StaticVar(); -> 3 번째 호출되었습니다.
  2. 내부 연결을 가지는 정적 변수
    • 유효 범위를 변환 단위로 갖는 변수에 static 키워드를 사용하여 정의
    • 해당 변수를 포함하고 있는 변환 단위(즉, 현재 파일)에서만 사용 가능
    • 하나의 파일 내의 모든 블록에서 접근/사용할 수 있음
    • static int var; // 내부 연결을 갖는 정적 변수
    • 정적 변수와 같은 이름의 자동 변수가 특정 블록 내에서 선언되기 전까지, 그 블록에서는 정적 변수에 접근할 수 있음
  3. 외부 연결을 가지는 정적 변수
    • 유효 범위를 변환 단위로 갖는 변수를 의미
    • 전역 변수(global variable) 또는 외부 변수(extern variable)라고 함
    • 해당 파일뿐 아니라 외부 파일에서도 사용할 수 있는 변수임 (해당 변수를 사용하는 모든 파일에서 각각 extern 키워드를 사용하여 재선언되어야 사용 가능함)
    • [파일1.cpp]
      int var = 10; // 외부 변수 정의
      
      [파일2.cpp]
      extern int var; // 외부 변수를 사용하기 위한 재선언
    • 단일 정의의 원칙 : 여러 파일에서 외부 변수가 사용될 경우, 오직 한 개의 파일에서만 외부 변수에 대한 정의를 할 수 있음

 


네임스페이스

  • 내부 식별자에 사용될 수 있는 유효 범위를 제공하는 선언적 영역을 의미
  • 일반적으로 헤더 파일에서 정의되며, 언제나 새로운 이름을 추가할 수 있도록 개방되어 있음
  • C++에서는 namespace 키워드를 사용해 사용자가 새로운 네임스페이스를 정의 가능
  • 전역 위치, 다른 네임스페이스 내에서도 정의될 수 있으나, 블록 내에서는 정의될 수 없음
  • 기본적으로 외부 연결을 가짐

- 전역 네임스페이스 : C++의 파일 수준의 선언 영역

    (일반적으로 식별자의 네임스페이스가 명시되지 않으면, 전역 네임스페이스에 자동으로 포함됨)

- C++ 표준 라이브러리 타입, 함수들은 std 네임스페이스 또는 그 속에 중첩된 네임스페이스에 선언되어 있음

 

 

네임스페이스로의 접근

범위 지정 연산자( :: )를 사용하여, 해당 이름을 특정 네임스페이스로 제한

[namespace.h]
namespace kang {
	void Display();
	int count;
}
namespace kim {
	double display;
	int count;
}

[cpp 파일]
#include "namespace.h"
...
kang::count = 4;
kim::display = 3.14;
kim::count = 100;
...

 

 

간소화된 네임스페이스로의 접근

매번 범위 지정 연산자를 사용하여 이름을 제한하는 것은 매우 불편 & 가독성이 떨어짐

-> C++의 해결책

  1. using 지시자 (directive)
    • 명시한 네임스페이스에 속한 이름을 가져와, 범위 지정 연산자 없이도 사용할 수 있게 함
    • 전역 범위에서 사용된 using 지시자 : 해당 네임스페이스의 모든 이름을 전역적으로 사용할 수 있게 함
    • 블록 내에서 사용된 using 지시자 : 해당 블록에서만 해당 네임스페이스의 모든 이름을 사용할 수 있게 함
    • using namespace 네임스페이스이름;
  2. using 선언 (declaration)
    • 단 하나의 이름만을 범위 지정 연산자 없이 사용할 수 있게 함
    • using 지시자와 마찬가지로, using 선언이 나타나는 선언 영역에서만 해당 이름을 사용 가능
    • using 네임스페이스이름::이름;

 

 

 


참고)

코딩의 시작, TCP School

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com