C++ Chapter 8.2 : 캡슐화, 접근 지정자, 접근 함수
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 8. 객체 지향의 기초 : 캡슐화, 접근 지정자, 접근 함수
🔔 캡슐화
외부로부터 중요한 데이터와 기능을 보호하고 은닉하는 것.
우리는 연관있고 공통적인 데이터와 기능들을 묶어서 클래스
로 추상화 하였다. 데이터와 기능들 중에서 접근할 수 있는 영역을 제한 하고 외부로부터 은닉하는 것을 것을 캡슐화
라고 한다.
🔔접근 지정자
접근 지정자를 명시해주지 않으면 디폴트로
private
으로 지정된다.
public
- 외부의 모든 곳에서 접근 허용
private
- 클래스 내의 멤버 함수에서만 접근 가능
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_year은
private
하기 때문에 외부에서 직접 값을 수정할 수 없다.
- 멤버 변수 m_year은
- cout « m_month « endl; 는 에러 발생.
- 멤버 변수 m_month은
private
하기 때문에 외부에서 직접 명시하여 사용할 수 없다.
- 멤버 변수 m_month은
- today.m_year = 1994; 는 에러 발생.
🔔 접근 함수 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 가 된다.
- today 객체의 멤버 값들을 복사해온다.
- 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 으로 막아두는 것을 권장한다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기