public과 private 접근 지정자
다음 구조체를 보자:
struct DateStruct
{
int month;
int day;
int year;
};
int main()
{
DateStruct date;
date.month = 10;
date.day = 14;
date.year= 2020;
return 0;
}
위 프로그램에서는 DataStruct를 선언한 다음 멤버를 직접 초기화하기 위해서 직접 접근한다. 이것은 구조체의 모든 멤버가 기본적으로 public
멤버이기 때문에 작동한다. public
멤버는 구조체 또는 클래스 외부에서 접근할 수 있는 구조체 또는 클래스의 공개 멤버다. 이 경우 main() 함수는 구조체 외부에 있지만 공개되어 있으므로 month, day, year 멤버에 직접 접근할 수 있다.
반면에 다음과 같이 거의 같은 클래스를 보자:
class DateClass // members are private by default
{
int m_month;
int m_day;
int m_year;
};
int main()
{
DateClass date;
date.m_month = 10;
date.m_day = 14;
date.m_year = 2020;
return 0;
}
위 프로그램을 컴파일하면 오류가 발생한다. 왜냐하면, 기본적으로 클래스의 모든 구성원이 private
이기 때문이다. private
멤버는 오직 클래스의 다른 멤버만 접근할 수 있는 비공개 멤버다. main()은 DateClass의 멤버가 아니므로 m_month 등에 접근할 수 없다.
접근 지정자 (access specifiers)
클래스 멤버는 기본적으로 private
이지만 public
키워드를 사용해서 공개할 수 있다.
class DateClass
{
public:
int m_month;
int m_day;
int m_year;
};
int main()
{
DateClass date;
date.m_month = 10;
date.m_day = 14;
date.m_year = 2020;
return 0;
}
DateClass의 멤버는 이제 public
이므로 main()에서 직접 접근할 수 있다.
클론 특수문자와 함께 사용하는 public:
을 접근 지정자라고 한다. 접근 지정자는 클래스의 멤버에 접근할 수 있는 사용자를 결정한다. 각 멤버는 접근 지정자의 접근 수준을 "획득"한다. (기본 접근 수준은 private)
C++은 public
, priavte
및 protected
세 가지 접근 지정 키워드를 제공한다. public
은 공개 멤버이므로 클래스 외부에서도 접근할 수 있고, private
는 비공개 멤버이므로 클래스 내에서만 접근할 수 있다. protected
는 나중에 "상속"을 다룰 때 설명할 예정이다.
public
: 공개 멤버, 클래스 외부에서도 접근 가능
priavte
: 비공개 멤버, 클래스 내에서만 접근 가능
클래스에는 여러 접근 지정자를 사용하여 각 멤버의 접근 수준을 설정할 수 있다. 한 클래스에서 사용할 수 있는 접근 지정자의 개수에는 제한이 없다.
일반적으로 멤버 변수는 비공개로 하고, 멤버 함수는 공개하는 것이 일반적이다.
class DateClass
{
int m_month;
int m_day;
int m_year;
public:
void setDate(int month, int day, int year)
{
m_month = month;
m_day = day;
m_year = year;
}
void print()
{
std::cout << m_month << "/" << m_day << "/" << m_year;
}
};
int main()
{
DateClass birthDate;
birthDate.setDate(7, 28, 1992);
birthDate.print();
return 0;
}
m_month, m_day, m_year은 private
하므로 main()에서 직접 접근할 수 없지만, setDate() 및 print() public
멤버 함수를 통해 간접적으로 접근할 수 있다.
번역: 이 포스트의 원문은 https://www.learncpp.com/cpp-tutorial/83-public-vs-private-access-specifiers/ 입니다.