C++에서 정적 키워드 사용

Jinku Hu 2023년10월12일
  1. static키워드를 사용하여 C++에서 정적 기간으로 변수 선언
  2. static키워드를 사용하여 C++에서 클래스의 정적 멤버 선언
C++에서 정적 키워드 사용

이 가이드에서는 C++에서static키워드를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

static키워드를 사용하여 C++에서 정적 기간으로 변수 선언

static키워드는 정적 기간으로 지역 변수를 선언하는 데 사용할 수 있습니다. 이름 지정이 제안하는 것과는 달리, 정적 기간이있는 지역 변수는 변수가 선언 된 블록이 범위를 벗어난 후에도 해당 값이 메모리에서 활성 상태로 유지됨을 의미합니다.

기본적으로 이러한 지역 변수는 정의 된 함수 호출 사이에 값을 저장할 수 있습니다. incrementCount함수에는0값으로 초기화되는count라는 변수가 있습니다. count속성은 프로그램이 종료 될 때까지 활성 상태 인 메모리 영역에 할당됩니다. 따라서incrementCount에 대한 각 호출은 주어진 정수에 단일 단위를 추가합니다.

#include <iostream>

using std::cout;
using std::endl;

int incrementCount() {
  static int count = 0;
  return ++count;
}

int main() {
  for (int i = 0; i < 20; ++i) {
    if (i % 2 == 0) incrementCount();
  }
  cout << incrementCount() - 1 << endl;

  return EXIT_SUCCESS;
}

출력:

10

static키워드를 사용하여 C++에서 클래스의 정적 멤버 선언

반면static키워드는 클래스의 정적 데이터 멤버를 선언하는 데 사용됩니다. 이러한 멤버는 클래스의 특정 인스턴스가 아닌 클래스 유형 자체와 연결됩니다. 따라서 주어진 클래스에 대해 정적 데이터 멤버를 정의하면이 클래스 유형의 모든 인스턴스는 데이터 멤버에 대해 동일한 값을 갖게됩니다. 개인 멤버를 갖는 것과 달리 전자는 메모리에 단일 사본을 갖게됩니다. 후자의 기능은 정적 데이터 멤버를 클래스 메모리 풋 프린트 관점에서 효율적으로 만듭니다.

static데이터 멤버는 일반 데이터 멤버와 다르게 정의되고 초기화됩니다. static멤버는 클래스 내부에서 선언되고 연관된 소스 파일의 클래스 외부에서 정의되어야합니다. static키워드는 클래스 내부의 선언에서만 사용됩니다. 정적데이터 멤버는 생성자에 의해 초기화 될 수 없으며const정수 유형이 없으면 클래스 본문 내에서 초기화 할 수 없습니다. 후자의 유형은 초기 값 사양없이 클래스 본문 외부에서 정의해야합니다. 다음 예제는 문자열 리터럴로 초기화되고 나중에setNewName함수로 수정되는static데이터 멤버name의 간단한 사용법을 보여줍니다.

#include <iostream>
#include <string>
#include <utility>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class MyClass1 {
 private:
  static string name;
  string nickname;

 public:
  explicit MyClass1(string n) : nickname(std::move(n)){};

  static string getName() { return name; }
  static void setNewName(std::basic_string<char> s) { name = std::move(s); }
  string getNickname() { return nickname; }

  ~MyClass1() = default;
};

string MyClass1::name = "Static name";

int main() {
  MyClass1 m1(string("April"));
  MyClass1 m2(string("Maude"));

  cout << MyClass1::getName() << endl;
  MyClass1::setNewName("New name");
  cout << MyClass1::getName() << endl;

  return EXIT_SUCCESS;
}

출력:

Static name
New name

또는 클래스에 객체에 바인딩되지 않은static함수 멤버가있을 수 있으므로 본문에서this객체를 참조 할 수 없습니다. 일반적으로 이러한 함수는 다음 예제 프로그램에 표시된대로정적데이터 멤버와 유사한 별도의 선언 및 정의를 가질 필요가 없습니다. 그러나 대부분의 현대적인 스타일 가이드는 일반적으로 프로그래머가 둘을 분리해야합니다.

#include <iostream>
#include <string>
#include <utility>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class MyClass1 {
 private:
  static string name;
  string nickname;

 public:
  explicit MyClass1(string n) : nickname(std::move(n)){};

  static string getName() { return name; }
  static void setNewName(std::basic_string<char> s) { name = std::move(s); }
  string getNickname() { return nickname; }

  static bool compareStrings(const std::basic_string<char>& s1,
                             const std::basic_string<char>& s2) {
    if (s1 == s2)
      return true;
    else
      return false;
  }

  ~MyClass1() = default;
};

string MyClass1::name = "Static name";

int main() {
  MyClass1 m1(string("April"));
  MyClass1 m2(string("Maude"));

  MyClass1::compareStrings(m1.getNickname(), m2.getNickname())
      ? cout << "strings are equal" << endl
      : cout << "strings are not equal" << endl;

  MyClass1::compareStrings(MyClass1::getName(), MyClass1::getName())
      ? cout << "strings are equal" << endl
      : cout << "strings are not equal" << endl;

  return EXIT_SUCCESS;
}

출력:

strings are not equal
strings are equal
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Static