C++ Chapter 8.2 : 캡슐화, 접근 지정자, 접근 함수

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 8. 객체 지향의 기초 : 캡슐화, 접근 지정자, 접근 함수

🔔 캡슐화

외부로부터 중요한 데이터와 기능을 보호하고 은닉하는 것.

우리는 연관있고 공통적인 데이터와 기능들을 묶어서 클래스로 추상화 하였다. 데이터와 기능들 중에서 접근할 수 있는 영역을 제한 하고 외부로부터 은닉하는 것을 것을 캡슐화라고 한다.


🔔접근 지정자

접근 지정자를 명시해주지 않으면 디폴트로 private으로 지정된다.

  1. public
    • 외부의 모든 곳에서 접근 허용
  2. private
    • 클래스 내의 멤버 함수에서만 접근 가능
  3. protected
    • 클래스 내의 멤버 함수에서 접근 가능
    • 이 클래스를 상속 받는 자식 클래스의 멤버 함수에서 접근 가능.
#include <iostream>

using namespace std;

class Date
{
    int m_year;

public:
	int m_month;
	int m_day;
};

int main()
{
	Date today; 

	today.m_day = 25;

    today.m_year = 1994; // 에러 ✨
    cout << m_month << endl; // 에러 ✨

	return 0;
}
  • public 👉 int m_month, int m_day
    • today.m_day = 25; 는 가능하지만
  • private 👉 int m_year
    • today.m_year = 1994; 는 에러 발생.
      • 멤버 변수 m_yearprivate 하기 때문에 외부에서 직접 값을 수정할 수 없다.
    • cout « m_month « endl; 는 에러 발생.
      • 멤버 변수 m_monthprivate 하기 때문에 외부에서 직접 명시하여 사용할 수 없다.


🔔 접근 함수 Setter, Getter

private 멤버 변수들은 public접근 함수들을 만들어 이를 통해 간접적으로 접근하자.

Setter : private 멤버 변수 값 바꾸기

#include <iostream>

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;
	}
    voic setYear(const int& year_input)
    {
        m_year = year_input;
    }
};
int main()
{
	Date today; 

	today.setDate( 8, 4, 2025 ); // 멤버 3개를 각각 초기화 해준다.
    today.setYear(2020);  // m_year 멤버변수의 값을 2020으로 바꾼다.  

	return 0;
}
  • 매개변수를 받아 private한 멤버들의 값을 초기화하거나 바꿔줄 수 있는 public 접근 함수 set땡땡 함수를 만든다.
    • 이제 이 함수들을 통해 private한 멤버들의 값을 초기화하거나 바꿔줄 수 있다.

Getter : private 멤버 변수 리턴 받기

#include <iostream>

using namespace std;

class Date
{
	int m_month;
	int m_day;
	int m_year;
public:
	const int & getYear()
    {
        return m_year;
    }
};
int main()
{
	Date today; 

	cout << today.getYear() << endl;  // m_year 멤버를 리턴 받는다.

	return 0;
}
  • 매개변수를 받아 private한 멤버들의 값을 불러올 수 있는 public 접근 함수 getter 함수를 만든다.
    • 이제 이 함수들을 통해 private한 멤버들의 값을 불러올 수 있다.
  • getter 접근 함수는 리턴 타입을 const int &로 하는 것을 권장한다.
    • 멤버 변수 값을 변경하는 것 없이 리턴만 받을 거라서 const로 지정해도 무방하고
    • 복사 과정을 줄여 메모리 성능을 높이기 위해 참조로 받아주자.

다른 객체의 멤버들을 복사해오는 접근 함수

#include <iostream>

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;
	}

    const int & getMonth()
    {
        return m_month;
    }

    const int & getDay()
    {
        return m_day;
    }

    const int & getYear()
    {
        return m_year;
    }

	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 객체
    Date tomorrow;  // tomorrow 객체

    today.setDate( 8, 4, 2025 );
    tomorrow.copyFrom(today);
    // tommorow.setDate(today.getMonth(), today.getDay(). today.getYear())

	return 0;
}
  • void copyFrom(const Date& original)
    • Date 클래스 타입의 다른 객체를 매개변수로 받아와 그 객체의 멤버 값들을 내 멤버에 복사
  • tomorrow.copyFrom(today);
    • today 객체의 멤버 값들을 복사해온다.
      • original = today 가 된다.
    • 이제 tomorrow 객체의 멤버 값들도 각각 m_month = 8, m_day = 4, m_year = 2025 가 된다.
  • tommorow.setDate(today.getMonth(), today.getDay(). today.getYear()) 해줄 필요 없이 tomorrow.copyFrom(today)만 해주면 되어 간단하다.

서로 다른 별개의 객체더라도 클래스 타입이 동일하다면 각 멤버는 서로의 private 멤버 변수에 접근이 가능하다.

  • 접근 지정자의 접근 제어 기준은 그때 그때 생성된 인스턴스의 기준이 아니라 클래스 기준이기 때문이다.
  • tomorrow 객체의 copyFrom 함수 내부에서 today 객체의 멤버들을 사용하고 접근할 수 있는 이유다.
    void copyFrom(const Date& original) // ⭐⭐⭐
    {
          m_month = original.m_month;  
          m_day = original.m_day;
          m_year = original.m_year;
    }
    


🔔 캡슐화를 사용하면 좋은 점

클래스 내의 멤버 변수 이름을 바꿔야 할 일이 생긴다면 해당 멤버를 직접 접근하여 사용한 부분들도 다 이름을 바꿔줘야 하는 수고가 따른다. 멤버들을 전부 private으로 설정한 후 접근 함수를 통해서만 접근하게 한다면 멤버 변수 명을 바꿔야 할 때도 그냥 클래스 내부에서만 바꾸어 주면 되기 때문에 편하고 안전하다. 멤버 변수(데이터)들은 private 으로 막아두는 것을 권장한다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기