※ 아 이건 문제가 좀 거지 같네요. Virtual 함수 쓰는 법 연습인 건 알겠지만, 문제 정의도 별로고... 실제 테스트 시나리오도 너무 부실하게 기술되어 있고... 좀더 문제가 이해하기 쉬웠으면 좋겠습니다. 

결국, 제 맘대로 해버렸다는... <iostream> 에서 cout으로 출력할 대, float 계산 결과의 소수점 맞추는 것도 마음에 안드네요. 이건 c의 stdio의 fprinf 같은 것 이용해야 깔끔합니다. 

● BankAcct.h
#ifndef __BACKACCT_H__
#define __BACKACCT_H__

#include <iostream>
#include <string>

class BankAcct
{
	protected:
		int money;

	public:
		BankAcct();
		~BankAcct();

		void deposit(int v_money);
		int withdraw(void);

		virtual float getInterest(void) = 0;
};
#endif




●BankAcct.cpp
#include "BankAcct.h"

BankAcct::BankAcct()
{
	/* do nothing */
}

BankAcct::~BankAcct()
{
	/* do nothing */
}

void BankAcct::deposit(int v_money)
{
	money += v_money;

	return;
}

int BankAcct::withdraw(void)
{
	float temp = money;

	money = 0;

	return temp;
}



●Accounts.h
#ifndef __ACCOUNTS_H__
#define __ACCOUNTS_H__

#include "BankAcct.h"

class SavingAcct:public BankAcct
{
	private:

	public:
		SavingAcct();
		~SavingAcct();
		virtual float getInterest(void);
};

class CheckingAcct:public BankAcct
{
	private:

	public:
		CheckingAcct();
		~CheckingAcct();
		float getInterest(void);
};
#endif



●Acounts.cpp
#include "Accounts.h"

SavingAcct::SavingAcct()
{
	money = 0;
}

SavingAcct::~SavingAcct()
{
	/* do nothing */
}

float SavingAcct::getInterest(void)
{
	return 0.09;
}

CheckingAcct::CheckingAcct()
{
	money = 0;
}

CheckingAcct::~CheckingAcct()
{
	/* do nothing */
}

float CheckingAcct::getInterest(void)
{
	/* do nothing */
	return 0.05;
}




●main.h
#include <iostream>
#include <iomanip>
#include <string>
#include "Accounts.h"

using namespace std;



●main.cpp
#include "main.h"

int main()
{
	float s_temp=0, c_temp = 0;

	/* Create acconts */
	SavingAcct S = SavingAcct();
	CheckingAcct C = CheckingAcct();

	/* Save some money */
	S.deposit(20000);
	C.deposit(15000);

	/* Calculate interest incomes */
	s_temp = S.withdraw() * S.getInterest();
	c_temp = C.withdraw() * C.getInterest();

	cout << "Saving Account Interest Incomes : expecting : " << setw(8) << setprecision(6) << s_temp << "\n";
	cout << "Checking Account Interest Incomes : expecting : " << setw(8) << setprecision(6) << c_temp << "\n";

	/* Save more money */
	S.deposit(s_temp + 20000);
	C.deposit(c_temp + 17000);

	/* Widthraw and Calculate total incomes */
	s_temp = S.withdraw() * (1 + S.getInterest());
	c_temp = C.withdraw() * (1 + C.getInterest());

	cout << "Saving Account Total Incomes : " << setw(8) << setprecision(6) << s_temp << "\n";
	cout << "Checking Account Total Incomes : " << setw(8) << setprecision(6) << c_temp << "\n";

	return 0;
}


 


Posted by 지그프리드 지그프리드

p.339의 상속관련 예제입니다. 

● human.h

#include <iostream>
#include <string>
using namespace std;

#ifndef HUMAN_H
#define HUMAN_H

class Human
{
	protected:
		string name;
		int age;

	public:
		Human();
		Human(string name, int age);
		~Human();
		void setName(string v_name);
		string getName(void);
		void setAge(int v_age);
		int getAge(void);
		void print(void);
};

#endif

● human.cpp
#include "human.h"

Human::Human()
{
	/* Default constructor */
	cout << "Human default constructor" << "\n";
}

Human::Human(string name, int age)
{
	setName(name);
	setAge(age);	

	cout << "Human second constructor" << "\n";
}

Human::~Human()
{
	/* Do nothing */  
	cout << "Human default destructor" << "\n";
}

void Human::setName(string v_name)
{
	name = v_name;
	return;
}

string Human::getName()
{
	return name;
}

void Human::setAge(int v_age)
{
	age = v_age;
	return;
}

int Human::getAge()
{
	return age;
}

void Human::print(void)
{
	cout << "Name : " << name << "\tAge : " << age << "\n";

	return;
}

● student.h
#ifndef HUMAN_H
#include "human.h"
#endif

#ifndef STUDENT_H
#define STUDENT_H

class Student : public Human
{
	protected:
		string major;

	public:
		Student();
		Student(string name, int age, string major);
		~Student();
		void setMajor(string v_major);
		string getMajor(void);
		void print(void);
};
#endif


● student.cpp
#include "student.h"

