개념 Self Study📝/알고가자

static 변수? static 함수?

코딩 욕심쟁이 2024. 1. 8. 22:47

1. 개요 

static에 대해서는 누구나 많이 들어봤을것이다. static은 막연하게 정적이다. 라고만 생각했고 java에서도 public static void main등 메인함수에도 필수로 들어가고 이번 기회에 c++에 적용한 static에 대해서 알아보자.

 

2. static 키워드란?

 

static 변수

- 모든 객체가 한 메모리를 공유하는 멤버 변수, 객체 별로 각각 할당되는 멤버가 아니라 모든 객체가 공유하는 멤버다.

 

 

특징

  • 모든 객체가 공유하는 멤버변수이다.
    • →메모리는 프로그램 시작때부터 차지하고 있으며 메모리에 프로그램이 종료되기 전까지 값이 유지된다.
  • 객체와는 독립적으로 존재한다.
  • 어떤 특정 타입의 모든 객체들의 수 라던지 모든 객체들이 알고 있고 공유 할수 있어야하는 멤버 변수를 static으로 쓴다.

 

사용법

  • static 멤버 변수는 모든 객체들이 접근해야 하므로 프로그램 시작 부터 끝까지 유지되어야 하기 때문에 전역범위에서만 정의(초기화) 할수 있다.

※ static 멤버 변수는 main 함수는 물론이고 생성자 안에서도 초기화 할 수 없다.

 

  • 헤더파일 정의 불가

something.h

class Something
{
public:
	static int m_value; // 클래스 내에선 초기화 불가능
};

int Something::m_value = 1; // 💥에러!💥 헤더 파일 내에선 초기화 불가능

 

something.cpp

int Something::m_value = 1;

 

→ 위와 같이 헤더파일에 선언을 하지 못하는 이유는 여러 곳에서 헤더파일을 include할때 마다 static 변수를 여러번 정의 및 초기화하는 것이므로 헤더 파일에는 선언 하지못한다.

 

  • 정적 함수는 다른 함수에 접근할 수 없으며 static으로 선언된 함수와 변수에만 접근 가능
class X {
public:
  static void f() {
    x = 10; // undefined reference to 'x'
  }

private:
  int x = 0;
};

int main() {
  X::f();
}

 

 

→ X::f()함수는 x 변수를 사용하려고 하지만 x 변수는 X클래스의 일반 변수이므로 x 변수를 사용할 수 없다.

 

  • static const 멤버 변수는 클래스 내에서 초기화 하는 것이 가능하다.
    • const이므로 값을 변경하는것이 불가능하기 때문에 그 모습 그대로를 모든 객체가 공유하기 때문에
      • ▶한번 초기화 한 이후론 값 변경이 불가능하다.

* 클래스 내부에서 초기화 가능 why? const는 값이 컴파일 타입에 결정되기 때문이다.

 

※ const를 사용하면 헤더파일 내에서도 초기화가 가능하다.

#include <iostream>

using namespace std;

class Something
{
public:
	static const int m_value; // 가능
};

// int Something::m_value = 1;  //const라 클래스 밖에서 기존 값 변경이 불가능

int main()
{
    Something st;

    st.m_value = 1024;  // error! const라서 값 변경 불가

    return 0;
}

 

 

 

  •  static을 이용하면 접근제어자가 private이더라도 전역 변수로 선언이 가능하다.

 

  • _init클래스를 만들어서 클래스 내에서 선언이 가능하다.
#include <iostream>

using namespace std;

class Something
{
public:
	class _init // inner class
	{
	public:
		_init()
		{
			s_value = 9876; // s_value 접근 가능.
		}
	};

private:
	static int s_value; 
	static _init s_initializer; 
};
// int Something::s_value = 1234; 
Something::_init Something::s_initializer;

 

 

출처

Bard

Chat GPT

https://ansohxxn.github.io/cpp/chapter8-10/