프로그래밍 공부
작성일
2024. 1. 11. 07:41
작성자
WDmil
728x90

1.3 객체지향 언어로서의 C++

 

C언어 개발자 입장에서 앞에 나열된 C++의 기능을 보았다면 단지 좀 더 편리한 기능이 추가되었다고 생각할 수 있다.

 

C++ 라는 이름 자체가 암시하듯이 더 나은 C라는 측면이 있는것은 분명하다.

 

하지만 한 가지 넘겨짚을 수 없는 진일보한 부분이 있는데 C와는 달리 객체지향 언어라는 점이다.

 

객체지향 프로그래밍(ObjectOriented Programming(OOP)) 는 상당히 다른, 논란이 있긴 하지만 보다 자연스러운 코딩 방법이다.

1.3.1 클래스의 정의

 

클래스(class)는 객체의 특성을 정의한다. C++ 에서 클래스는 보통 헤더파일에서 선언하고 상세 정의는 관런 소스파일 (.cpp)에서 작성한다.

 

#include <string>

class AirlineTicket
{
	public:
        AirlineTicket();
        ~AirlineTicket();    
        int calculatePriceInDollars() const;
        const std::string& getPassengerName() const;
        void setPassengerName(const std::string& name);
        int getNumberOfMiles() const;
        void setNumberOfMiles(int miles);
        bool getHasEliteSuperRewardsStatus() const;
        void setHasEliteSuperRewardsStatus(bool status);
    private:
    	std::string mPassengerName;
        int mNUmberOfMiles;
        bool mhasEliteSuperRewardsStatus;
};

위 코드는 항공 티켓 클래스를 정의한 코드예시이다.

 

항공티켓 클래스는 마일리지에 따른 티켓의 가격을 계산할 수 있고, 승객이 멤버십 가입자인지도 확인할 수 있다.

 

클래스 정의는 클래스 이름을 선언하는 것으로 시작한다. {} 안에는 속성 데이터를 저장할 데이터 멤버와 클래스의 행동을 조정할 수 있는 메서드를 선언한다.

 

각 데이터 멤버와 메서드는 public, protected, privete 세가지 접근 권한에 매핑된다.

 

접근권한 정의 레이블은 순서와 등장 횟수에 제한이 없다.

 

  • public : 클래스 안과 밖에서 접근하는데 제한이 없다.
  • protected : 상속받거나 friend선언되지 않았을 경우 접근이 제한된다.
  • private : 본인 이외에는 접근이 제한된다.

 

로 이해하면 된다.

 

사실 모든 데이터는 private로 만들고 외부에서 접근해야 할 경우, 전용 게이터와 세터를 public으로 하는것 이 옳다.

 

이렇게 설계하면, 내부 데이터 구조를 필요에 따라 마음대로 바꾸면서도 외부 인터페이스는 유지할 수 있다.

 

상수 불변의 원칙이 프로그램 전체적으로 유지되게 하려면, 데이터 멤버의 변경이 없는 메서드는, 명시적으로 const선언을 해주는것 이 좋다.

 

이러한 const 메서드를 인스펙터(instpector)라고 하고, 멤버 변경이 있는 메서드를 뮤테이터(mutator)라고 한다.


생성자와 소멸자

 

클래스명과 같은 이름이면서, 리턴값이 없는 메서드는 생성자(Constructor) 라고 불린다.

 

이 함수는 객체가 생성될 때 자동으로 호출된다.

 

~로 시작하고 클래스명과 같은 메서드는, 소멸자(destuctor) 라고 한다.

 

소멸자는 객체가 메모리에서 해제될 때 자동으로 호출된다.

 


클래스의 메서드 정의

 

위의 항공티켓 AirlineTicket 클래스의 메서드 정의는 다음과 같다.

AirlineTicket::AirlineTicket()
{
	// 데이터 멤버 초기화
    mHasEliteSuperRewardsStatus = false;
    mPassengerName = "Unknown Passenger";
    mNumberOfMiles = 0;
 }
AirlineTicket::~AirlineTicket()
{
	// 동적데이터가 없음으로, 특별히 해야하는 정리가 없다.
}
int AirlineTicket::calculaterPriceOInDollars() const
{
	if (getHasEliteSuperRewardsStatus()) {
    	// 충성 고객 일 경우 무료티켓
        return 0;
    }
    // 티켓의 가격은 마일에 0.1을 곱한걸로 가정한다.
    return static_cast<int>(getNumberOfMiles() * 0.1);
}
const string& AirlineTicket::getPassengerName() const
{
	return mPassengerName;
}
void AirlineTicket::setPassengerName(const string& name)
{
	mPassengerName = name;
}
// 그 외에 get set 메서드가 존재한다.

대략 위와같이 클래스의 메서드가 정의된다고 이해하면 된다.

 

각각 필요에 따라 헤더와 cpp파일이 나누어져, 맥락을 파악하기 위해서는 헤더만 보면 될것이고,

 

자세한 코드 내용을 따로 확인하지 않아도. 리턴타입을 확인할 수 있음으로 코드의 가독성을 높여준다.

 

728x90