데이터 은닉과 접근 제어란?
데이터 은닉(Data Hiding)은 객체 지향 프로그래밍(OOP)의 핵심 기능 중 하나입니다. 이를 통해 프로그램의 외부 함수가 클래스 타입의 내부 표현에 직접 접근하는 것을 막을 수 있습니다.
클래스 멤버에 대한 접근 제한은 클래스 본문 내에서 라벨 형태의 접근 제한자(access modifier), 즉 public, private, protected 섹션을 사용해 지정합니다.
특히 주의할 점은 클래스 내 멤버와 클래스 자체의 기본 접근 수준은 private이라는 것입니다. 접근 제한자를 명시하지 않으면 모든 멤버는 private으로 처리됩니다.
기본 문법 예제
class Base {
public:
// public 멤버가 여기에 위치합니다
protected:
// protected 멤버가 여기에 위치합니다
private:
// private 멤버가 여기에 위치합니다
};public 멤버
public 멤버는 클래스 외부 어디에서든 접근 가능하며, 프로그램 전체 범위에서 사용할 수 있습니다. 멤버 함수의 도움 없이도 public 변수의 값을 자유롭게 설정(set)하고 가져올(get) 수 있습니다.
따라서 외부에 공개해도 무방한 인터페이스나 유틸리티 함수를 public으로 선언하는 것이 일반적입니다.
private 멤버
private 멤버 변수나 함수는 클래스 외부에서 접근할 수 없을 뿐만 아니라, 조회조차 불가능합니다. 오직 해당 클래스 자신과 friend(친구) 함수만이 private 멤버에 접근할 수 있습니다.
이러한 특성 덕분에 클래스의 내부 구현 세부사항을 외부로부터 철저히 보호할 수 있으며, 캡슐화(encapsulation)를 실현하는 핵심 도구로 활용됩니다.
protected 멤버
protected 멤버 변수나 함수는 동작 방식이 private 멤버와 매우 유사합니다. 하지만 한 가지 중요한 차이점이 있습니다. 바로 자식 클래스, 즉 파생 클래스(derived class)에서도 접근할 수 있다는 점입니다.
상속 관계에서 부모 클래스의 내부 데이터를 자식 클래스가 활용해야 하는 경우, private 대신 protected를 사용하면 외부에는 노출시키지 않으면서 상속 계층 내부에서만 공유할 수 있습니다.
세 가지 접근 제한자 비교 요약
| 접근 제한자 | 클래스 내부 | 파생 클래스 | 클래스 외부 |
|---|---|---|---|
public | O | O | O |
protected | O | O | X |
private | O | X | X |
정리하면, public은 모든 곳에서 접근 가능하고, protected는 상속받은 클래스까지만 허용되며, private은 해당 클래스 내부에서만 접근할 수 있습니다. 각 접근 제한자의 특성을 잘 이해하고 활용하면 더 안전하고 유지보수하기 쉬운 C++ 코드를 작성할 수 있습니다.