728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

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