Student::Student()
{
	/* default constructor */
	cout << "Student default constructor" << "\n";
}

Student::Student(string name, int age, string major)
{
	setName(name);
	setAge(age);
	setMajor(major);

	cout << "Student second constructor" << "\n";
}

Student::~Student()
{
	/* Do nothing */
	cout << "Student default destructor" << "\n";
}

void Student::setMajor(string v_major)
{
	major = v_major;
}

string Student::getMajor(void)
{
	return major;
}

void Student::print(void)
{
	cout << "Name : " << name << "\tAge : " << age << "\tMajor : " << major << "\n";

	return;
}

● main.cpp
#include <iostream>
#include <string>
using namespace std;

#include "human.h"
#include "student.h"

int main()
{
	Human a("춘향", 18);
	Human b("몽룡", 21);
	Human c("사또", 50);

	a.print();
	b.print();
	c.print();

	Student d("명진", 21, "컴퓨터");
	Student e("미현", 22, "경영");
	Student f("용준", 24, "전자");

	d.print();
	e.print();
	f.print();

	return 0;
}
※ 뭐 질문이 없어서, 그냥 손에 잡히는데로 하렵니다.    그나저나 구글의 소스 플러그인은 정말 보기가 좋네요. 


Posted by 지그프리드 지그프리드
Student.h
#include <iostream>
#include <string>
using namespace std;

class Student
{
	protected:
		string name;		//이름
		string id;			//학번
		string major;		//전공
		unsigned int grade;	//학년
		unsigned int credit;//학점

	public:
		Student();
		~Student();	
};

Student::Student()
{
	/* Do nothing */
}

Student::~Student()
{
	/* Do nothing */
}
graduate.h
class Graduate:private Student
{
	private:
		string assistant;	//조교
		float scholarship;	// 장학금

	public:
		Graduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_assistant, float f_scholarship);
		~Graduate();
		void print(void);
};


Graduate::Graduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_assistant, float f_scholarship)
{
	name = s_name;
	id = s_id;
	major = s_major;
	grade = i_grade;
	credit = i_credit;
	assistant = s_assistant;
	scholarship = f_scholarship;
}

Graduate::~Graduate()
{
	/* Do nothing */
}

void Graduate::print(void)
{
	cout << "이름" << " : " << name << "\n";
	cout << "학번" << " : " << id << "\n";
	cout << "전공" << " : " << major << "\n";
	cout << "학년" << " : " << grade << "\n";
	cout << "이수학점" << " : " << credit << "\n";
	cout << "조교유형" << " : " << assistant << "\n";
	cout << "장학금비율" << " : " << scholarship << "\n";
}

UnderGraduate.h
class UnderGraduate:private Student
{
	private:
		string circle;	//동아리

	public:
		UnderGraduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_circle);
		~UnderGraduate();
		void print(void);
};


UnderGraduate::UnderGraduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_circle)
{
	name = s_name;
	id = s_id;
	major = s_major;
	grade = i_grade;
	credit = i_credit;
	circle = s_circle;
}

UnderGraduate::~UnderGraduate()
{
	/* Do nothing */
}

void UnderGraduate::print(void)
{
	cout << "이름" << " : " << name << "\n";
	cout << "학번" << " : " << id << "\n";
	cout << "전공" << " : " << major << "\n";
	cout << "학년" << " : " << grade << "\n";
	cout << "이수학점" << " : " << credit << "\n";
	cout << "동아리" << " : " << circle << "\n";
}

Main.cpp
#include "student.h"
#include "under_graduate.h"
#include "graduate.h"

int main()
{
	Graduate g("홍길동","20051111","컴퓨터공학과",4, 140,"연구조교", 0.5);

	UnderGraduate u("하길동","20011111","컴퓨터공학과",2, 80,"Visaul C++");

	g.print();
	cout<<"-------------------------"<<endl;
	u.print();

	return 0;
}

PS. VS2010 문제인지, 오랬만에 해서 뭔가 헛갈리는 건지 모르겠지만... Include 중복 문제가 있어서 이 코드는 좀 우습게 되었습니다. 참고만 하세요.
Posted by 지그프리드 지그프리드
   객체 지향 방법의 최대 목표는 코드의 재사용(reuse)이다. (p.7)
 


●  객체지향의 최대 목표가 코드의 재사용일까? 실제 작업에서는 그 이점을 크게 느끼기는 어렵다. 다른 사람이 만든 코드를 라이브러리로 제공하는 것은 꼭 객체지향방법론에만 적용되는 것은 아니다. jQuery와 같이 JavaScript 같은 언어에서도 라이브러리로 함수 Set을 제공한다. 

  특히, Virtual 및 Interface를 이용한 추상함수의 경우, 함수 상속자가 각각의 함수를 재구현해야 한다. 경험한 바에 따르면, Class를 상속한다고 해서 작업량이 늘 줄어드는 것은 아니다. 

