클래스(class)
클래스란 객체의 특성을 정의한 것이다.
C++에서 클래스를 선언하는 코드는 주로 헤더 파일(.h)에 작성하고,
구체적으로 구현하는 코드는 소스 파일(.cpp)에 작성된다.
클래스를 이해하기 위해 항공기 티켓에 대한 클래스를 정의해보자.
이 클래스는 비행 마일리지에 따라 티켓의 가격을 계산하고, 우수 등급 회원인지 여부도 표현한다.
우수 등급 회원인지 여부도 표현한다.
접근 수준
클래스를 정의할 때는 먼저 클래스 이름부터 적는다.
그리고 중괄호 안에 이 클래스의 데이터 멤버(속성)와 메서드(동작)을 선언한다.
각각의 데이터 멤버와 메서드마다 public, protected, private 등으로 접근 수준을 지정한다.
public으로 지정한 멤버는 클래스 밖에서 접근할 수 있는 반면
private로 지정한 멤버는 클래스 외부에서 접근할 수 없다.
대체로 데이터 멤버는 모두 private로 지정하고, 외부에서 데이터 멤버를 접근하게 하려면
그 값을 가져오는 메서드(게터)나 설정하는 메서드(세터)를 정의하고 이를 public으로 지정한다.
#include <string>
class AirlineTicket
{
public:
AirlineTicket();
~AirlineTicket();
double calculatePriceInDollars() const;
const std::string& getPassengerName() const;
void setPassengerName(const std::string& name);
int getNumberOfMiles() const;
void setNumberOfMiles(int miles);
bool hasEliteSuperRewardsStatus() const;
void setHasEliteSuperRewardsStatus(bool status);
private:
std::string mPassengerName;
int mNumberOfMiles;
bool mHasEliteSuperRewardsStatus;
};
const-정확성 원칙에 따르면 객체의 데이터 멤버 값을 변경하지 않는 멤버 함수는 항상 const로 지정하는 것이 좋다.
이렇게 지정한 멤버 함수를 '인스펙터, 접근자 또는 게터'라 부르며, non-const 멤버 함수를 '뮤레이터(변경자)'라 부른다.
생성자와 소멸자
클래스와 이름이 같고 리턴 타입이 없는 메서드를 생성자라 부른다.
이 메서드는 해당 클래스의 객체를 생성할 때 자동으로 호출된다.
생성자의 형태는 같지만 앞에 물결(~)을 붙인 메서드를 소멸자라 부른다.
이 메서드는 객체가 제거될 때 자동으로 호출된다.
생성자 초기화
생성자로 데이터 멤버를 초기화하는 방법은 두 가지다.
첫 번째는 생성자 이니셜라이저(ctor 이니셜라이저)를 사용하는 것으로, 생성자 이름 뒤에 콜론(:)을 붙여서 표현한다.
AirlineTicket 클래스의 생성자에서 ctor 이니셜라이저를 사용하는 방법은 다음과 같다.
AirlineTicket::AirlineTicket()
: mPassengerName("Unknown Passenger")
, mNumberOfMiles(0)
, mHasEliteSuperRewardsStatus(false)
{
}
두 번째 방법은 다음과 같이 생성자의 본문에서 초기화하는 것이다.
AirlineTicket::AirlineTicket()
{
// 데이터 멤버 초기화
mPassengerName = "Unknown Passenger";
mNumberOfMiles = 0;
mHasEliteSuperRewardsStatus = false;
}
생성자에서 다른 일을 하지 않고 데이터 멤버를 초기화하는 일만 한다면 굳이 생성자를 따로 정의할 필요가 없다.
다음 코드 처럼 클래스를 정의하는 코드 안에서 곧바로 데이터 멤버를 초기화해도 되기 때문이다.
private:
std::string mPassengerName = "Unknown Passenger";
int mNumberOfMiles = 0;
bool mHasEliteSuperRewardsStatus = false;
};
소멸자 초기화
다음은 AirlineTicket 클래스에 대한 소멸자이다
AirlineTicket::~AirlineTicket()
{
// 특별히 정리할 일이 없다.
}
실제로 할 일이 없을 때는 굳이 소멸자를 작성할 필요는 없다.
주로 파일을 닫거나 메모리를 해제하는 등의 정리 작업이 필요하다면 소멸자를 정의한다.
AirlineTicket 클래스에 정의된 메서드는 다음과 같다.
AirlineTicket::AirlineTicket()
{
// 데이터 멤버 초기화
mPassengerName = "Unknown Passenger";
mNumberOfMiles = 0;
mHasEliteSuperRewardsStatus = false;
}
AirlineTicket::~AirlineTicket()
{
}
double AirlineTicket::calculatePriceInDollars() const
{
if (hasEliteSuperRewardsStatus()) {
// 우수 등급(Elite Super Rewards) 회원에게는 무료 티켓을 제공한다
return 0;
}
// 티켓 가격은 비행 거리에 0.1을 곱한 값이다
return getNumberOfMiles() * 0.1;
}
const std::string& AirlineTicket::getPassengerName() const
{
return mPassengerName;
}
void AirlineTicket::setPassengerName(const std::string& name)
{
mPassengerName = name;
}
int AirlineTicket::getNumberOfMiles() const
{
return mNumberOfMiles;
}
void AirlineTicket::setNumberOfMiles(int miles)
{
mNumberOfMiles = miles;
}
bool AirlineTicket::hasEliteSuperRewardsStatus() const
{
return mHasEliteSuperRewardsStatus;
}
void AirlineTicket::setHasEliteSuperRewardsStatus(bool status)
{
mHasEliteSuperRewardsStatus = status;
}
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 1.4.0] 유니폼 초기화, 축소 변환 (0) | 2022.08.18 |
---|---|
[C++ 1.3.2] 클래스 사용하기 (0) | 2022.08.17 |
[C++ 1.2.6] 타입 추론(auto, decltype) (0) | 2022.08.16 |
[C++ 1.2.5] 익셉션(exception(예외)), throw 구문, catch/try 구문 (0) | 2022.08.16 |
[C++ 1.2.4] 레퍼런스, Const 레퍼런스 (0) | 2022.08.16 |