프로그래밍백엔드 개발자

C++에서 정적 및 비정적 클래스 멤버는 무엇인가요? 그들의 특징, 초기화 방법 및 사용 규칙은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

문제의 역사

C++에서 클래스는 정적 및 비정적 멤버(변수 및 함수)를 가질 수 있습니다. 이는 모든 클래스 인스턴스에 대한 공통 데이터를 지원하고, 특정 인스턴스의 상태에 접근할 필요가 없는 함수에 사용되기 위해 등장했습니다.

문제

정적 및 비정적 멤버를 구별하는 것은 중요합니다. 왜냐하면 그들의 라이프 사이클, 범위 및 초기화 규칙이 다르기 때문입니다. 자주 발생하는 오류에는 잘못된 정의, 인스턴스 및 정적 멤버의 동시 사용, 헤더 파일에서의 중복 정의가 포함됩니다.

해결

클래스의 정적 변수는 클래스 내부에서 static으로 선언되지만, 클래스 외부에서 별도로 정의되어야 합니다(C++17 이전). 그들은 단일 인스턴스 존재합니다. 정적 함수는 명시적으로 지정하지 않는 한 비정적(인스턴스) 멤버에 접근할 수 없습니다.

코드 예시:

class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;

주요 특징:

  • 정적 멤버는 클래스의 모든 객체 간에 상태를 공유합니다.
  • 정적 멤버는 클래스의 인스턴스를 생성하지 않고도 사용할 수 있습니다.
  • 정적 변수를 클래스 정의 외부에서 초기화해야 합니다(C++17 이전).

함정 질문들.

정적 클래스 변수를 클래스 내부에서 직접 초기화할 수 있나요? (C++17 이전)

아니요, C++17 이전에는 정적 멤버는 클래스 외부에서 정의해야 합니다. C++17 이상에서는 인라인 정적 변수는 클래스 내부에서 직접 정의할 수 있습니다.

// C++17 class Foo { inline static int counter = 0; };

정적 클래스 함수는 this나 비정적 멤버에 접근할 수 있나요?

아니요, 정적 멤버는 비정적 멤버나 this에 접근할 수 없습니다. 클래스의 인스턴스가 생성되더라도 마찬가지입니다. 접근하려면 객체를 명시적으로 전달해야 합니다.


정적 클래스 멤버는 클래스를 생성할 때마다 생성되나요?

아니요, 정적 멤버는 클래스 전체에 대해 단일 인스턴스로 존재하며 객체 수와는 관계없습니다.

일반적인 오류 및 안티 패턴

  • 정적 멤버가 클래스 외부에서 정의되지 않음(구 버전의 표준 사용 시)
  • 각 객체에 따라 달라지는 데이터를 저장하기 위해 정적 멤버 사용
  • 전역 정적 변수를 통한 캡슐화 위반

실제 사례

부정적 사례

개발자가 클래스에서 static int를 선언하지만 클래스 외부에서 정의하지 않습니다. 링커가 정의되지 않은 기호 오류(undefined symbol)를 발생시킵니다. 정적 멤버가 초기화되지 않았기 때문입니다.

장점:

  • 컴파일러가 선언에 대해 경고하지 않습니다.

단점:

  • 링킹 오류 발생
  • 변수가 초기화되기 전에 사용될 경우 신비로운 런타임 오류 발생

긍정적 사례

정적 멤버가 클래스에 선언되고 클래스 외부에서 정의되며, 생성된 객체의 수를 세는 데 사용됩니다.

장점:

  • 상태의 단일 저장소
  • 명확한 초기화 및 올바른 작동

단점:

  • 멀티쓰레딩 환경에서 경쟁 상태가 발생할 수 있습니다(추가 보호 필요).