C++ Exspresso 제 5 장클래스의기초
이번장에서학습할내용 클래스와객체 객체의일생 메소드 필드 UML 직접클래스를작성해봅시다.
QUIZ 1. 객체는 속성과 동작을가지고있다. 2. 자동차가객체라면클래스는 설계도이다. 먼저앞장에서학습한클래스와객체의개념을복습해봅시다.
1. 클래스의구성 클래스 (class) 는객체의설계도라할수있다. 클래스는멤버변수와멤버함수로이루어진다. 멤버변수는객체의속성을나타낸다. 멤버함수는객체의동작을나타낸다.
추상화 추상화는많은특징중에서문제해결에필요한것만을남기고나머지는전부삭제하는과정이다.
클래스정의의예 class Car public: // 멤버변수선언 int speed; // 속도 int gear; // 기어 string color; // 색상 // 멤버함수선언 void speedup() // 속도증가멤버함수 speed += 10; 멤버변수정의! 멤버함수정의! ; void speeddown() // 속도감소멤버함수 speed -= 10;
객체 int 타입의변수를선언하는경우 int i; 클래스도타입으로생각하면된다. Car 타입의변수를선언하면객체가생성된다. Car mycar;
객체의사용 객체를이용하여멤버에접근할수있다. 이들멤버변수에접근하기위해서는도트 (.) 연산자를사용한다. mycar.speed = 100; mycar.speedup(); mycar.speeddown();
예제 #include <iostream> #include <string> using namespace std; class Car public: // 멤버변수선언 int speed; // 속도 int gear; // 기어 string color; // 색상 // 멤버함수선언 void speedup() // 속도증가멤버함수 speed += 10; ; void speeddown() // 속도감소멤버함수 speed -= 10;
예제 int main() Car mycar; mycar.speed = 100; mycar.gear = 3; mycar.color = "red"; mycar.speedup(); mycar.speeddown(); return 0;
여러개의객체생성 #include <iostream> #include <string> using namespace std; class Car public: ; int speed; // 속도 int gear; // 기어 string color; // 색상 void speedup() // 속도증가멤버함수 speed += 10; void speeddown() // 속도감소멤버함수 speed -= 10; void show() // 상태출력멤버함수 cout << "============== " << endl; cout << " 속도 : " << speed << endl; cout << " 기어 : " << gear << endl; cout << " 색상 : " << color << endl; cout << "============== " << endl;
예제 int main() Car mycar, yourcar; mycar.speed = 100; mycar.gear = 3; mycar.color = "red"; yourcar.speed = 10; yourcar.gear = 1; yourcar.color = "blue"; mycar.speedup(); yourcar.speedup(); speed 100 gear 3 color red mycar speed 10 gear 1 color blue yourcar mycar.show(); yourcar.show(); return 0;
예제 ============== 속도 : 110 기어 : 3 색상 : red ============== ============== 속도 : 20 기어 : 1 색상 : blue ==============
객체의동적생성 객체도 new 와 delete 를사용하여서동적으로생성, 반환할수있다. Car *dyncar = new Car; dyncar->speed = 100; dyncar->speedup();... delete dyncar; // 동적객체생성 // 동적객체사용 // 동적객체사용 // 동적객체삭제
중간점검문제 1. 객체들을만드는설계도에해당되는것이 이다. 2. 클래스선언시에클래스안에포함되는것은 과 이다. 3. 객체의멤버에접근하는데사용되는연산자는 이다. 4. 강아지를나타내는클래스를작성하여보라. 강아지의이름, 종, 색깔등을멤버변수로지정하고짖기, 물기, 먹기등의멤버함수를정의하여보라. 5. 동적메모리할당을이용하여서 othercar 를생성하는문장을쓰시오. 6. 객체포인터 p 를통하여 getspeed() 멤버함수를호출하는문장을쓰시오.
2. 접근제어
전용멤버와공용멤버 전용멤버 (private member) 비공개멤버 클래스내부에서만접근이허용 공용멤버 (public member) 공개멤버 공용멤버는다른모든클래스들이사용가능
private 와 public class Car // 멤버변수선언 int speed; // 속도 int gear; // 기어 string color; // 색상 int main() Car mycar; mycar.speed = 100; // 오류! 아무것도지정하지않으면디폴트로 private 객체를통해직접접근할수없다!!!
private 와 public class Car public: int speed; // 속도 int gear; // 기어 string color; // 색상 다른지정자가나오기전까지 public int main() Car mycar; mycar.speed = 100; // OK!
private 와 public class Car public: int speed; private: int gear; string color; // 공용멤버 // 전용멤버 // 전용멤버
예제 #include <iostream> #include <string> using namespace std; class Employee string name; // private 로선언 int salary; // private 로선언 int age; // private 로선언 // 직원의월급을반환 int getsalary() return salary; public: // 직원의나이를반환 int getage() return age; // 직원의이름을반환 string getname() return name; ; int main() Employee e; e.salary = 300; // 오류! private 변수 e.age = 26; // 오류! private 변수 int sa = e.getsalary(); // 오류! private 멤버함수 string s = e.getname(); // OK! int a = e.getage(); // OK
멤버변수 멤버변수 : 클래스안에서그러나멤버함수외부에서정의되는변수 class Date public: void printdate() cout << year << "." << month << "." << day << endl; int getday() return day; // 멤버변수선언 int year; string month; int day;
중간점검문제 1. 접근제어지시어인 private 와 public 을설명하라. 2. 아무런접근제어지시어를붙이지않으면어떻게되는가?
3. 접근자와설정자 접근자 (accessor): 멤버변수의값을반환 ( 예 ) getbalance() 설정자 (mutator): 멤버변수의값을설정 ( 예 ) setbalance();
예제 class Car private: // 멤버변수선언 int speed; // 속도 int gear; // 기어 string color; // 색상... public: // 접근자선언 int getspeed() return speed; // 설정자선언 void setspeed(int s) speed = s;
예제 // 접근자선언 int getgear() return gear; // 변경자선언 void setgear(int g) gear = g; // 접근자선언 string getcolor() return color; // 변경자선언 void setcolor(string c) color = c; ;
접근자와설정자의장점 설정자의매개변수를통하여잘못된값이넘어오는경우, 이를사전에차단할수있다. 멤버변수값을필요할때마다계산하여반환할수있다. 접근자만을제공하면자동적으로읽기만가능한멤버변수를만들수있다. void setspeed(int s) if( s < 0 ) speed = 0; else speed = s;
중간점검문제 1. 접근자와설정자함수를사용하는이유는무엇인가? 2. 강아지 ( 종, 나이, 몸무게 ) 를클래스로모델링하고각멤버변수에대하여접근자와설정자를작성하여보라.
4. 멤버함수의외부정의
내부정의와외부정의의차이 멤버함수가클래스내부에서정의되면자동적으로인라인 (inline) 함수가된다. 멤버함수가클래스외부에정의되면일반적인함수와동일하게호출한다.
예제 #include <iostream> using namespace std; class Car public: int getspeed(); void setspeed(int s); void honk(); private: int speed; ; // 속도 int Car::getSpeed() return speed; void Car::setSpeed(int s) speed = s;
예제 void Car::honk() cout << " 빵빵!" << endl; int main() Car mycar; mycar.setspeed(80); mycar.honk(); cout << " 현재속도는 " << mycar.getspeed() << endl; return 0; 빵빵! 현재속도는 80 계속하려면아무키나누르십시오...
클래스선언과구현의분리 클래스의선언과구현을분리하는것이일반적
예제 car.h class Car public: int getspeed(); void setspeed(int s); void honk(); private: int speed; ; // 속도 클래스를선언한다.
예제 car.cpp #include <iostream> #include "car.h" using namespace std; int Car::getSpeed() return speed; void Car::setSpeed(int s) speed = s; void Car::honk() cout << " 빵빵!" << endl; 클래스를정의한다.
예제 main.cpp #include <iostream> #include "car.h" // 현재위치에 car.h 를읽어서넣으라는것을의미한다. using namespace std; int main() Car mycar; mycar.setspeed(80); mycar.honk(); cout << " 현재속도는 " << mycar.getspeed() << endl; return 0; 클래스를사용한다.
5. 멤버함수의중복정의 멤버함수도중복정의 ( 오버로딩 :Overloading) 가가능함 class Car private: int speed; int gear; string color; // 색상 public: int getspeed(); void setspeed(int s); void setspeed(double s); ; // 속도 // 기어 함수의중복시함수이름이같지만함수의 signature( 매개변수의개수, 자료형 ) 는반드시달라야한다!!!
멤버함수의중복정의 int Car::getSpeed() return speed; void Car::setSpeed(int s) speed = s; void Car::setSpeed(double s) speed = (int)s; int main() Car mycar; mycar.setspeed(80); mycar.setspeed(100.0); 멤버함수중복정의 cout << " 차의속도 : " << mycar.getspeed() << endl; return 0;
6. 자동차경주예제 간단한자동차게임을작성 두대의자동차를생성하여서속도를 0 에서 199 사이의난수로설정 속도가빠른자동차가무조건경주에서이긴다고가정
예제 #include <iostream> #include <string> using namespace std; class Car private: int speed; int gear; string color; public: int getspeed(); void setspeed(int s); int getgear(); void setgear(int g); string getcolor(); void setcolor(string c); // 속도 // 기어 // 색상 // 외부에서정의 ; void speedup(); void speeddown(); void init(int s, int gear, string c); void show();
예제 int Car::getSpeed() return speed; void Car::setSpeed(int s) speed = s; int Car::getGear() return gear; void Car::setGear(int g) gear = g; string Car::getColor() return color; void Car::setColor(string c) color = c; void Car::speedUp() // 속도증가멤버함수 speed += 10;
예제 void Car::speedUp() // 속도증가멤버함수 speed += 10; void Car::speedDown() // 속도감소멤버함수 speed -= 10; void Car::init(int s, int g, string c) speed = s; gear = g; color = c; void Car::show() cout << "============== " << endl; cout << " 속도 : " << speed << endl; cout << " 기어 : " << gear << endl; cout << " 색상 : " << color << endl; cout << "============== " << endl;
예제 int main() Car car1, car2; car1.init(rand() % 200, 1, "red"); car1.show(); car2.init(rand() % 200, 1, "red"); car2.show(); if( car1.getspeed() > car2.getspeed() ) cout << "car1 이승리하였습니다 " << endl; else cout << "car2 가승리하였습니다 " << endl; ============== 속도 : 41 기어 : 1 색상 : red ============== ============== 속도 : 67 기어 : 1 색상 : blue ============== car2 가승리하였습니다 return 0;
중간점검문제 1. 멤버함수안에서 private 멤버변수를사용할수있는가? 2. 멤버함수는클래스의외부에서정의될수있는가? 3. 멤버함수는별도의소스파일에서정의될수있는가?
UML UML(Unified Modeling Language): 애플리케이션을구성하는클래스들간의관계를그리기위하여사용 Is_A use use 클래스 + public, - private
클래스와클래스의관계
Television -ison -volume -channel +setchannel() +getchannel() +setvolume() +getvolume() +turnon() +turnoff() +tostring()
구조체 구조체 (structure) = 클래스 struct BankAccount // 은행계좌 int accountnumber; // 계좌번호 int balance; // 잔액을표시하는변수 double interest_rate; // 연이자 double get_interrest(int days) return (balance*interest_rate)*((double)days/365.0); ; 모든멤버가디폴트로 public 이된다.
예제 (Desk Lamp)
예제 (Desk Lamp) #include <iostream> #include <string> using namespace std; class DeskLamp private: // 인스턴스변수정의 bool ison; // 켜짐이나꺼짐과같은램프의상태 public: ; // 멤버함수선언 void turnon(); // 램프를켠다. void turnoff(); // 램프를끈다. void print(); // 현재상태를출력 void DeskLamp::turnOn() ison = true;
예제 (Desk Lamp) void DeskLamp::turnOff() ison = false; void DeskLamp::print() cout << " 램프가 " << (ison == true? " 켜짐 " : " 꺼짐 ") << endl; int main() // 객체생성 DeskLamp lamp; // 객체의멤버함수를호출하려면도트연산자인. 을사용한다. lamp.turnon(); lamp.print(); lamp.turnoff(); lamp.print(); return 0; 램프가켜짐램프가꺼짐
예제 (BankAccount) 은행계좌
예제 #include <iostream> #include <string> using namespace std; class BankAccount private: int accountnumber; string owner; int balance; // 은행계좌 // 계좌번호 // 예금주 // 잔액을표시하는변수 public: ; void setbalance(int amount); // balance에대한설정자 int getbalance(); // balance에대한접근자 void deposit(int amount); // 저금함수 void withdraw(int amount); // 인출함수 void print(); // 현재상태출력 void BankAccount::setBalance(int amount) balance = amount;
예제 int BankAccount::getBalance() return balance; void BankAccount::deposit(int amount) balance += amount; void BankAccount::withdraw(int amount) balance -= amount; void BankAccount::print() cout << " 잔액은 " << balance << " 입니다." << endl; int main() BankAccount account; account.setbalance(0); account.deposit(10000); account.print(); account.withdraw(8000); account.print(); return 0; 잔액은 10000 입니다. 잔액은 2000 입니다.
예제 (Date) 날짜 1
예제 (Date) #include <iostream> #include <string> using namespace std; class Date private: int year; int month; int day; public: int getyear(); void setyear(int y); int getmonth(); void setmonth(int m); void setday(int d); int getday(); void print(); ; int Date::getYear() return year;
예제 (Date) void Date::setYear(int y) year = y; int Date::getMonth() return month; void Date::setMonth(int m) month = m; int Date::getDay() return day; void Date::setDay(int d) day = d; void Date::print() cout << year << " 년 " << month << " 월 " << day << " 일 " << endl; int main() Date date; date.setyear(2010); date.setmonth(1); date.setday(20); date.print(); return 0; 2010 년 1 월 20 일
예제 (Product) 상품
예제 #include <iostream> #include <string> using namespace std; class Product private: int id; string name; int price; public: void input(); void print(); bool ischeaper(product other); ; void Product::input() cout << " 상품의일련번호 : "; cin >> id; cout << " 상품의이름 : "; cin >> name; cout << " 상품의가격 : "; cin >> price;
예제 void Product::print() cout << " 상품번호 " << id << endl << " 상품의이름 : " << name << " 상품의가격 : " << price << endl; bool Product::isCheaper(Product other) if( price < other.price ) return true; else return false;
예제 int main() Product p1, p2; p1.input(); p2.input(); if( p1.ischeaper(p2) ) p1.print(); cout << " 이더쌉니다 \n"; else p2.print(); cout << " 이더쌉니다 \n"; return 0; 상품의일련번호 : 1 상품의이름 : 모니터상품의가격 : 100000 상품의일련번호 : 2 상품의이름 : 컴퓨터상품의가격 : 20000000 상품번호 1 상품의이름 : 모니터상품의가격 : 100000 이더쌉니다
Exercise 8. 다음은영화를나타내는 Movie 클래스이다. 질문에답하라. class Movie string title; string director; string actors; 1) UML // 영화제목 // 감독 // 배우
2) 각멤버변수에대한접근자와설정자를작성하라. string gettitle() return title; string getdirector() return director; string getactors() return actors; void settitle(string m_t) title = m_t; void setdirector(string m_d) director = m_d; void setactors(string m_a) actors = m_a;
3) 추가할수있는멤버변수와멤버함수를추가하라. string grade; // 등급 string genre; // 장르 4) C++ 로작성하라. 5) 객체 title 속성을 transformer 로변경하라. 6) Movie 객체를세개작성하라. 각각의값을멤버함수를이용하여 변경하라. 7) Movie 객체의내용을출력하는 show() 멤버함수를작성하고, Show() 함수호출을통해객체를출력하라.
Programming 4. Employee 클래스작성. - 직원이름 - 전화번호 - 연봉 접근자와설정자를작성하라. Employee 객체를생성하고출력하라.
Programming 8. 본문의 BankAccount 클래스에서송금하는멤버함수를추가한 다음검사하는프로그램을작성하라. int BankAccount::transfer(int amount, BankAccount otheraccount)
int main() BankAccount account, account1; account.setbalance(0); account1.setbalance(0); account.deposit(100000); account1.deposit(1000); cout<<" 계좌 1의잔액은 >> "; account.print(); cout<<" 계좌 2의잔액은 >> "; account1.print(); cout<<" 계좌 1의잔액은 >> "; account.withdraw(8000); account.print(); cout<<"-> 계좌 1에서 2000원을계좌 2로이체하기 "<<endl; cout<<" 계좌 1에이체한후잔액은 : "<<account.transfer(2000, account1)<<endl; return 0;
Q & A