기본 패턴
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는 편해 보여도 상속 계층 결합도를 높일 수 있습니다. "정말 파생 클래스에만 열어야 하는가"를 한 번 더 따져 보는 편이 좋습니다.