티스토리 뷰

주의 사항!

  • 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.

 

지금까지는 C언어에서 C++로 자연스럽게 이동할 수 있도록 구조체를 시작으로 클래스를 설명했습니다. 그러나 이번에는 객체지향의 관점에서 전혀 다른 방법으로 클래스를 다시 한번 설명합니다. 구조체를 확장한 것이 클래스라고 인식하는 것 자체에는 문제가 없으나, 그것이 전부라고 생각하면 문제가 있기 때문입니다.

 

객체(Object)라고 하는 것은 '사물, 또는 대상'입니다. 연필, 나무, 사과, 선생님, 학생 등등을 객체라고 부를 수 있습니다.

 

C++은 객체지향 언어입니다. C언어는 절차지향적 언어입니다. 객체를 지향하는 프로그래밍이란 무엇인지 이해를 돕기 위해 다음과 같은 상황을 시뮬레이션하는 프로그램을 구현한다고 가정해보겠습니다.

 

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

 

이 문장에 들어 있는 객체는 나, 과일장수, 사과 총 3개입니다. '나'라는 객체는 '과일장수'라는 객체를 상대로 '사과'라는 객체를 구입하는 액션을 취할 수 있어야 합니다. 객체지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화시키는 형태의 프로그래밍입니다.

 

 '사과'를 제외한, '나'와 '과일장수'만 객체화하여 위 예시를 시뮬레이션하는 프로그램을 만드는 예제를 보겠습니다.

//fruitSeller.h 헤더파일로 저장
#ifndef FRUITSELLER_H
#define FRUITSELLER_H

class FruitSeller
{
private:
	int applePrice;
	int numOfApples;
	int myMoney;

public:
	void InitMembers(int price, int num, int money);
	int SaleApples(int count);
	void ShowSalesResult(void);
};

#endif
//fruitSeller.cpp 소스파일로 저장
#include "fruitSeller.h"
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

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

int FruitSeller::SaleApples(int count)
{
	int pay = applePrice * count;

	numOfApples -= count;
	myMoney += pay;

	return pay;
}

void FruitSeller::ShowSalesResult(void)
{
	cout << "남은 사과 : " << numOfApples << endl;
	cout << "현재 잔액 : " << myMoney << endl << endl;
}
//fruitBuyer.h 헤더파일로 저장
#ifndef FRUITBUYER_H
#define FRUITBUYER_H
#include "fruitSeller.h"

class FruitBuyer
{
private:
	int myMoney;
	int numOfApples;

public:
	void InitMembers(int money);
	void BuyApples(FruitSeller &seller, int count);
	void ShowBuyResult(void);
};

#endif
//fruitBuyer.cpp 소스파일로 저장
#include "fruitBuyer.h"
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

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

void FruitBuyer::BuyApples(FruitSeller& seller, int count)
{
	myMoney -= seller.SaleApples(count);
	numOfApples += count;
}

void FruitBuyer::ShowBuyResult(void)
{
	cout << "현재 잔액 : " << myMoney << endl;
	cout << "사과 개수 : " << numOfApples << endl << endl;
}
//main.cpp 소스파일로 저장
#include "fruitBuyer.h"
#include "fruitSeller.h"
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main(void)
{
	FruitSeller seller;
	FruitBuyer buyer;

	seller.InitMembers(2000, 100, 50000);
	buyer.InitMembers(100000);

	buyer.BuyApples(seller, 15);

	cout << "과일 판매자의 현황\n";
	seller.ShowSalesResult();

	cout << "과일 구매자의 현황\n";
	buyer.ShowBuyResult();

	return 0;
}

/*
실행결과

과일 판매자의 현황
남은 사과 : 85
현재 잔액 : 80000

과일 구매자의 현황
현재 잔액 : 70000
사과 개수 : 15

*/

 

위 예제는 두개의 헤더 파일과 세 개의 소스파일로 이루어져 있습니다. 클래스 FruitSeller가 하나의 헤더 파일과 하나의 소스파일에 나뉘어 선언 및 정의되었고, 클래스 FruitBuyer가 하나의 헤더파일과 하나의 소스파일에 나뉘어 선언 및 정의되었습니다.

 

생각해보면, 과일장수로부터 구매자가 사과를 구매하면, 과일장수의 보유현금과 사과 개수를 변경하는 함수와 구매자의 보유현금과 사과 개수를 변경하는 함수 두 개의 함수가 호출되어야 할 것 같습니다. 하지만 main 함수를 보면 BuyApples 함수 하나의 호출만으로 이 모든 것이 가능했습니다. 더군다나 BuyApples 함수는 구매자 객체의 멤버 함수이기 때문에

이 함수로 판매자 객체의 멤버변수까지 변경하는 것은 불가능합니다.

 

BuyApples 함수의 매개변수를 보면 판매자 객체를 참조하고 있습니다. 그리고 함수 내부를 보면 참조한 객체의 멤버 함수인 SaleApples를 호출하고 있습니다.

 

한 객체의 멤버함수 호출을 통해서 다른 객체의 멤버 함수를 호출하는 일이 발생했다는 것이 중요합니다. 이를 가리켜 하나의 객체가 다른 객체에게 메세지를 전달했다고 표현합니다. 사실 따지고 보면 그렇게 대단한 기술이 사용된 것은 아닙니다. 하지만 '객체 간 메세지 전달' 관점에서 보면 이는 매우 중요한 개념입니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함