C++ 이 C구분되는 중요한 특징이 바로 객체지향 언어라는 점입니다. 객체지향 프로그래밍(Object-Oriented Programming)은 C와 같은 절차형 프로그래밍에 비해 코드 작성이 좀 더 독특합니다. 코드 표현에 있어서 세상 모든 것을 객체의 관점에서 바라보는 것입니다. 객체라는 개념은 그리 어려운 것이 아닙니다. 우리 주변에서 흔히 볼 수 있는 TV, 컴퓨터, 사람, 자동차, 의자, 카메라 등 그 모든 것이 객체입니다. 이런 객체를 표현하기 위해 C++에서는 클래스라는 개념을 도입했습니다. 이번 장에서는 객체지향의 가장 기본이라 할 수 있는 클래스(Class)에 대해서 정리해 보겠습니다.
클래스(class) 정의
클래스(class)란 객체의 특성을 정의한 것입니다. 이런 특성을 정의하기 위해 클래스는 속성을 나타내는 멤버 변수(member variable)와 동작을 나타내는 멤버함수(메서드, method)를 갖고 있습니다. 이들 각각은 public, protected, private으로 나누어 접근 수준을 지정할 수 있습니다.(별도 지정이 없을 시에는 private으로 지정됩니다)
public으로 지정한 멤버는 클래스 내부 및 외부에서 접근할 수 있는 반면 private으로 지정한 멤버는 클래스 내의 멤버 함수들에게만 접근이 허용됩니다. 또한 protected로 지정된 멤버는 클래스 내의 멤버 함수와 이 클래스를 상속받은 파생클래스의 멤버함수에게만 접근이 허용됩니다. protected는 추후 상속에 대해서 정리할 때 다시 언급하겠습니다. 클래스 정의에 대한 이해를 돕기 위해 Rectangle이라는 클래스를 정의하는 예를 들어 보겠습니다.
class Rectangle
{
public: //접근지정자
//멤버 함수 정의
//-----------------------------------
Rectangle(); //생성자
~Rectangle(); //소멸자
double calculateArea() const;
//getter
double getWidth() const;
double getHeight() const;
//setter
void setWidth(const double& Width);
void setHeight(const double& Height);
//-------------------------------------
private: //접근지정자
//멤버 변수 정의
//---------------------
double m_dWidh;
double m_dHeight;
//---------------------
};
생성자와 소멸자
클래스와 이름이 같고 리턴타입이 없는 메서드를 생성자(constructor)라고 부릅니다. 이 메서드는 해당 클래스의 객체를 생성할 때 자동으로 호출됩니다. 그리고 생성자와 형태는 같지만 앞에 틸데(~)를 붙인 메서드를 소멸자(destructor)라고 부릅니다. 이 메서드는 객체가 제거될 때 자동으로 호출됩니다.
생성자로 멤버 데이터를 초기화하는 방법은 두가지입니다. 첫 번째 방법은 생성자 이니셜라이저(ctor 이니셜라이저)를 사용하는 것으로 생성자 뒤에 콜론(:)을 붙여서 표현합니다. 예를 들어 Rectangle 클래스의 생성자의 경우 다음과 같이 사용합니다.
Rectangle::Rectangle()
:m_dWidth(0.0)
,m_dHeight(0.0)
{
}
두 번째 방법은 생성자의 본문에서 초기화하는 것입니다.
Rectangle::Rectangle()
{
m_dWidth = 0.0;
m_dHeight = 0.0;
}
마지막으로는 클래스를 정의하는 코드안에서 초기화하는 방법입니다. 이 방법은 생성자가 데이터 멤버를 초기화하는 일 외에는 다른 일을 하지 않을 때거나 굳이 생성자를 따로 정의할 필요가 없을 때 사용합니다.
private:
double m_dWidth = 0.0;
double m_dHeight = 0.0;
만약 클래스에서 힙 메모리를 할당하거나 파일 열기 같은 작업을 한다면 생성자에서 초기화 해주는 것이 좋습니다.
Rectangle클래스의 소멸자는 별다른 할일이 없습니다. 메모리 해제나 파일 닫기 같은 정리하는 작업이 없다면 굳이 작성할 필요는 없습니다.
Rectangle::~Rectangle()
{
// 할 일이 없다.
}
나머지 정의된 메서드들에 대한 구현은 다음과 같습니다.
double Rectangle::calculateArea() const
{
return m_dWidth * m_dHeight;
}
double Rectangle::getWidth() const
{
return m_dWidth;
}
double Rectangle::getHeight() const
{
return m_dHeight;
}
void Rectangle::setWidth(const double& Width)
{
m_dWidth = Width;
}
void Rectangle::setHeight(const double& Height)
{
m_dHeight = Height;
}
[참고]
1. 전문가를 위한 c++(개정4판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
2. 명품 c++ Programming (저자 : 황기태)
'Program Language > c++' 카테고리의 다른 글
c++ 기초(직원 관리 시스템 - Employee 클래스 정의) (12) | 2023.01.31 |
---|---|
C++ 기초(유니폼 초기화) (16) | 2023.01.27 |
c++ 기초(타입 추론 : auto & decltype) (5) | 2023.01.19 |
c++ 기초(레퍼런스) (1) | 2023.01.17 |
c++ 기초 (const 키워드의 사용법) (4) | 2023.01.16 |
댓글