[C++] 접근 지정자

2024. 4. 1. 13:07Programming Language/C++

멤버는 언제든지 변경가능하기 때문에 원치 않는 수정으로 값이 바뀌는 문제가 발생한다.

이를 방지하기 위해 변경할 수 없게 제한을 두는 기능이 필요하다.

접근 지정자가 바로 그 역할을 하며, 캡슐화를 지원한다.

캡슐화
• 알약 내부 성분이 캡슐 덕분에 보호받는 것처럼 외부로부터 객체의 데이터에 접근하는 것을 막아서 보호하는 것을 의미한다.
• 접근해도 되는 데이터는 외부에서 접근할 수 있게 해준다.

접근 지정자

• C++에서 클래스나 구조체 내에서 객체의 멤버 변수와 멤버 함수에 접근성을 결정하는 키워드이다.

클래스는 접근 지정자를 명시하지 않으면 디폴트로 `private`이 지정된다.

※ 그래도 명시적으로 private 적어주기

반면, 구조체는 접근 지정자 디폴트가 `public`이다.

 

1) public [공개]

• 외부 함수도 접근할 수 있다.

2) protected [보호]

 자신 자신을 상속받은 클래스만 접근할 수 있다.

3) private [비공개]

• 멤버를 비공개 처리한다.

 동일한 클래스 멤버 함수만 접근할 수 있다.

class myClass {
	public:
    	// public 멤버 변수 선언
    protected:
    	// protected 멤버 변수 선언
    private:
    	// private 멤버 변수 선언
};

▷ 예시 (멤버 변수)

class CMy()
{
public:
	int m_i;
    float m_f;
    
    // 기본 생성자
    CMy()
        : m_i(100)
        , m_f(0.5f)
    {
		// 코드 내용 생략
    }
    
    // 기본 소멸자
    ~CMy()
    {
    	// 코드 내용 생략
    }
    
protected:
	int m_pro;
    
private:
	int m_pri;
};

int main()
{
	CMy c;  // 이 줄에 중단점 걸고 F11로 함수 안으로 들어가면 초기화 함수 CMy()로 이동한다.
    
    // public
    c.m_i;  // public이므로 c.을 하면 사용 가능한 멤버가 뜬다.
    
    // protected
    // c.pro;  // 오류 => protected이므로 직접 접근할 수 없다.
    
	// private    
    //c.pri;  // 오류 => private이므로 c.을 해도 접근이 불가능하므로 아무것도 뜨지 않는다.

	return 0;
}

 

▷ 예시 (멤버 함수)

class CMy
{
public:
	int m_i;
    float m_f;
    
    // CMy 클래스만 사용 가능한 함수
	// SetInt() => int 데이터 하나를 i에 받아오면 그 데이터를 CMy의 멤버인 m_i에 저장한다.
	void SetInt(int i)
	{
		//m_i는 public이고, 동일한 클래스 CMy이므로 사용 가능
		m_i = i;  //this->m_i = i;
	}
    
    // 기본 생성자
    CMy()
        : m_i(100)
        , m_f(0.5f)
    {
		// 코드 내용 생략
    }
    
    // 기본 소멸자
    ~CMy()
    {
    	// 코드 내용 생략
    }
    
private:
	int m_i2;
};

int main()
{
    CMy cm;  
	// c 객체 안에 있는 m_i라는 부분에 10을 넣는다.
	cm.SetInt(10);  // m_f = 0.500000000, m_i = 10
    // c.을 하면 m_i와 SetInt()가 같이 뜬다.
		// 이는 public으로 함수를 공개 처리를 했기 때문에 가능하다.

	CMy cm2;
	//SetInt(10);  // 오류 => CMy() 클래스의 전용 멤버 함수이기 때문에 그냥 호출할 수 없다.
	//CMy::SetInt(10);  // 오류 => 범위 지정 연산자(::)를 사용하여 호출하는 것도 안 된다.
	// 반드시 해당 클래스의 객체가 있어야 한다.
		// 즉, 멤버 함수를 호출하려면 해당 클래스의 실체화가 되어있는 변수인 객체가 필요하다.
	cm2.SetInt(10);  // m_f = 0.500000000, m_i = 10


	// m_i2는 SetInt()를 호출시킨 CMy 클래스의 멤버인, private: 부분에 있는 객체의 m_i2를 말한다.
	// 객체가 함수를 호출하는 것이 눈에 보이지는 않지만 마치 함수를 호출시킨 객체의 주소가 있는 것이다.
	// 이를 멤버 함수 안에서 this 포인터라고 부르며, 각 객체에 해당하는 값들이 들어있다.   
	CMy c;  // c : m_f = 0.500000000, m_i2 = 10
	c.SetInt(10);
	
	CMy c2;  // c2 : m_f = 0.500000000, m_i2 = 100
	c2.SetInt(100);
	
	CMy c3;  // c3 : m_f = 0.500000000, m_i2 = 1000
	c3.SetInt(1000);

	return 0;
}