공간 기억 부류

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
56/56

GPT

C/C++에서 공간 기억 부류(Storage Class)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다. 공간 기억 부류는 변수의 수명과 범위를 정의하며, 프로그램의 다양한 영역에서 변수와 함수의 동작 방식을 제어하는 데 사용됩니다.

1. 공간 기억 부류 개요

공간 기억 부류는 변수와 함수의 저장 위치, 수명, 초기화 및 범위를 제어하는 키워드입니다. C/C++에서는 주요 네 가지 공간 기억 부류가 있습니다:

  1. 자동 변수(auto)
  2. 정적 변수(static)
  3. 레지스터 변수(register)
  4. 외부 변수(extern)

2. 공간 기억 부류의 종류와 사용법

자동 변수(auto)

  • 기본적으로 모든 지역 변수는 자동 변수입니다.
  • 함수가 호출될 때 생성되고, 함수가 종료될 때 소멸됩니다.
  • auto 키워드는 명시적으로 사용할 필요가 없습니다.
#include <iostream>

void autoExample() {
    int autoVar = 5; // 자동 변수
    std::cout << "Auto Variable: " << autoVar << std::endl;
}

int main() {
    autoExample();
    return 0;
}

정적 변수(static)

  • 함수 내에서 선언된 정적 변수는 함수가 종료된 후에도 값을 유지합니다.
  • 전역 범위에서 선언된 정적 변수는 파일 범위를 갖습니다.
  • 정적 변수는 프로그램 시작 시 초기화되고 종료 시 소멸됩니다.
#include <iostream>

void staticExample() {
    static int staticVar = 0; // 정적 변수
    staticVar++;
    std::cout << "Static Variable: " << staticVar << std::endl;
}

int main() {
    staticExample();
    staticExample();
    staticExample();
    return 0;
}

레지스터 변수(register)

  • 레지스터 변수는 CPU 레지스터에 저장되어 빠른 접근이 가능합니다.
  • 컴파일러는 실제로 레지스터에 저장할지 여부를 결정합니다.
  • 주로 자주 사용되는 변수에 사용됩니다.
#include <iostream>

void registerExample() {
    register int regVar = 10; // 레지스터 변수
    std::cout << "Register Variable: " << regVar << std::endl;
}

int main() {
    registerExample();
    return 0;
}

외부 변수(extern)

  • 외부 변수는 다른 파일에 정의된 변수를 참조할 때 사용됩니다.
  • 전역 변수를 여러 파일에서 공유할 수 있습니다.
  • 변수의 정의는 하나의 파일에서만 해야 하며, 다른 파일에서는 extern 키워드를 사용하여 선언합니다.
// file1.cpp
#include <iostream>

int globalVar = 10; // 전역 변수 정의

void externExample();

int main() {
    externExample();
    return 0;
}

// file2.cpp
#include <iostream>

extern int globalVar; // 외부 변수 선언

void externExample() {
    std::cout << "Extern Variable: " << globalVar << std::endl;
}

3. 컴퓨터 구조 및 운영체제 측면에서의 이해

메모리 할당

변수의 공간 기억 부류는 변수의 메모리 할당 방식과 밀접한 관련이 있습니다.

  • 자동 변수: 스택 세그먼트에 저장됩니다.
  • 정적 변수: 데이터 세그먼트에 저장됩니다.
  • 레지스터 변수: CPU 레지스터에 저장될 수 있습니다.
  • 외부 변수: 데이터 세그먼트에 저장됩니다.
메모리 레이아웃:
+------------------+
| 코드 세그먼트     |
| (Code Segment)   |
+------------------+
| 데이터 세그먼트   |
| (Data Segment)   |
| 전역 변수, 정적 변수 |
+------------------+
| 힙 세그먼트       |
| (Heap Segment)   |
+------------------+
| 스택 세그먼트     |
| (Stack Segment)  |
| 자동 변수        |
+------------------+

변수의 수명

  • 자동 변수: 해당 블록이 실행될 때 생성되고, 블록이 종료되면 소멸합니다.
  • 정적 변수: 프로그램 시작 시 초기화되고 종료 시 소멸합니다.
  • 레지스터 변수: 해당 블록이 실행될 때 생성되고, 블록이 종료되면 소멸합니다.
  • 외부 변수: 프로그램 시작 시 초기화되고 종료 시 소멸합니다.

4. 그림과 삽화

공간 기억 부류와 메모리 구조를 이해하기 쉽게 그림과 표로 표현하였습니다.

공간 기억 부류 예시:

자동 변수:
+------------------+
| 스택 세그먼트     |
| autoVar          |
+------------------+

정적 변수:
+------------------+
| 데이터 세그먼트   |
| staticVar        |
+------------------+

레지스터 변수:
+------------------+
| CPU 레지스터     |
| regVar           |
+------------------+

외부 변수:
+------------------+
| 데이터 세그먼트   |
| globalVar        |
+------------------+

5. 예제 코드 확장

다양한 공간 기억 부류를 사용하는 예제를 추가로 제공합니다.

파일 범위 정적 변수

// file1.cpp
#include <iostream>

static int fileStaticVar = 100; // 파일 범위 정적 변수

void printFileStaticVar() {
    std::cout << "File Static Variable: " << fileStaticVar << std::endl;
}

int main() {
    printFileStaticVar();
    return 0;
}

다중 파일 외부 변수

// file1.cpp
#include <iostream>

int sharedVar = 50; // 전역 변수 정의

void printSharedVar();

int main() {
    printSharedVar();
    return 0;
}

// file2.cpp
#include <iostream>

extern int sharedVar; // 외부 변수 선언

void printSharedVar() {
    std::cout << "Shared Variable: " << sharedVar << std::endl;
}

요약

C/C++에서 공간 기억 부류는 변수와 함수의 저장 위치, 수명, 초기화 및 범위를 제어하는 키워드입니다. 주요 공간 기억 부류에는 자동 변수, 정적 변수, 레지스터 변수, 외부 변수가 있습니다. 자동 변수는 스택 세그먼트에 저장되고, 정적 변수와 외부 변수는 데이터 세그먼트에 저장됩니다. 레지스터 변수는 CPU 레지스터에 저장될 수 있습니다. 운영체제는 이러한 메모리 영역을 관리하여 프로그램이 효율적으로 실행될 수 있도록 돕습니다.

이와 같은 내용을 통해 C/C++의 공간 기억 부류에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!

profile
李家네_공부방

0개의 댓글