본문 바로가기

강의자료/C/C++

045. 연습문제 - 예금계좌 클래스를 만들어보자.


◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


예금계좌를 나타내는 클래스를 만들어보자.
/*
>> Account클래스를 아래와 같은 규칙으로 작성하시오.
- 고객아이디를 나타내는 int형 변수 id와 고객의 예치금을 나타내는 double형 변수 balance를 작성하고 모두 private으로 설정한다.
- 기본 생성자는 없으며, int와 double을 입력받아 id와 balance를 초기화하는 생성자만든다. 단, 리스트 초기화를 이용하여 초기화한다. 또한 double입력은 디폴트값으로 0이 입력되도록 한다.
- double을 입력받아 balance값에 더하는 입금함수 deposit을 만든다.
- deposit함수는 0원이상의 금액을 입금받아야하며 입금 후 금액을 화면에 출력하도록 한다.
- double을 입력받아 balance값에서 빼는 출금함수 withdraw를 만든다.
- withdraw함수가 받는 입력값은 0원이상이어야 하며 출금 후 금액이 마이너스가 될 경우 출금을 취소한다. 출금 후 금액이 마이너스가 되지 않을 경우에는 정상적으로 출금을 하며, 출금 후 금액을 화면에 출력하도록 한다.
- 고객의 아이디를 리턴하는 getId함수를 작성하되 멤버변수를 변경하지 못하도록 설정한다.
- 고객의 예치금을 리턴하는 getBalance함수를 작성하되 멤버변수를 변경하지 못하도록 설정한다.
- cout으로 예치금을 출력할 수 있도록 출력연산자를 오버로드한다.
*/

#include  
using namespace std;

class Account
{
private:
	int id;
	double balance;
public :
	Account(int _id, double _balance=0.0)
		: id(_id), balance(_balance) 
	{
		cout << *this;            
	}
	~Account(){}

	int getId()const{return id;}
	double getBalance()const{return balance;}  
	void deposit(double _balance);  //저금하기 
	void withdraw(double _balance); //돈 찾기 
	friend ostream& operator << (ostream& os,const Account& acc);          
};

void Account::deposit(double _balance)
{
	if(_balance>0 )
	{
		balance += _balance ; 
		cout << *this;          
	}     
}
void Account::withdraw(double _balance)
{
	if(_balance > 0 && (balance - _balance >=0))
	{
		balance -= _balance ;
		cout << *this; //*this ->Account 자신         
	}     
} 
ostream& operator << (ostream& os,const Account& acc)
{
	os << "고객 " << acc.id << "님의 저축액은 " << acc.balance << "원 입니다." << endl;
	return os;
}

int main()
{
	Account acc(10000123);
	acc.deposit(2000); //+2000
	acc.deposit(2000); //+2000
	acc.withdraw(6000);//찾기 실패 -> 출력 안됨  
	acc.withdraw(2000);//-2000
	Account acc2(20000125, 1000);
	acc2.deposit(3000); //+3000
	acc2.deposit(2000); //+2000
	
	return 0;
}

/*
>> Account클래스를 아래와 같이 수정하시오.
(1) 현재 날짜 및 시간을 출력하는 dates함수를 작성하시오.
	- dates함수는 통장개설시 ' ', 입금시 '+', 출금시 '-'와 같은 캐릭터를 입력으로 받아 날짜를 출력하기 전에 먼저 출력하도록 한다.
	- dates함수는 클래스 내부에서만 사용되도록 하시오.

** 현재 시간 구하기 **
#include 
#include 

using namespace std;

int main()
{
	time_t now=time(NULL);  //시간을 구하기 위한 초기화        
	tm t;
	localtime_s(&t, &now); //현재 시간 구하기  
	cout << "년 : " << t.tm_year+1900 << endl;
	cout << "월 : " << t.tm_mon+1 << endl;
	cout << "일 : " << t.tm_mday << endl;
	cout << "시 : " << t.tm_hour << endl;
	cout << "분 : " << t.tm_min << endl;
	cout << "초 : " << t.tm_sec << endl;

	return 0;
}
*/

#include  
#include 
using namespace std;

class Account
{
private:
	int id;
	double balance;
	void dates(char c);//[년/월/일  시간:분:초]

public :
	Account(int _id, double _balance=0.0)
		: id(_id), balance(_balance) 
	{
		dates(' ');  //저금한 시간
		cout << *this;            
	}
	~Account(){}

	int getId()const{return id;}
	double getBalance()const{return balance;}  
	void deposit(double _balance);  //저금하기 
	void withdraw(double _balance); //돈 찾기 
	friend ostream& operator << (ostream& os,const Account& acc);          
};

void Account::dates(char c) //[년/월/일  시간:분:초]
{ 
	time_t now=time(NULL);  //시간을 구하기 위한 초기화        
	tm t;
	localtime_s(&t, &now); //현재 시간 구하기
	cout << c << "[" << (t.tm_year+1900) << "/" << (t.tm_mon+1) << "/"
		 << (t.tm_mday) << "/  " << (t.tm_hour) << ":"
		 << (t.tm_min) << ":" << (t.tm_sec) << "]";
}

