프로그래밍 언어/C++

C++ 범위 : 유효범위와 연결

순정법사 2023.09.13

A. 유효범위와 연결

1. 변수와 유효 범위

a. 유효 범위(scope)

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

 

함수 내에서 선언된 변수는 함수 내에서만 사용

밖에서 선언된 변수는 선언된 이후에 나오는 함수에서 모두 사용 가능

 

💙 Info

C++에서는 파일(file) 용어 대신 변환 단위(translation unit)라는 용어를 사용

 

b. 연결(linkage)

🌟 해당 변수를 사용할 수 있는 파일의 접근 가능 여부

 

함수 내에서 선언된 변수는 함수 밖에서는 사용할 수 없으므로 연결 ❌

 

  • 외부 연결(external linkage)을 가지는 변수 : 여러 파일에서 사용
  • 내부 연결(internal linkage)을 가지는 변수 : 하나의 파일에서만 사용

 

 

2. C++ 변수의 종류

변수는 유효범위와 연결을 기준으로 아래와 같이 나눔

 

a. 자동 변수(automatic variable)

🌟 블록 내에서 선언된 변수를 의미하며, 함수의 매개변수도 여기에 포함

 

  • 유효범위 : 선언된 블록 내부
  • 메모리 : 종료되면 stack 메모리에서 사라짐
  • 초기화 : 하지 않으면 쓰레기값으로 초기화
  • C언어의 지역변수와 같은 의미로 사용

 

💥 변수의 이름 주의사항

같은 이름을 여러번 사용 ❌
같은 이름의 변수를 또 선언하려고 하면 오류

 

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

🌟 변수를 선언할 때 register 키워드를 붙여 선언한 변수

 

  • 메모리 : CPU의 레지스터(register) 메모리에 저장되어 빠르게 접근
  • 💥 컴퓨터의 레지스터는 매우 작아 선언하기 힘든 경우 그냥 지역 변수로 선언
  • C++11 부터는 단순히 변수가 자동 변수라는것을 의미함

 

c. 정적 변수

🌟 정적 변수는 프로그램이 실행되는 내내 유지되는 변수

 

  • 메모리 : data 영역에 저장
  • 초기화 : 하지 않으면 0으로 자동 초기화

 

1) 연결을 가지지 않는 정적 변수

 

🌟 블록 내부에서 static 키워드를 사용하여 정의

 

  • 전역변수처럼 단 한번 초기화, 종료되어야 메모리에서 사라짐
  • 지역변수처럼 해당 블록 내에서만 접근 가능

 

⏳ 예제 : 연결을 가지지 않는 정적 변수

void StaticVar(void)
{
    static int static_count = 1; //외부에서 호출 불가능
    cout << "StaticVar() 함수가 " << static_count << " 번째 호출되었습니다." << endl;
    static_count++;	//함수 실행시마다 count++
}

 

2) 내부 연결을 가지는 정적 변수

 

🌟 유효 범위를 변환 단위로 가지는 변수에 static 키워드를 사용하여 정의

 

  • 해당 변수를 포함하고 있는 변환 단위, 즉 현재 파일에서만 사용 가능
  • 하나의 파일 내의 모든 블록에서 접근 및 사용 가능
  • 동일한 이름을 가진 자동 변수를 선언하면 더 이상 접근할 수 없음

 

⏳ 예제 : 내부 연결을 가지는 정적 변수

static int var; // 내부 연결을 가지는 정적 변수

void Local(void)
{
    var = 20; // 정적 변수의 값 변경
    cout << var << endl; 	//20
}

int main(void){
	int var = 10; // 자동 변수 선언 - 더이상 정적 변수에 접근 X
    Local();
    cout << var << endl; 	//10
{

 

3) 외부 연결을 가지는 정적 변수

 

🌟 유효 범위를 변환 단위로 가지는 변수

 

  • 전역 변수(global variable) 또는 외부 변수(extern variable)라고도 함
  • 해당 파일 뿐만 아니라 외부 파일에서도 사용 가능
  • 해당 변수를 사용하는 모든 파일에서 각각 extern 키워드를 사용하여 재선언되어야 사용가능

 

⛓ 파일1.cpp

#include <iostream>
using namespace std;

int var = 10; // 외부 변수 정의
...

⛓ 파일2.cpp

#include <iostream>
using namespace std;

#include "파일1.cpp"
extern int var; // 외부 변수를 사용하기 위한 재선언
...

 

💙 단일 정의의 원칙

여러 파일에서 외부 변수가 사용될 경우, 오직 한 개의 파일에서만 외부 변수에 대한 정의

 

f. 총정리

변수 종류 유효 범위 연결 선언 위치 키워드
자동 변수 블록 없음 블록 내부 없음
레지스터 변수 블록 없음 블록 내부 register
연결을 가지지 않는 정적 변수 블록 없음 블록 내부 static
내부 연결을 가지는 정적 변수 변환 단위 내부 함수 외부 static
외부 연결을 가지는 정적 변수 변환 단위 외부 함수 외부 없음

 

 

 


출처 : http://www.tcpschool.com/cpp/cpp_scope_scopeLinkage

 

코딩교육 티씨피스쿨

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

tcpschool.com