ABOUT ME

-

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

    * 클래스 내부에서 초기화 가능 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/

Designed by Tistory.