개념 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이므로 값을 변경하는것이 불가능하기 때문에 그 모습 그대로를 모든 객체가 공유하기 때문에
- ▶한번 초기화 한 이후론 값 변경이 불가능하다.
- 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