Notice
Recent Posts
Recent Comments
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 03-2 : 객체지향 프로그래밍의 이해 본문

Programming Lang/C++

C++ Chapter 03-2 : 객체지향 프로그래밍의 이해

시데브 2023. 7. 13. 12:37

객체지향 프로그래밍의 이해

 객체지향 프로그래밍이란 무엇일까? 우선 객체에 대해서 이해해보자. C++에서 의미하는 객체는 "사물 또는 대상"을 의미한다. 이러한 객체는 하나 이상의 상태와 하나 이상의 행동을 가진다는 특성이 있다. 다음과 같은 문장을 예로 들어보겠다.

 

"나는 과일장수에게 두 개의 사과를 구매했다."

 

 여기서 객체는 '나', '과일장수', '사과'가 있다. 이런 객체들을 이용해서 우리는 '나'라는 객체가 '과일장수'라는 객체에게서 '사과'라는 객체를 구매했다고 표현할 수도 있다. 이런식으로 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 실체화 시키는 형태의 프로그래밍객체지향 프로그래밍이라고 한다. 

 

객체지향 프로그래밍의 구현

FruitSeller

 그렇다면 위 상황을 코드로 옮기기 위해서는 어떻게 해야할까? 우선 과일장수라는 대상부터 객체로 구현해보자. 객체를 구현하기 위해서는 '행동'과 '상태'를 다음과 같이 나눠봤다.

  • 과일장수는 과일을 판다. (행동)
  • 과일장수는 사과 20개, 오렌지 10개를 보유하고 있다. (상태)
  • 과일장수의 과일판매 수익을 현재까지 50,000원이다 (상태)

 여기서 행동 정보는 함수, 상태 정보는 변수를 통해서 표현될 수 있는데, 다음과 같이 정해보자.

int numOfApples; // 보유하고 있는 사과의 수
int my Money; // 판매 수익

int SalesApples(int money) // 사과를 판매하는 행위(사과 구매액을 함수의 인자로 전달)
{
    int num = money/1000 // 사과의 개당 가격 1000원이라 가정
    numOfApples -= num; // 보유한 사과의 수 감소
    myMoney += money // 판매 수익 발생
    return num; // 실제 구매가 발생한 사과의 수 반환
}

 우리는 위와 같은 변수와 함수를 묶어서 하나의 객체의 틀을 만들 필요가 있는데, 여기서 class를 이용할 수 있다.

 

 또한, 여기에 '남은 사과와 판매 수익을 알려주는 함수'와 '변수를 초기화하는데 사용하는 함수'를 추가해보겠다.

class FruitSeller
{
private:
    int APPLE_PRICE; //사과의 가격
    int numOfApples;
    int myMoney;

public:
	void InitMembers(int price, int num, int money)
    {
        APPLE_PRICE = price;
        numOfApples = num;
        myMoney = money;
    }

    int SalesApples(int money) 
    {
        int num = money/1000; 
        numOfApples -= num; 
        myMoney += money; 
        return num; 
    }
    
    void ShowSalesResult()
    {
        cout<<"남은 사과 : "<<numOfApples<<endl;
        cout<<"판매 수익 : "<<myMoney<<endl;
    }
};

 

FruitBuyer

 위에서는 과일 판매자를 구현했으니 이번에는 과일 구매자(me) 객체의 틀을 정의할 차례이다. FruitBuyer 클래스는 다음과 같이 구현할 수 있다.

class FruitBuyer
{
    int myMoney; // class는 접근제어 지시자 생략했을 때 private 
    int numOfApples // class는 접근제어 지시자 생략했을 때 private 
public:
    voidInitMembers(int money)
    {
        myMoney = money;
        numOfApples = 0;
    }

    void BuyApples(FruitSeller &seller, int money)
    {
        numOfApples += seller.SaleApples(money);
        myMoney -= money;
    }
    void ShowBuyResult()
    {
        cout<<"현재 잔액 : "<<myMoney<<endl;
        cout<<"사과 개수 : "<<numOfApples<<endl;
    }
};

 

클래스를 이용한 객체화

 현재 우리는 fruitseller와 fruitbuyer 클래스를 생성했다. 그렇다면 이 클래스 자체로 객체인 것일까? 그것은 아니다. 위에서도 언급했듯이 클래스는 '객체의 틀'에 불과하다. 따라서 클래스를 이용해서 '객체화' 과정을 거쳐야 객체를 생성할 수 있다.

 

 C++에서의 객체 생성 방법은 기본 자료형 변수의 선언 방식과 동일하다.

ClassName objName; // 일반적 변수의 선언방식
ClassName * ptrObj = new ClassName; // 동적 할당방식(힙 할당방식)

 우리가 정의한 fruitseller와 fruitbuyer 클래스를 이용하면 다음과 같이 표현할 수 있다.

FruitSeller seller; // 일반적 선언방식
FruitBuyer buyer; // 일반적 선언방식

FruitSeller * objPtr1 = new FruitSeller; // 동적 할당방식
FruitBuyer * objPtr2 = new FruitBuyer; // 동적 할당방식

 

 지금까지의 내용들을 모두 코드로 정리하면 다음과 같다.

#include <iostream>
using namespace std;

class FruitSeller
{
    int APPLE_PRICE; 
    int numOfApples;
    int myMoney;

public:
	void InitMembers(int price, int num, int money)
    {
        APPLE_PRICE = price;
        numOfApples = num;
        myMoney = money;
    }

    int SalesApples(int money) 
    {
        int num = money/1000; 
        numOfApples -= num; 
        myMoney += money; 
        return num; 
    }
    
    void ShowSalesResult()
    {
        cout<<"남은 사과 : "<<numOfApples<<endl;
        cout<<"판매 수익 : "<<myMoney<<endl;
    }
};

class FruitBuyer
{
    int myMoney; 
    int numOfApples;  

public:
    void InitMembers(int money)
    {
        myMoney = money;
        numOfApples = 0;
    }

    void BuyApples(FruitSeller &seller, int money) // '나'라는 객체가 '과일장수'에게 '과일'객체를 구매하는 행위를 표현
    {
        numOfApples += seller.SalesApples(money);
        myMoney -= money;
    }
    void ShowBuyResult()
    {
        cout<<"현재 잔액 : "<<myMoney<<endl;
        cout<<"사과 개수 : "<<numOfApples<<endl;
    }
};

int main(void)
{
    FruitSeller seller;
    seller.InitMembers(1000, 20, 0);
    FruitBuyer buyer;
    buyer.InitMembers(5000);
    buyer.BuyApples(seller, 2000); // buyer가 seller에게 2000원어치의 사과를 구매하는 메시지를 전달(Message Passing)

    cout<<"과일 판매자의 현황"<<endl;
    seller.ShowSalesResult();
    cout<<"과일 구매자의 현황"<<endl;
    buyer.ShowBuyResult();

    return 0;
}
과일 판매자의 현황
남은 사과 : 18
판매 수익 : 2000
과일 구매자의 현황
현재 잔액 : 3000
사과 개수 : 2

 


출처 : 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12