728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
Protected 접근 지정
C++의 멤버에 대한 접근 지정자는 private, public, protected 3가지가 존재하며, 이 중에 반드시 하나로 지정되어야 한다. 이번 글에서는 protected에 집중하여 알아보자.
- 우선 멤버의 접근 지정에 따라 접근 가능 여부를 나타내었다.
private 멤버 | protected 멤버 | public 멤버 | |
멤버를 선언한 클래스 | O | O | O |
파생 클래스 | X | O | O |
다른 클래스나 외부 함수 | X | X | O |
기본 클래스에 protected로 지정된 멤버는 파생 클래스에게 접근을 허용하고 다른 클래스나 외부 함수에서 접근할 수 없도록 숨겨진다.
위 그림에서 보면 파생 클래스에서는 private 외에는 접근이 가능하지만, 외부 함수 또는 다른 클래스에서는 public에만 접근 가능하다. 아래 코드를 예시로 파생 클래스에서 기본 클래스의 멤버에 대한 접근 가능성을 확인해보자.
#include <iostream>
#include <string>
using namespace std;
class Point {
protected:
int x, y; //한 점 (x,y) 좌표값
public:
void set(int x, int y) { this->x = x; this->y = y; }
void showPoint() {
cout << "(" << x << "," << y << ")" << endl;
}
};
class ColorPoint : public Point {
string color;
public:
void setColor(string color) { this->color = color; }
void showColorPoint();
bool equals(ColorPoint p);
};
void ColorPoint::showColorPoint() {
cout << color << ":";
showPoint(); // Point 클래스의 showPoint() 호출
}
bool ColorPoint::equals(ColorPoint p) {
if(x == p.x && y == p.y && color == p.color) // 1
return true;
else
return false;
}
int main() {
Point p; // 기본 클래스의 객체 생성
p.set(2,3); // 2
p.x = 5; // 3
p.y = 5; // 4
p.showPoint();
ColorPoint cp; // 파생 클래스의 객체 생성
cp.x = 10; // 5
cp.y = 10; // 6
cp.set(3,4);
cp.setColor("Red");
ColorPoint cp2;
cp2.set(3,4);
cp2.setColor("Red");
cout << ((cp.equals(cp2))?"true":"false"); // 7
}
- 1의 코드에서는 컴파일 오류가 발생하지 않는다. Point 클래스의 x, y는 protected 멤버이므로 파생 클래스인 ColorPoint에서 접근이 가능하기 때문
- 2의 코드 역시set() 함수가 Point의 public 멤버이므로 컴파일 오류가 발생하지 않는다.
- 3, 4, 5, 6의 코드에서는 protected 멤버로 선언된 x, y를 접근하기 때문에 컴파일 오류가 발생한다.
- 7의 코드에서도 컴파일 오류가 발생하지 않는다.
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] public, protected, private 상속 (0) | 2023.12.14 |
---|---|
[C++] 상속과 생성자, 소멸자 (1) | 2023.12.14 |
[C++] 상속과 객체 포인터 (0) | 2023.12.14 |
[C++] 상속 (1) | 2023.12.06 |
[C++] 단항 연산자 중복과 프렌드로 구현하기 (2) | 2023.12.06 |