void Account::deposit(double _balance)
{
	if(_balance > 0 )
	{
		balance += _balance;
		dates('+');  //저금한 시간
		cout << *this;          
	}     
}
void Account::withdraw(double _balance)
{
	if(_balance > 0 && (balance - _balance >=0))
	{
		balance -= _balance;
		dates('-');  //저금한 시간  
		cout << *this; //*this ->Account 자신         
	}     
} 
ostream& operator << (ostream& os,const Account& acc)
{
	os << "고객 " << acc.id << "님의 저축액은 "
		 << acc.balance << "원 입니다." << endl;
	return os;
}

int main()
{
	Account acc(10000123);
	acc.deposit(2000); //+2000
	acc.deposit(2000); //+2000
	acc.withdraw(6000);  //찾기 실패 -> 출력 안됨  
	acc.withdraw(2000);//-2000
	Account acc2(20000125, 1000);
	acc2.deposit(3000); //+3000
	acc2.deposit(2000); //+2000
	
	return 0;
}

/*
>> Account클래스를 아래와 같이 수정하시오.
(1) +=연산자를 이용하여 입금할 수 있도록 연산자오버로딩을 하시오.
(2) -=연산자를 이용하여 출금할 수 있도록 연산자오버로딩을 하시오.
(3) +=과 -=연산자를 이용하여 입출금 시, 기존의 deposit과 withdraw함수와 동일한 규칙을 가지되, 
	입출금에 실패할 경우 '?'머리말과 함께 실패 메시지를 화면에 출력하시오.
(4) 고객의 아이디가 서로 같은지를 비교하는 ==와 !=연산자를 오버로딩하시오.
*/

#include  
#include 
using namespace std;

class Account
{
private:
	int id;
	double balance;
	void dates(char c);//[년/월/일  시간:분:초]

public :
	Account(int _id, double _balance=0.0)
		: id(_id), balance(_balance) 
	{
		dates(' ');  //저금한 시간
		cout << *this;            
	}
	~Account(){}

	int getId()const{return id;}
	double getBalance()const{return balance;}  
	bool deposit(double _balance);  //저금하기 
	bool withdraw(double _balance); //돈 찾기 
	friend ostream& operator << (ostream& os,const Account& acc);

	Account& operator +=(double _balance);  
	Account& operator -=(double _balance); 
	bool operator ==(const Account& acc); 
	bool operator !=(const Account& acc);
};

Account& Account::operator +=(double _balance)
{
	if(deposit(_balance) == false )
	{
		dates('?');  //입금실패 
		cout << "입금에 실패했습니다." << endl;  
	}
	return *this;
}
Account& Account::operator -=(double _balance)
{
	if(withdraw(_balance) == false)
	{
		dates('?');  //출금실패 
		cout << "출금에 실패했습니다." << endl;
	}      
	return *this;
}
bool Account::operator ==(const Account& acc)
{
	return (id==acc.getId());  
} 
bool Account::operator !=(const Account& acc)
{
	return (id!=acc.getId());     
} 

void Account::dates(char c) //[년/월/일  시간:분:초]
{ 
	time_t now=time(NULL);  //시간을 구하기 위한 초기화        
	tm t;
	localtime_s(&t, &now); //현재 시간 구하기
	cout << c << "[" << (t.tm_year+1900) << "/" << (t.tm_mon+1) << "/"
		 << (t.tm_mday) << "/  " << (t.tm_hour) << ":"
		 << (t.tm_min) << ":" << (t.tm_sec) << "]";
}

bool Account::deposit(double _balance)
{
	if(_balance > 0 )
	{
		balance += _balance;
		dates('+');  //저금한 시간
		cout << *this;

		return true;
	}

	return false;
}
bool Account::withdraw(double _balance)
{
	if(_balance > 0 && (balance - _balance >=0))
	{
		balance -= _balance;
		dates('-');  //저금한 시간  
		cout << *this; //*this ->Account 자신

		return true;
	}

	return false;
} 
ostream& operator << (ostream& os,const Account& acc)
{
	os << "고객 " << acc.id << "님의 저축액은 "
		 << acc.balance << "원 입니다." << endl;
	return os;
}

int main()
{
	Account acc(10000123);
	acc+=2000;
	acc+=2000;
	acc-=6000; // 출금 실패
	acc-=2000;

	Account *acc2=new Account(20000125, 1000);
	Account *acc3=new Account(20000127, 2000);
	*acc2+=5000;
	*acc2-=2000;
	*acc2+=-2000; // 입금 실패
	acc3->deposit(500);
	acc3->deposit(1000);
	
	//같은 고객인가? 
	cout << (acc==*acc2) << endl;  //false
	cout << (acc!=*acc2) << endl;  //true

	delete acc2;  //소멸 
	delete acc3;  //소멸  
	
	return 0;
}