C++객체지향

접근 제어와 static 멤버

캡슐화를 위한 `public`, `private`, `protected`와 클래스 수준 공유 상태를 만드는 `static` 멤버를 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

cpp
class Counter {
public:
    Counter() { ++total; }
    static int created() { return total; }

private:
    static int total;
};

설명

  • 접근 제어자는 클래스 내부 구현과 외부에 공개할 인터페이스를 구분해 캡슐화를 돕습니다.
  • public은 외부에서 사용할 수 있는 기능, private은 내부 구현 세부 사항, protected는 파생 클래스까지 허용하는 범위라고 이해하면 기본 구조가 잡힙니다.
  • static 멤버 변수와 함수는 "객체 하나의 상태"가 아니라 "클래스 전체가 공유하는 정보"를 표현할 때 사용합니다.
  • 예를 들어 생성된 객체 개수, 공통 설정값, 유틸리티 함수는 개별 객체보다 클래스 차원의 개념에 가깝기 때문에 static과 잘 어울립니다.
  • 좋은 클래스 설계는 모든 멤버를 공개하는 것이 아니라, 외부가 꼭 알아야 하는 최소한의 인터페이스만 드러내고 나머지는 숨기는 방향에 가깝습니다.

짧은 예제

cpp
#include <iostream>

class Counter {
public:
    Counter() { ++total; }
    static int created() { return total; }

private:
    static int total;
};

int Counter::total = 0;

int main() {
    Counter a;
    Counter b;
    std::cout << Counter::created() << "\n";
}

빠른 정리

항목설명
public외부에서 사용할 수 있는 인터페이스
private클래스 내부 구현 세부 사항
protected파생 클래스까지 허용되는 접근 범위
static 멤버 변수모든 객체가 공유하는 클래스 수준 상태
static 멤버 함수객체 없이도 호출 가능한 클래스 수준 기능

주의할 점

protected는 편해 보여도 상속 계층 결합도를 높일 수 있습니다. "정말 파생 클래스에만 열어야 하는가"를 한 번 더 따져 보는 편이 좋습니다.