-
static 변수? static 함수?개념 Self Study📝/알고가자 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
'개념 Self Study📝 > 알고가자' 카테고리의 다른 글
Git 명령어 별 어떤 구조인가? (3) 2024.11.08 알지만 넘어간 Git 명령어는? (2) 2024.10.04 Mac에 UTM이용한 Window 가상머신 Setting (0) 2024.03.18 메모리의 구조 및 C# 데이터 형식 (0) 2023.07.25 생성자 정리 (0) 2023.07.13 - 모든 객체가 공유하는 멤버변수이다.