접근 지정
접근 지정자
객체 지향 언어에서는 객체를 캡슐화하고, 외부에서 접근 가능한 공개 멤버와 외부에서 접근을 허용하지 않는 비공개 멤버를 구분합니다. C++에서는 다음 3가지 멤버 접근 지정자(access specifier)가 있습니다.
- private(비공개)
- public(공개)
- protected(보호)
멤버에 대한 접근 지정은 클래스 선언부에서 접근 지정자 다음에 콜론(;)을 찍고 멤버들을 선언하는 방식으로 이루어집니다.
class Sample {
private:
// private 멤버 선언. 클래스 내의 멤버 함수만 접근 가능
public:
// public 멤버 선언. 클래스 내외의 모든 함수에게 접근 허용
protected:
// protected 멤버 선언. 클래스 내의 멤버가 상속받은 파생 클래스에만 접근 허용
};
private 멤버
private 접근 지정으로 선언된 멤버로서, 클래스 내의 멤버 함수들에게만 접근이 허용됩니다.
public 맴버
public 접근 지정으로 선언된 멤버로서, 클래스 내외를 막론하고 프로그램의 모든 함수들에게 접근이 허용됩니다.
protected 멤버
protected 접근 지정으로 선언된 멤버로서, 내외 맴버 함수와 이 클래스를 상속받은 파생 클래스의 멤버 함수에게만 접근이 허용됩니다. protected 접근 지정자는 상속을 다루는 함수입니다.
접근 지정은 다음과 같이 여러 번 사용될 수 있고, 접근 지정자는 선언되면 다른 접근 지정자가 선언될 때까지 모든 멤버에 대해 적용됩니다.
class Sample {
private:
// private 멤버 선언
public:
// public 멤버 선언
protected:
// protected 멤버 선언
};
디폴트 접근 지정 private
접근 지정을 하지 않은 경우 디폴트 접근 지정은 private으로 처리됩니다. 이것은 캡슐화의 기본 원칙이 비공개이기 때문입니다. 다음 코드에서 radius는 private 멤버로 처리됩니다.
class Circle {
int radius;
public:
Circle();
Circle(int r);
double getArea();
};
멤버 보호와 생성자
멤버 변수는 private으로 지정하는 것이 바람직함
클래스의 멤버들은 클래스 외부에서 마음대로 접근할 수 있도록 허용해서는 안되는 것이 기본입니다. 이것은 마침 사람이 자신의 위장을 다른 사람이 보거나 만질 수 없도록 노출시키지 않는 것과 같습니다. 위장은 사람에게 있어 중요한 데이터 멤버이기 때문에, 외부로부터 숨기고 보호하여야 합니다.
클래스의 멤버 변수에 대해서는 public 사용을 자제하고 private으로 선언하는 것이 바람직합니다.
생성자는 public으로
클래스 외부에서 객체를 생성하기 위해서는 생성자를 public으로 선언해야 합니다. 생성자가 public으로 선언되어 있지 않다면 다음 라인은 컴파일 오류가 발생합니다.
Circle circle; // Circle() 생성자를 호출하므로 Circle()은 public이어야 함
ex3-9 다음 소스에서 컴파일 오류가 발생하는 곳은 어디인가?
#include <iostream>
using namespace std;
class PrivateAccessError {
private:
int a;
void f();
PrivateAccessError();
public:
int b;
PrivateAccessError(int x);
void g();
};
PrivateAccessError::PrivateAccessError() {
a = 1; // (1)
a = 1; // (2)
}
PrivateAccessError::PrivateAccessError(int x) {
a = x; // (3)
b = x; // (4)
}
void PrivateAccessError::f() {
a = 5; // (5)
b = 5; // (6)
}
void PrivateAccessError::g() {
a = 6; // (7)
b = 6; // (8)
}
int main() {
PrivateAccessError objA; // (9)
PrivateAccessError objB(100); // (10)
objB.a = 10; // (11)
objB.b = 20; // (12)
objB.f(); // (13)
objB.g(); // (14)
}
정답
(9) 생성자 PrivateAccessError()는 private이므로 main()에서 호출할 수 없다.
(10) a는 PrivateAccessError 클래스의 private 멤버이므로 main()에서 접근할 수 없다.
(11) f()는 PrivateAccessError 클래스의 private 멤버이므로 main()에서 호출할 수 없다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
| 바람직한 C++ 프로그램 작성법 (0) | 2026.06.27 |
|---|---|
| C++ 구조체 (0) | 2026.06.24 |
| 소멸자 실행 (0) | 2026.06.18 |
| 소멸자란? (0) | 2026.06.15 |
| 생성자는 꼭 있어야 하는가? (0) | 2026.06.12 |