클래스와 클래스 멤버
객체 지향 프로그래밍에서, 우리는 종종 우리의 타입이 데이터를 보유할 뿐만 아니라, 데이터와 함께 작동하는 기능을 제공하기를 원한다. C++에서는 이 작업을 class
키워드를 통해 수행한다. class
키워드를 사용하면 클래스라고 하는 새로운 사용자 정의 타입을 정의할 수 있다.
클래스 (class)
C++에서 클래스와 구조체는 본질적으로 같다:
struct DateStruct
{
int year;
int month;
int day;
};
class DateClass
{
public:
int m_year;
int m_month;
int m_day;
};
중요한 차이점은 클래스의 public
키워드뿐이다. 이것은 다음 포스트에서 자세히 설명할 예정이다.
구조체 선언과 마찬가지로, 클래스 선언은 메모리에 할당되지 않는다. 클래스가 어떻게 보이는지만 정의한다.
구조체와 마찬가지로, 클래스를 사용하려면 해당 클래스 타입의 변수를 선언해야 한다.
DateClass birthDay { 1992, 7, 28 }; // declare a variable of class DateClass
C++에서는 클래스의 변수를 정의할 때 클래스의 인스턴스화(instantiating)라고 부른다. 변수 자체를 클래스의 인스턴스(instance)라고 한다. 또한, 클래스 타입의 변수는 객체(object)라고도 불린다. 내장형(예: int x
)의 변수를 정의하는 방식이 해당 변수에 메모리를 할당하는 방법과 마찬가지로, 객체를 인스턴스화(예: DateClass birthDay
)하면 해당 객체에 대한 메모리가 할당된다.
멤버 함수 (member function)
데이터를 보유하는 것 외에도 클래스(or 구조체)에는 함수가 포함될 수 있다. 클래스의 내부에서 정의된 함수를 멤버 함수(member function)라고 한다. 때로는 메소드(method)라고 불리기도 한다. 멤버 함수는 클래스 정의의 내부 또는 외부에서 정의할 수 있다. 여기서는 클래스 안에 정의하고 나중에 클래스 외부에 정의하는 방법을 보여줄 것이다.
다음은 날짜를 출력하는 멤버 함수가 있는 Date 클래스다:
class DateClass
{
public:
int m_year;
int m_month;
int m_day;
void print() // defines a member function named print()
{
std::cout << m_year << "/" << m_month << "/" << m_day;
}
}
구조체의 멤버처럼 클래스의 멤버(변수 및 함수)는 멤버 선택 연산자(.
)를 사용하여 접근할 수 있다.
int main()
{
DateClass birthDay { 2019, 7, 28 };
birthDay.m_year = 1992; // 클래스의 멤버 변수 접근, 값 수정
birthDay.print(); // 클래스의 멤버 함수 호출
return 0;
}
// 1992/7/28
모든 멤버 함수 호출은 클래스의 객체와 연결되어 있어야 한다. birthDay.print()
를 호출하면 컴파일러에게 birthDay 객체와 연관된 print() 멤버 함수를 호출하도록 알려주게 된다.
print() 멤버 함수를 다시 살펴보자:
void print() // defines a member function named print()
{
std::cout << m_year << "/" << m_month << "/" << m_day;
}
m_year, m_month 및 m_day는 멤버 함수가 실제로 연관된 객체의 멤버를 참조한다.
따라서 birthDay.print()
를 호출하면 m_year을 birthDay.m_year로 .. m_day를 birthDay.m_day로 해석한다.
이런 식으로, 연관된 객체가 암시적으로 멤버 함수에 전달된다. 이러한 이유로 암시적 객체(implict object)라고도 한다. 다음 포스트에서 암시적 객체에 관한 내용을 자세히 다룰 예정이다. 중요한 점은 멤버 함수가 항상 작업할 클래스의 암시적 객체를 가지고 있다는 것이다.
번역: 이 포스트의 원문은 https://www.learncpp.com/cpp-tutorial/82-classes-and-class-members/ 입니다.