프로그래밍C++ 백엔드 개발자

static 멤버(변수 및 함수)의 작동 방식에 대해 설명해주세요. static 멤버는 어떻게 초기화되며, 정의 및 사용 시 어떤 어려움이 발생하고, static 멤버는 클래스의 일반 멤버와 어떻게 다릅니까?

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

답변

static 클래스 멤버는 클래스 전체에 대해 단일 인스턴스로 존재하며, 모든 객체에 공통된 값을 가집니다.

  • static 변수는 클래스 외부, 일반적으로 cpp 파일에서 클래스 외부에 초기화됩니다 (int Foo::count = 0;). 클래스 내부에서는 _선언_하고, _정의_는 외부에서 합니다.
  • static 함수는 클래스와 객체를 통해 호출할 수 있습니다. 특정 인스턴스의 멤버(this)에 대한 접근 권한이 없으며, 다른 static 멤버만 참조할 수 있습니다.

코드 예시

class Counter { public: static int count; static void increment() { ++count; } }; int Counter::count = 0; int main() { Counter::increment(); Counter c1, c2; c1.increment(); // count == 2 }

함정 질문

«static 멤버 정의는 헤더 파일 내에 있을 수 있나요? 어떤 위험이 발생하나요?»

답변: 네, 기술적으로 헤더 파일 내에서 정의 (int Foo::value = 0;)하는 것은 가능하지만, 이 헤더가 여러 translation unit에 포함되면 중복 정의(multiple definition)가 발생하여 링크 오류가 발생합니다. 따라서 static 멤버는 반드시 하나의 cpp 파일에서만 정의해야 합니다.


주제의 미세한 차이로 인한 실제 오류 예시.


이야기

라이브러리 코드에서 static 멤버가 헤더 파일에 직접 정의되었습니다. 다중 포함으로 인해 링크 오류가 발생했습니다: "multiple definition of ...". 정의를 별도의 cpp 파일로 이동한 후 문제가 사라졌습니다.


이야기

교육 프로젝트에서 static 멤버가 선언되었지만 외부 cpp 파일에서 정의하는 것을 잊어버렸습니다. 헤더 컴파일 시 오류는 없었으나 링크할 때 unresolved external symbol 오류가 발생했습니다. 누락된 정의를 검색하고 추가해야 했습니다.


이야기

대규모 임베디드 시스템에서 계산된 값으로 static 멤버 초기화가 잘못 구현되었습니다(코드 실행이 필요한 표현식으로 초기화하려 했습니다). 논리를 별도의 초기화 함수로 분리했지만, 첫 번째 접근 전 이 함수를 호출하는 것을 잊어버렸습니다 — 결과는 초기화되지 않은 변수와 비정상적인 동작이었습니다.