정적 변수

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
30/56

GPT

C/C++에서 정적 변수(Static Variable)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.

1. 정적 변수 개요

정적 변수는 함수나 블록 내에서 선언되지만, 함수가 호출될 때마다 새로 생성되지 않고 프로그램이 실행되는 동안 메모리에 유지되는 변수입니다. 이는 변수의 생명주기가 함수 호출을 초과하여 프로그램의 전체 실행 시간 동안 지속되기 때문에 가능해집니다. 정적 변수는 초기화되지 않으면 0으로 초기화됩니다.

2. 정적 변수 선언과 사용법

C에서의 정적 변수

#include <stdio.h>

void function() {
    static int count = 0; // 정적 변수 선언
    count++;
    printf("Count: %d\n", count);
}

int main() {
    for (int i = 0; i < 5; i++) {
        function();
    }
    return 0;
}

C++에서의 정적 변수

#include <iostream>

void function() {
    static int count = 0; // 정적 변수 선언
    count++;
    std::cout << "Count: " << count << std::endl;
}

int main() {
    for (int i = 0; i < 5; i++) {
        function();
    }
    return 0;
}

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

메모리 할당

정적 변수는 데이터 세그먼트에 할당됩니다. 데이터 세그먼트는 프로그램이 시작될 때 할당되며, 프로그램이 종료될 때까지 유지됩니다. 이는 전역 변수와 동일한 방식으로 관리됩니다.

메모리 구조:
+------------------+
|   코드 세그먼트   |
+------------------+
|   데이터 세그먼트 |
|   (정적 변수)    |
+------------------+
|   BSS 세그먼트    |
|   (초기화되지 않은 정적 변수) |
+------------------+
|   힙 세그먼트     |
+------------------+
|   스택 세그먼트   |
+------------------+

메모리 접근

정적 변수는 데이터 세그먼트에 저장되므로, 함수가 호출될 때마다 새로 생성되지 않고 이전 값을 유지합니다. 정적 변수는 초기화되지 않으면 자동으로 0으로 초기화됩니다.

성능 최적화

정적 변수는 함수 호출 시 재할당되지 않으므로, 스택 메모리를 절약할 수 있습니다. 또한, 정적 변수는 프로그램이 종료될 때까지 유지되므로, 데이터의 지속성이 필요한 경우 유용하게 사용할 수 있습니다.

4. 그림과 삽화

정적 변수의 메모리 구조와 함수 호출 시의 메모리 할당 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.

함수 호출 및 정적 변수:
function() 호출
+----------------------+
| function 스택 프레임 |
| +------------------+ |
| |  지역 변수        | |
| +------------------+ |
+----------------------+

데이터 세그먼트:
+------------------+
| static int count |
+------------------+

5. 예제 코드 확장

다양한 상황에서 정적 변수를 사용하는 예제를 추가로 제공합니다.

전역 정적 변수

#include <iostream>

// 정적 전역 변수 선언
static int globalCount = 0;

void function() {
    globalCount++;
    std::cout << "Global count: " << globalCount << std::endl;
}

int main() {
    for (int i = 0; i < 5; i++) {
        function();
    }
    return 0;
}

클래스의 정적 멤버 변수 (C++)

#include <iostream>

class MyClass {
public:
    static int count; // 정적 멤버 변수 선언

    MyClass() {
        count++;
    }

    static void showCount() {
        std::cout << "Count: " << count << std::endl;
    }
};

// 정적 멤버 변수 정의
int MyClass::count = 0;

int main() {
    MyClass obj1;
    MyClass::showCount();

    MyClass obj2;
    MyClass::showCount();

    return 0;
}

요약

정적 변수는 함수나 블록 내에서 선언되지만, 함수가 호출될 때마다 새로 생성되지 않고 프로그램이 실행되는 동안 메모리에 유지되는 변수입니다. 정적 변수는 데이터 세그먼트에 할당되며, 초기화되지 않으면 0으로 초기화됩니다. 정적 변수는 함수 호출 시 재할당되지 않으므로 스택 메모리를 절약할 수 있으며, 데이터의 지속성이 필요한 경우 유용하게 사용할 수 있습니다. 운영체제는 정적 변수가 저장되는 메모리의 할당과 해제를 관리하여 프로그램이 효율적으로 정적 변수를 사용할 수 있도록 돕습니다.

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

profile
李家네_공부방

0개의 댓글