C++ 접근 지정자란 무엇인가?
데이터 은닉(Data Hiding)은 객체 지향 프로그래밍(OOP)의 핵심 특징 중 하나입니다. 이를 통해 프로그램의 외부 함수가 클래스 타입의 내부 표현에 직접 접근하는 것을 막을 수 있으며, 코드의 안정성과 유지보수성이 크게 향상됩니다.
C++에서는 클래스 본문 내에 public, private, protected라는 레이블 형태의 접근 지정자(access specifier)를 사용하여 클래스 멤버에 대한 접근 범위를 지정합니다.
기본 접근 수준은 private
클래스 멤버와 클래스 자체의 기본(default) 접근 수준은 private입니다. 따라서 접근 지정자를 명시하지 않은 멤버는 모두 private으로 간주됩니다. 참고로 struct 키워드로 정의한 구조체의 기본 접근 수준은 public이라는 점도 함께 기억해 두면 좋습니다.
class Base {
public:
// public 멤버는 여기에 작성
protected:
// protected 멤버는 여기에 작성
private:
// private 멤버는 여기에 작성
};
세 가지 접근 지정자의 차이
1. public (공개)
public 멤버는 클래스 외부를 포함해 프로그램 내 어디에서든 접근할 수 있습니다. 별도의 멤버 함수 도움 없이도 public 변수의 값을 자유롭게 설정(set)하고 가져올(get) 수 있습니다.
2. private (비공개)
private 멤버 변수나 함수는 클래스 외부에서 접근할 수 없을 뿐만 아니라, 조회하는 것조차 불가능합니다. 오직 해당 클래스 자신과 friend(프렌드)로 선언된 함수만이 private 멤버에 접근할 수 있습니다.
3. protected (보호)
protected 멤버는 private 멤버와 거의 동일하게 동작하지만, 한 가지 중요한 차이가 있습니다. 바로 파생 클래스(derived class), 즉 상속받은 자식 클래스에서도 접근할 수 있다는 점입니다. 이 덕분에 상속 구조에서 내부 데이터를 안전하게 보호하면서도 자식 클래스에게 필요한 접근 권한을 부여할 수 있습니다.
접근 가능 범위 비교표
| 접근 지정자 | 클래스 내부 | 파생 클래스 | 클래스 외부 |
|---|---|---|---|
| public | O | O | O |
| protected | O | O | X |
| private | O | X | X |
마무리
접근 지정자를 적절히 활용하면 클래스의 내부 구현 세부 사항을 숨기고(캡슐화), 외부에는 필요한 인터페이스만 노출할 수 있습니다. 일반적으로 멤버 변수는 private 또는 protected로 선언하고, 외부와 소통이 필요한 함수만 public으로 공개하는 것이 좋은 C++ 설계 습관입니다.