C++ - extern, static

mohadang·2022년 9월 24일
0

C++

목록 보기
12/48
post-thumbnail
post-custom-banner

extern 키워드

  • 다른 파일의 전역 변수에 접근 가능
// [ExternTest.h]
extern int globalValue;
void IncreaseValue();

// [ExternTest.c]
int globalValue;
void IncreaseValue()
{
  globalValue++;
}

// [main.c]
#include "ExternTest.h"
// 컴파일러에 의해 다음과 같이 치환
// extern int globalValue;
// void IncreaseValue();

void main()
{
  printf("$d", globalValue);
}

static은 외부 파일에서 접근 불가능 하다

  • 범위의 제한을 받는 전역 변수, only 전역 변수랑은 좀 다르다.
  • 범위
    • 파일 속
    • 네임스페이스 속
    • 클래스 속
    • 함수 속
  • static은 외부 파일에서 접근 불가능 하다
[ExternTest.h]
extern int globalValue;
void IncreaseValue();

[ExternTest.c]
// static 변수다, 다른 파일에서 접근 불가능 하다. extern이 있다고 하더라도
static int globalValue; void IncreaseValue()
{
  globalValue++;
}

[main.c]
#include "ExternTest.h"
// 컴파일러에 의해 다음과 같이 치환
// extern int globalValue;
// void IncreaseValue();

void main()
{
  // 링커 에러가 발생한다. "링킹" 과정중(컴파일 에러가 아니라...)에서 globalValue의 주소를 가져오지 못한다.
  printf("$d", globalValue); 
}

함수 내부의 정적 변수

void Accumulate(int number)
{
  static int result = 0; <-- 한번만 초기화 됨,
  result += number;
  cout << result << endl;
}

클래스 내부의 멤버 변수

//[Cat.h]
class Cat
{
private:
  static int mCount;
};

//[Cat.cpp]
int Cat::mCount = 0;
  • 정적 멤버 변수는 클래당 하나의 COPY만 존재
    • 클래스 메모리 레이아웃에 존재
    • exe 파일 안에 필요한 메모리가 이미 잡혀 있음

정적 멤버 함수

  • 개체 없이 호출 가능
    • Math::Square(10);
  • 정적 멤버에만 접근 가능.
  • 주로 수학 계산식 함수가 많은 클래스가 정적 멤버 함수 사용하기에 괜찮음, 계산하려고 개체 만드는 것은 이상하니까.

베스트 프랙티스

  • 함수 안에 정적 변수를 사용하지 말 것
    • 클래스 안에 넣을 것
    • 클래스 안에 넣어야 그 클래스가 어떤 정적 변수를 사용하는지 찾기 쉬움
  • 전역변수 대신 정적 멤버 변수를 쓸 것
    • 범위를 제한하기 위해, 쓸떼없이 참조 안해도 될 곳에서 참조 하게끔 하는 것을 막기 위해
  • C 스타일 정적 변수를 사용 할 일은 이제 없음
profile
mohadang
post-custom-banner

0개의 댓글