반응형
안녕하세요? 수구립니다.
저번 포스팅에서는 C++의 고급기능 소개를 마치면서 auto 키워드에 대해서 알아보았습니다.
2021.08.20 - [C++] - [C++] 타입 추론에 대하여
이번 포스팅에서는 C++은 객체지향 언어라고도 하죠?
그 특징은 무엇인지 구체적인 예제와 함께 살펴보려고 합니다.
1.3 C++ 객체지향 언어 특성
- C++가 C언어와 가장 큰 다른 점은 객체지향 언어라는 점이다.
- 이번 파트에서는 C++에서 클래스의 정의와 어떻게 사용하는지에 대하여 알아보자.
1.3.1 클래스 정의
- 클래스 : 객체의 특성을 정의한 것
- 헤더 파일(.h) : 클래스를 선언
- 소스 파일(.cpp) : 클래스를 구체적으로 구현
- 다음은 비행 마일리지에 따라 티켓의 가격을 계산하며, 우수 등급 회원인지 여부도 표현한다.
- 각각의 데이터 맴버와 메서드마다 public, protected, private의 키워드를 사용하여 접근 수준을 지정한다.
- public은 어디에서나 접근 가능, private는 클래스 외부에서는 접근이 불가능하다.
- 외부에서 private 맴버에 접근하기 위해서는 그 값을 가져오는 getter와 setter를 정의하고 이를 public으로 지정한다. (=> 5장, 10장에서 ..)
- 클래스와 이름이 같고 리턴 타입이 없는 메서드를 생성자라고 한다. 반대로 ~가 붙어있다면 소멸자.
- 객체를 생성하면 자동으로 생성자를 호출하고 객체가 제거되면 소멸자를 호출한다.
생성자로 데이터 맴버를 초기화 하는 방법
- 생성자 이니셜라이저 (ctor 이니셜라이저)
- 생성자 이름 뒤에 : 를 붙여서 표현
- 권장하는 방법이다.
// 위의 예시에서 ctor 이니셜라이저를 사용하는 방법
AirlineTicket::AirlineTicket()
: mPassengerName("Unkown Passenger")
, mNumberOFMiles(0)
, mHasEliteSuperRewardsStatus(false)
{
}
- 생성자의 본문에서 초기화
AirlineTicket::AirlineTicket(){
// 데이터 맴버 초기화
mPassengerName = "Unkown Passenger";
mNumberOFMiles = 0;
mHasEliteSuperRewardsStatus = false;
}
- 만약 생성자에서 다른 일은 하지 않고 데이터 맴버를 초기화만 한다면 굳이 생성자를 만들 필요는 없다.
// 다음과 같이 클래스 정의에서 처리
private:
std::string mPassengerName = "Unkown Passenger";
int mNumberOFMiles = 0;
bool mHasEliteSuperRewardsStatus = false;
- AirlineTicket 클래스에서 정의된 메서드
double AirlineTicket::calculatePriceInDollars() const{
if (hasEliteSuperRewardsStatus()){
// 우수 등급의 회원은 무료 티켓
return 0;
}
// 일반 회원의 티켓 가격은 비행 거리에 0.1을 곱한 값
return getNumberOfMiles() * 0.1;
}
const string& AirlineTicket::getPassengerName() const{
return mPassengerName;
}
void AirlineTicket::setPassengerName(const string& name){
mPassengerName = name;
}
// 그 밖에 getter & setter 생략
1.3.2 클래스 사용하기
- 위에서 정의한 클래스를 사용하는 예시를 살펴보자.
// AirlineTicket 객체를 스택 기반 생성
AirlineTicket myTicket;
myTicket.setPassengerName("gildong-hong");
myTicket.setNumberOfMiles(700);
double cost = myTicket.calculaterPriceInDollars();
cout << "This ticket will cost $" << cost << endl;
// AirlineTicket 객체를 스마트포인터를 사용한 힙 기반 생성
auto myTicket2 = make_unique<AirlineTicket>();
myTicket2->setPassengerName("gildong-hong");
myTicket2->setNumberOfMiles(2000);
myTicket2->setHasEliteSuperRewardsStatus(true);
double cost2 = myTicket2->calculatePriceInDollars();
cout << "This other ticket will cost $" << cost2 << endl;
// 스마트포인터를 사용하지 않는 힙 기반 생성 (권장하지 않는 방법)
AirlineTicket* myTicket3 = new AirlineTicket();
// ,,, 티켓 3 사용
delete myTicket2; // 힙 객체 삭제
이상으로 구체적인 예시들과 함께 살펴보았는데요
중요한 것은 객체를 생성할 때 스택기반이냐 힙기반이냐,
생성자는 초기화를 진행할 수도 하지 않을 수도 있다는 것을 알 수 있었습니다.
이상입니다!
반응형
'🌈 프로그래밍 > C++' 카테고리의 다른 글
[C++] 직원 관리 프로그램 만들기 (2) | 2021.08.23 |
---|---|
[C++] 유니폼 초기화란? (2) | 2021.08.20 |
[C++] 타입 추론에 대하여 (0) | 2021.08.20 |
[C++] 1.2.4 ~ 1.2.5 레퍼런스와 익셉션 (2) | 2021.08.19 |
[C++] 1.2.3 const의 이해 (3) | 2021.08.18 |