[C++]객체지향 프로그래밍의 이해 (3-3)

4794 단어 윤성우CC

지금까지 구조체의 확장한것이 클래스라고 인식하였으나 이제는 전혀 다른 방법으로 다시 클래스를 이해해보자

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

객체 Object의 의미는

"사물 또는 대상"

즉, 우리주변에 존재하는 물건 이나 대상 전부를 의미한다.

그렇다면 객체지향 프로그래밍이라는것은 무엇일끼?
예를 들어서 다음 상황을 시뮬레이션 하는 프로그램을 구현한다고 가정하자.

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

여기서 객체는 나,과일장수,사과이다.

객체지향프로그래밍은

위의 객체를 등장시킬 수 있을 뿐만 아니라 객체끼리의 행위도 그대로 표현할 수 있다.

즉, 객체지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리거 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다.

"나는 과일장수에게 2000원을 주고 두 개의 사과를 구매했다."
를 구현해보자.

객체를 이루는 것은 데이터와 기능입니다.

먼저 과일장수 객체가 존재한다고 가정해 보자.
이 객체는 어떤 형태로 이뤄져야할까?

  • 과일장수는 과일을 팝니다.
  • 과일장수는 사과20 개, 오렌지 10개를 보유하고 있습니다.
  • 과일 장수의 과일판매 수익은 현재까지 50,000원 입니다.

첫 번째는 행동이고
나머지는 상태를 의미한다

행동 => 함수로 표현
상태 => 변수로 표현

그럼 이를 코드화 하면

이렇다.

과일장수의 정의와 맴버변수의 상수화에 대한 논의

객체 생성에 앞서 틀(mold)를 만들어야한다.
이는 붕어빵 틀과 같은개념이다!

이러한 틀을 만들어준 후
이제 여기에 초기화 함수와 남은 사과와,수익을 말해주는 함수를 추가해주면 과일장수의 틀은 완성된다.

그런데 사과 APPLE_PRICE로 대문자로 적은 이유는

"사과의 판매가격이 일정하다"
라는 가정의 결과이다.

그래서 const int APPLE_PRICE = 1000;
이라고 적으면 오류가 뜬다!!

그 이유는 클래스의 맴버 변수 선언문에서 초기화를 허용하지 않기 때문이다.

그래서 !!!
const int APPLE_PRICE 라고 적었는데!!!

이도 오류가 뜬다.

그 이유는 상수는 선언과 동시에 초고화 되어야 하기때문이다.

이 문제는 추후에 알아내보자 !!!

"나"를 표현하는 클래스의 정의

"나"는 구매자이다.
그렇다면 무엇이 있어야하겠는가!
바로 돈!!!
돈이 있어야하고!!
구매한 사과의 갯수!!
그리고 구매하는 행위!!!

이 모든걸 다음것이 다음이다.

클래스 기반의 두 가지 객체생성 방법

우리는 지금 막 두 개의 클래스를 정의 하였는데, 객체를 생성하지 않고, 이 두 클래스 안에 존재하는 변수에 접근하고 함수를 호출 하는 것이 가능할까??

언뜻 가능해보이지만 불가능하다!
이들은 "실체"가 아닌 "틀"이다.
따라서 접근도 호출도 불가능하다.

그러므로 이제 우리가 해야할 일은
정의한 클래스를 실체화 시키는 것이다.
즉, 객체화시키는 것이다!!!

다음은 C++에서 객체화 시키는 방법이다.

이는 기본 자료형 변수의 선언방식과 동일함을 보이는 것이니 당황할 필요 없다!!!

사과장수 시뮬레이션 완성

그럼 코드를 구현해보자 !

#include <iostream>
using namespace std;

class FruiteSeller // 과일판매 아재
{
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 SaleApples(int money)
    {
        int num = money/APPLE_PRICE;
        numOfApples -= num;
        myMoney+=money;
        return num;
    }
    void ShowSalesResult()
    {
        cout<<"남은 사과 : "<<numOfApples<<endl;
        cout<<"판매 수익 : "<<myMoney<<endl<<endl;
    }
};

class FruiteBuyer
{
    int myMoney; // pirvate:
    int numOfApples; // pricate
    
public:
    void InitMemebrs(int money)
    {
        myMoney = money;
        numOfApples = 0;
    }
    void BuyApples(FruiteSeller &seller, int money)
    {
        numOfApples += seller.SaleApples(money);
        myMoney -= money;
    }
    void ShowBuyResult()
    {
        cout<<"현재 잔액 : "<<myMoney<<endl;
        cout<<"사과 개수 : "<<numOfApples<<endl<<endl;
    }
};

int main(void)
{
    FruiteSeller seller;
    seller.InitMembers(1000, 20, 0);
    FruiteBuyer buyer;
    buyer.InitMemebrs(5000);
    buyer.BuyApples(seller, 2000); // 과일 구매!
    
    cout<<" 과일 판매자의 현황 "<<endl;
    seller.ShowSalesResult();
    cout<<"과일 구매자의 현황 "<<endl;
    buyer.ShowBuyResult();
    
    return 0;
}

객체간의 대화 방법

numOfApples += seller.SaleApples(money);

이 문장은
현실세계에서 다음과 같다

"seller 아재요, 사과 2000원 어치만 주이소"

!!!!
이는 !!!

"나"라는 객체가 "과일장수"라는 객체로부터 "과일" 객체를 구매하는 행위도 그대로 표현 할 수 있다.

이 처럼 하나의 객체가 다른 하나의 객체에게 메시지를 전달하는 방법은 함수호출을 기반으로 한다.

그렇기에
이러한 형태의 함수호출을 가리켜 "메시지 전달"이라 한다.

좋은 웹페이지 즐겨찾기