맨위로가기

정적 변수

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

정적 변수는 프로그램 실행 시간 동안 값을 유지하는 변수를 의미하며, ALGOL 60의 own 변수에서 유래되었다. C 언어에서 `static` 키워드를 사용하여 정의되며, 전역 범위 또는 지역 범위 내에서 사용될 수 있다. 정적 변수는 함수 호출 간에 값을 유지하며, 객체 지향 프로그래밍에서는 클래스의 모든 인스턴스에서 공유되는 클래스 변수로 사용된다. 정적 할당은 문자열 리터럴과 가상 메서드 테이블과 같은 컴파일 시간에 알려진 객체에 사용된다.

더 읽어볼만한 페이지

  • 변수 (컴퓨터 과학) - 멤버 변수
    멤버 변수는 객체 지향 프로그래밍에서 객체의 속성을 저장하고 관리하며 객체의 상태를 나타내는 변수로, 지역 변수와 달리 객체의 생명 주기와 함께 값을 유지한다.
  • 변수 (컴퓨터 과학) - 전역 변수
    전역 변수는 프로그램 내 모든 함수에서 접근 가능하며, 스레드 간 정보 전달에 사용되지만, 코드 이해를 어렵게 하고 스레드 안전성을 보장하지 못하며 초기화 순서에 의존하는 문제를 야기할 수 있다.
  • 메모리 관리 - 동적 메모리 할당
    동적 메모리 할당은 프로그램 실행 중 힙 영역에서 메모리 공간을 확보 및 해제하여 효율적인 메모리 관리와 유연성을 제공하는 기술로, 메모리 누수 방지 및 가비지 컬렉션 등의 고려 사항이 중요하며 C, C++, C++/CLI, C# 등에서 사용된다.
  • 메모리 관리 - 콜 스택
    콜 스택은 프로그램에서 활성화된 서브루틴 정보를 저장하는 스택 자료 구조로, 반환 주소, 지역 변수 등을 저장하며 스레드 안전성 확보, 복잡한 수식 계산 지원 등에 사용되지만 보안 위험도 야기한다.
  • 프로그래밍 구성체 - 형 변환
    형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다.
  • 프로그래밍 구성체 - 연산자 오버로딩
    연산자 오버로딩은 프로그래밍 언어에서 기존 연산자를 사용자 정의 자료형에 대해 재정의하여 내장 자료형처럼 다루도록 하는 기능으로, 코드 가독성과 표현력을 높이지만 남용 시 코드 의미를 모호하게 만들 수 있다.
정적 변수
프로그램 지속성
정의프로그램 실행 동안 메모리에 남아 있는 변수
메모리 할당
시점컴파일 시 할당
유형정적 메모리 할당
활용
특징프로그램 전체에서 값을 유지
관련 키워드static 키워드

2. 역사

정적 변수의 개념은 ALGOL 60(1960)에서 '''''own''' 변수''라는 이름으로 처음 등장하였다. ''own'' 변수는 블록에 다시 진입할 때 마지막 종료 시점의 값을 유지하는 특징을 가지고 있었다. BCPL(1966)에서는 "static"이라는 키워드를 사용하여 정적 데이터 항목을 정의하였고,[1] 이는 C 프로그래밍 언어를 통해 널리 알려지게 되었다.

2. 1. ALGOL 60의 own 변수

ALGOL 60(1960) 보고서에서는 '''''own''' 변수''를 정의하고 있다. 이 변수는 블록에 다시 진입할 때, 마지막 종료 시점의 값을 그대로 유지한다. 그러나 '''own'''으로 표시되지 않은 변수의 값은 정의되지 않는다. 이는 저장소가 아닌 동작과 수명만을 지정하는 것으로, 정적 변수와는 미묘한 차이가 있다. 예를 들어, own 변수는 프로그램 로드 시가 아닌 함수가 처음 호출될 때 할당될 수 있다.

2. 2. BCPL과 C 언어

BCPL(1966)은 정적 데이터 항목을 프로그램 실행 시간만큼 지속되는 데이터 항목으로 정의하였다.[1] 이러한 데이터 항목은 함수, 루틴 정의, 전역 선언 또는 콜론으로 설정된 레이블로 선언되어야 한다.[1] BCPL은 현재 "동적 할당"이라는 용어가 사용되는 힙 할당 객체가 아닌, ''자동'' 변수(지역, 스택 할당)에 대해 "동적 데이터 항목"을 정의했다는 점에 유의해야 한다.

C 프로그래밍 언어는 BCPL의 영향을 크게 받아 `static` 키워드를 사용하여 정적 변수를 정의하였고, 이는 널리 사용되게 되었다.[1]

3. 주소 지정

