public과 private 접근 지정자
다음 구조체를 보자:
struct DateStruct // members are public by default
{
int month; // public by default, can be accessed by anyone
int day; // public by default, can be accessed by anyone
int year; // public by default, can be accessed by anyone
};
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; // private by default, can only be accessed by other members
int m_day; // private by default, can only be accessed by other members
int m_year; // private by default, can only be accessed by other members
};
int main()
{
DateClass date;
date.m_month = 10; // error
date.m_day = 14; // error
date.m_year = 2020; // error
return 0;
}
위 프로그램을 컴파일하면 오류가 발생한다. 왜냐하면, 기본적으로 클래스의 모든 구성원이 private
이기 때문이다. private
멤버는 오직 클래스의 다른 멤버만 접근할 수 있는 비공개 멤버다. main()은 *DateClass의 멤버가 아니므로 *m_month 등에 접근할 수 없다.
접근 지정자 (access specifiers)
클래스 멤버는 기본적으로 private
이지만 public
키워드를 사용해서 공개할 수 있다.
class DateClass
{
public: // note use of public keyword here, and the colon
int m_month; // public, can be accessed by anyone
int m_day; // public, can be accessed by anyone
int m_year; // public, can be accessed by anyone
};
int main()
{
DateClass date;
date.m_month = 10; // okay because m_month is public
date.m_day = 14; // okay because m_day is public
date.m_year = 2020; // okay because m_year is public
return 0;
}
DateClass의 멤버는 이제 public
이므로 main()에서 직접 접근할 수 있다.
클론 특수문자와 함께 사용하는 public:
을 접근 지정자라고 한다. 접근 지정자는 클래스의 멤버에 접근할 수 있는 사용자를 결정한다. 각 멤버는 접근 지정자의 접근 수준을 "획득"한다. (기본 접근 수준은 private)
C++은 public
, priavte
및 protected
세 가지 접근 지정 키워드를 제공한다. public
은 공개 멤버이므로 클래스 외부에서도 접근할 수 있고, private
는 비공개 멤버이므로 클래스 내에서만 접근할 수 있다. protected
는 나중에 "상속"을 다룰 때 설명할 예정이다.
public
: 공개 멤버, 클래스 외부에서도 접근 가능priavte
: 비공개 멤버, 클래스 내에서만 접근 가능
클래스에는 여러 접근 지정자를 사용하여 각 멤버의 접근 수준을 설정할 수 있다. 한 클래스에서 사용할 수 있는 접근 지정자의 개수에는 제한이 없다.
일반적으로 멤버 변수는 비공개로 하고, 멤버 함수는 공개하는 것이 일반적이다.
class DateClass // members are private by default
{
int m_month; // private by default, can only be accessed by other members
int m_day; // private by default, can only be accessed by other members
int m_year; // private by default, can only be accessed by other members
public:
void setDate(int month, int day, int year) // public, can be accessed by anyone
{
// setDate() can access the private members of the class because it is a member of the class itself
m_month = month;
m_day = day;
m_year = year;
}
void print() // public, can be accessed by anyone
{
std::cout << m_month << "/" << m_day << "/" << m_year;
}
};
int main()
{
DateClass birthDate;
birthDate.setDate(7, 28, 1992); // okay, because setDate() is public
birthDate.print(); // okay, because print() is public
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/ 입니다.
출처: https://boycoding.tistory.com/242?category=1067100 [소년코딩]
'프로그래밍 언어 > [ C++ ]' 카테고리의 다른 글
[ C++ ] 13. 생성자 (0) | 2021.02.17 |
---|---|
[ C++ ] 12. 캡슐화 (0) | 2021.02.16 |
[ C++ ] 10. 클래스와 클래스 멤버 (0) | 2021.02.10 |
[ C++ ] 09. std::vector의 capacity 및 stack 동작 (0) | 2021.02.10 |
[ C++ ] 08. 스택과 힙(Stack & Heap) (0) | 2021.02.10 |