[C++] 객체 지향 언어의 특성에 대하여
🌈 프로그래밍/C++

[C++] 객체 지향 언어의 특성에 대하여

반응형

 

안녕하세요? 수구립니다.

 

 

저번 포스팅에서는 C++의 고급기능 소개를 마치면서 auto 키워드에 대해서 알아보았습니다.

 

 

2021.08.20 - [C++] - [C++] 타입 추론에 대하여

 

[C++] 타입 추론에 대하여

안녕하세요? 수구리입니다. 지난 포스팅에서는 C++에서의 레퍼런스(참조) 방식과 예외처리에 대해서 알아봤었죠? 2021.08.19 - [C++] - [C++] 1.2.4 ~ 1.2.5 레퍼런스와 익셉션 [C++] 1.2.4 ~ 1.2.5 레퍼런스와 익

tasddc.tistory.com

 

이번 포스팅에서는 C++은 객체지향 언어라고도 하죠?

 

 

그 특징은 무엇인지 구체적인 예제와 함께 살펴보려고 합니다.

 

 

1.3 C++ 객체지향 언어 특성

  • C++가 C언어와 가장 큰 다른 점은 객체지향 언어라는 점이다.
  • 이번 파트에서는 C++에서 클래스의 정의와 어떻게 사용하는지에 대하여 알아보자.

 

1.3.1 클래스 정의

  • 클래스 : 객체의 특성을 정의한 것
  • 헤더 파일(.h) : 클래스를 선언
  • 소스 파일(.cpp) : 클래스를 구체적으로 구현

  • 다음은 비행 마일리지에 따라 티켓의 가격을 계산하며, 우수 등급 회원인지 여부도 표현한다.

AirlineTickket 클래스 정의 부분

 

  • 각각의 데이터 맴버와 메서드마다 public, protected, private의 키워드를 사용하여 접근 수준을 지정한다.
  • public은 어디에서나 접근 가능, private는 클래스 외부에서는 접근이 불가능하다.
  • 외부에서 private 맴버에 접근하기 위해서는 그 값을 가져오는 getter와 setter를 정의하고 이를 public으로 지정한다. (=> 5장, 10장에서 ..)
  • 클래스와 이름이 같고 리턴 타입이 없는 메서드를 생성자라고 한다. 반대로 ~가 붙어있다면 소멸자.
  • 객체를 생성하면 자동으로 생성자를 호출하고 객체가 제거되면 소멸자를 호출한다.

 

생성자로 데이터 맴버를 초기화 하는 방법

  1. 생성자 이니셜라이저 (ctor 이니셜라이저)
    • 생성자 이름 뒤에 : 를 붙여서 표현
    • 권장하는 방법이다.
// 위의 예시에서 ctor 이니셜라이저를 사용하는 방법
AirlineTicket::AirlineTicket()
    : mPassengerName("Unkown Passenger")
    , mNumberOFMiles(0)
    , mHasEliteSuperRewardsStatus(false)
{
}

 

 

  1. 생성자의 본문에서 초기화
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; // 힙 객체 삭제

 

 

이상으로 구체적인 예시들과 함께 살펴보았는데요

 

 

중요한 것은 객체를 생성할 때 스택기반이냐 힙기반이냐,

 

 

생성자는 초기화를 진행할 수도 하지 않을 수도 있다는 것을 알 수 있었습니다.

 

 

이상입니다!

반응형