●  객체지향의 가장 큰 장점은, 오히려 각각의 객체간의 완전한 분리를 통한 수정 용이성이 아닐까? 전역변수를 철저하게 배재하고 깔끔하게 독립적으로 돌아가도록 잘 구현한 클래스는 나중에 수정이나 확장할 때도 큰 고민 없이 작업을 시작할 수 있다. 함수의 Overriding, Overloading 기능은 기존 코드를 Side effect 우려 없이 수정할 수 있도록 지원한다. C로 만든 범용 함수를 확장(ex. 함수 인자를 추가 하는 경우)하는 경우와 비교하면 이것은 정말 큰 이점이다. 
Posted by 지그프리드 지그프리드
  확실히, 개강시즌이라 그런지  "C++  Espresso 해답" 이란 검색어로 들어오는 분들이 많네요. 진도가 어디쯤인지, 과제가 어떤 식인지, 혹은 어떤 부분이 막히는지 남겨주시면 그 부분부터 볼까 합니다. 뭐 교수님도 검색해서 이 블로그를 아시겠지만... 
Posted by 지그프리드 지그프리드
  C++ 책을 졸업하고 몇년만에 다시 훝어보고 있습니다. 그동안의 짬밥이 헛된 것이 아니기를 바라며, 책의 내용에 대한 궁금증들에 대한 답을 스스로 해보려고 합니다. 우선은 Technical한 부분에 치중을 하겠지만, 중간에 재미있는 과제들이 보인다면 그에 대한 해답도 가끔 올라갈 것입니다. 

  사실, 과제 위주로 하고 싶은 마음도 크지만, 블로그에 소스코드를 보기좋게 올리는 것이 생각보다 쉽지 않아서 - Syntax highlighting이 제대로 지원되지 않아, 캡춰 후 이미지로 올려야 웹에서 보기 좋습니다 - 좀 고민이 되고 있습니다. 새로 PC를 산 뒤에 아직 빌드 환경을 깔지 않은 것이 두번째 이유 입니다. 귀찮다고 여기는건데, 영 좋지 않습니다. 

  퇴근 후 잠깐잠깐 할까 했으나, 이미 잘시간이 되어갑니다. 내일부터 할까요? 
Posted by 지그프리드 지그프리드

C++ ESPRESSO
국내도서>컴퓨터/인터넷
저자 : 천인국
출판 : 인피니티북스 2010.11.17
상세보기


   초보자를 위한, 아주 쉬운 책
 

  회사 업무 중, 주사용 프로그래밍 언어가 C에서 C++로 변경되게 되었다. 학교 졸업 후 C++을 한동안 놓고 있었기에, 복습이 필요한 시점에서 책을 사게 되었다. 이책을 고른 첫번째 이유는 가장 최근에 출간된 C++ 책이기 때문이었다. 

  저자 천인국 교수는 현직 순천향대학교의 컴퓨터공학과 교수로 계신다. 아마도 이 책은 수업교재로 쓸 것을 염두에 두고 씌여졌을 것이다. 그만큼 이 책은 매우 쉽고, 예제가 간단명료하며, 아주 깔끔하게 똑 떨어지는 느낌이다. 번역에도 큰 무리가 없고, 억지스러운 번역은 보이지 않는다. C와 C++에 이미 익숙한 사람에게는 지나치게 쉬운 책이 될 수도 있겠다. 

  다소 아쉬운 점은, 쉽게 설명하는 것에 주안점을 두다 보니, 몇몇 부분은 설명을 생략한 부분이 있고 지나치게 정형화한 부분이 있다. 사실, 이전에 나온 많은 C/C++ 책이 C언어 특유의 확장성과 자유로움을 모두 언급하려다 이도저도 아닌, 이해하기 어려운 책이 된 경우가 많은데, 이 책은 복잡한 부분을 아얘 축약하고 생략함으로써 쉽게 넘어간 것이다. 초급자에게는 오히려 이 편이 더 큰 도움이 될 수도 있겠다만, 좀 더 설명을 구할 수 있도록 참고도서 목록나 레퍼런스 사이트를 제공했으면 좋았을 것이다. 

  좋은 과제들이 아주 많이 나온다. 역시 학교 수업을 염두에 둔 것으로 보여지는데, 관련된 샘플코드 들도 공개가 되었으면 좋겠다. (아마도 Copy 우려 때문에 계속해서 미공개 상태로 남을 것 같다.) 

  이 책을 약 두 주안에 완전히 마스터 하려고 한다. 관련된 테크니컬 리뷰를 작성하고, 과제들도 재미있는 것 위주로 좀 풀어서 블로그에 올리려 한다. 아마도 개강 무렵에는 많은 사람들이 블로그를 찾기 시작하지 않을까 싶다. 

Posted by 지그프리드 지그프리드

BLOG main image
일상, 프로그래밍, IT 그리고 직장생활, Dive, 여행 by 지그프리드

카테고리

Class List (402)
Studies (30)
Exercise & Quizz (10)
Term Project (0)
ECIM list (Help!) (10)
Issues & News (0)
Gossip about IT & Job (22)
Tools (2)
Think about the Justice (23)
Book Review (170)
조엘 온 소프트웨어(번역) (28)
Diary (87)
Vacations (9)
Clash of clans 클래시 오브.. (11)

글 보관함

달력

«   2019/06   »
            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            
Total : 313,389
Today : 12 Yesterday : 11