IT 프로그래밍/객체지향프로그래밍

[C++] 캡슐화, 접근지정자, 접근 함수

기술1 2024. 5. 14. 22:38
반응형

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;


class Date
{
private:
	int m_month;
	int m_day;
	int m_year;
};

int main()
{
	Date today;
	today.m_month = 8;
	today.m_day = 4;
	today.m_year = 2025;

	return 0;
}

이럴 경우 private 코드이기 때문에 today.m_month 이런 식으로 사용이 불가능하고 에러가 발생합니다. public으로 바꿀 경우 객체지향 프로그래밍에서 효율이 좋은 게 아닌데요. 그러면 어떻게 access function을 해주어야 할까요?

 

나를 통해라 라는 함수를 만들어주면 됩니다. public으로 함수를 만들어주면 그 public 함수는 private에 접근할 수 있기 때문에 문지기 역할을 한다고 보시면 됩니다.

#include <iostream>
#include <string>
#include <vector>
using namespace std;


class Date
{
	int m_month;
	int m_day;
	int m_year;

public:
	void setDate(const int& month_input, const int& day_input, const int& year_input)
	{
		m_month = month_input;
		m_day = day_input;
		m_year = year_input;
	}
};

int main()
{
	Date today;
	today.setDate(8, 4, 2025);

	return 0;
}

이런 식으로 setDate는 private 각각에 접근할 수 있으면서 int main에서 사용이 가능하기에 이것이 access function이라고 보시면 됩니다. setDate하면 통째로 3개를 입력받아서 멤버를 바꿔줄 수 있습니다. 이것 말고도 setMonth, setDay, setYear도 반들 수 있습니다. 

 

이렇게 객체지향프로그래밍에선 set 생성하는 것과 return 해주는 get 함수를 생성해줍니다.

 

copy.copyfrom(today);

이런 copy를 해주는 함수를 만들어주고자 합니다.

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;


class Date
{
	int m_month;
	int m_day;
	int m_year;

public:
	void setDate(const int& month_input, const int& day_input, const int& year_input)
	{
		m_month = month_input;
		m_day = day_input;
		m_year = year_input;
	}

	void setMonth(const int& month_input)
	{
		m_month = month_input;
	} 

	const int &getDay()
	{
		return m_day;
	}

	void copyFrom(const Date& original)
	{
		m_month = original.m_month;
		m_day = original.m_day;
		m_year = original.m_year;
	}
};

int main()
{
	Date today;
	today.setDate(8, 4, 2025);
	today.setMonth(10);

	cout << today.getDay() << endl;

	Date copy;
	copy.copyFrom(today);

	return 0;
}

이런 경우 막상 될 것 같진 않은데요.

 

같은 클래스의 다른 instance에 들어있는 것도 가능합니다. 같은 클래스 안에 들어있다면 private에도 접근이 가능하기에 original이라는 변수는 Date의 instance이면서 original.m_month; 이런 식으로 접근이 가능한 것입니다. 

반응형