절대 주소 주소 지정 방식은 정적 변수에만 사용할 수 있다. 컴파일러가 컴파일 시간에 위치를 알 수 있는 변수는 정적 변수가 유일하기 때문이다. 프로그램(실행 파일 또는 라이브러리)이 메모리에 로드되면, 정적 변수는 프로그램의 주소 공간의 데이터 세그먼트(초기화된 경우) 또는 BSS 세그먼트(초기화되지 않은 경우)에 저장되며, 로드 전에 오브젝트 파일의 해당 섹션에 저장된다.

4. 범위

범위 및 범위 측면에서 정적 변수는 프로그램 실행 전체를 범위로 가질 수 있지만, 더 제한된 범위를 가질 수 있다. 기본적인 구분은 프로그램 전체에서 컨텍스트에 있는 ''정적 전역 변수''(전역 범위)와 지역 범위를 갖는 ''정적 지역 변수'' 사이이다. 정적 변수는 모듈 범위 또는 일부 변형, 예를 들어 C 프로그래밍 언어의 내부 연결을 가질 수 있는데, 이는 파일 범위 또는 모듈 범위의 한 형태이다.

4. 1. 정적 지역 변수

정적 지역 변수는 선언된 함수 내에서만 접근 가능하지만, 함수 호출이 종료되어도 그 값이 유지된다는 점에서 지역 변수와 다르다.[1] 정적 지역 변수는 함수가 여러 번 호출되더라도 한 번만 초기화되며, 이후 호출 시에는 이전 값을 유지한다.[1] 예를 들어, 함수 호출 횟수를 세는 카운트 변수로 활용할 수 있다.[1]

다음은 C 언어에서의 정적 지역 변수 사용 예시이다.

```c

#include

void func() {

static int x = 0; // x는 func() 함수가 호출될 때마다 초기화되지 않고, 처음 한 번만 초기화된다.

x++; // 함수가 호출될 때마다 x의 값을 1씩 증가시킨다.

printf("%d\n", x); // x 값을 출력한다.

}

int main() {

func(); // 출력: 1

func(); // 출력: 2

func(); // 출력: 3

func(); // 출력: 4

func(); // 출력: 5

return 0;

}

4. 2. 모듈 범위

범위 및 범위 측면에서 정적 변수는 프로그램 실행 전체를 범위로 가지지만, 더 제한된 범위를 가질 수 있다. 기본적인 구분은 프로그램 전체에서 컨텍스트에 있는 ''정적 전역 변수''(전역 범위)와 ''정적 지역 변수''(지역 범위) 사이이다. 정적 지역 변수는 해당 변수가 포함된 함수가 몇 번 호출되든 한 번만 초기화되고, 선언된 함수에 대한 여러 호출을 통해 해당 값을 유지하고 접근할 수 있다는 점에서 지역 변수와 다르다. 정적 변수는 또한 모듈 범위 또는 일부 변형, 예를 들어 C 프로그래밍 언어의 내부 연결을 가질 수 있는데, 이는 파일 범위 또는 모듈 범위의 한 형태이다.

4. 3. C 언어 예제

다음은 C 언어에서 정적 지역 변수를 사용한 예시이다.

```c

#include

void func() {

static int x = 0; // x는 정적 변수로, 함수 호출 사이에서 값이 유지된다.

x++;

printf("%d\n", x); // x 값을 출력한다.

}

int main() {

func(); // 출력: 1

func(); // 출력: 2

func(); // 출력: 3

func(); // 출력: 4

func(); // 출력: 5

return 0;

}

```

`func` 함수 안의 `x`는 `static` 키워드로 선언되어 정적 지역 변수가 된다. 정적 지역 변수는 함수가 처음 호출될 때 한 번만 초기화되고, 이후 함수 호출 사이에도 그 값이 유지된다. 따라서 `func` 함수를 반복해서 호출하면 `x`의 값은 계속 증가하여 1, 2, 3, 4, 5가 차례대로 출력된다.

5. 객체 지향 프로그래밍

객체 지향 프로그래밍에서 "정적 멤버 변수"는 "클래스 변수"라고도 하며, 주어진 클래스의 모든 클래스 인스턴스(객체)에서 공유되는 멤버 변수이다. 이 변수는 해당 객체의 멤버 변수로 접근할 수 있다.[1] 런타임에 클래스를 정의할 수 있는 언어에서 동적으로 정의된 클래스의 클래스 변수는 정적이지 않다.

5. 1. 정적 할당

문자열 리터럴이나 가상 메서드 테이블과 같이 컴파일 시간에 알려진 객체 상수들은 대개 정적으로 할당된다. 정적으로 정의된 값은 전역 변수일 수도 있으며, 실행 전반에 걸쳐 동일한 불변 객체 값이 사용되도록 보장한다.

참조

[1] 웹사이트 What is static memory allocation and dynamic memory allocation? http://www.merithub.[...] MeritHub [An Institute of Career Development] 2011-06-16
[2] 웹인용 What is static memory allocation and dynamic memory allocation? http://www.merithub.[...] MeritHub [An Institute of Career Development] 2011-06-16



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com