[C++] 접근 지정자
2024. 4. 1. 13:07ㆍProgramming 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;
}
'Programming Language > C++' 카테고리의 다른 글
[C++] 템플릿 (함수/클래스) (0) | 2024.04.02 |
---|---|
[C++] 래퍼런스 (vs. 포인터) (0) | 2024.04.01 |
[C/C++] 가변 배열 - 구조체/분할 구현 (0) | 2024.03.28 |
[C++] wchar_t 배열 함수 - wcslen(), wcscat_s(), wcscmp(), wcscpy_s() (0) | 2024.03.27 |
[C++] 문자열 함수 - strlen(), strcat_s(), strcmp(), strcpy_s() (0) | 2024.03.27 |