What is Class?
์ฐ๋ฆฌ๋ ํด๋์ค๋ผ๋ ๊ฐ๋ ์ ์ ๋์ ํ์๊น? C++์์ ํจ์๊ฐ ํ์ด๋๊ฒ ๋ ์ด์ ๋ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๊ธฐ ์ํจ์ด์๋ค.
๊ทธ๋ฐ๋ฐ ํจ์๋ก ๊ณ์ํด์ ๋๋ ์ ํ๋๋ฐ ํ๊ณ๊ฐ ์ฐพ์์จ ๊ฒ! ํจ์์ ๋ค์ด๊ฐ๋ ์ ์ถ ํ๋ผ๋ฏธํฐ๊ฐ ํน์ ๋ฐ์ดํฐ ํ์ ์ ์ฐ๊ด๋์ด ํ์ํ๋ค๋ ์ฌ์ค์ ์์๋๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๋ฌผ๊ฑด์ ์๊ฐํด ๋ณด๋ฉด, ํด๋น ๋ฌผ๊ฑด(๊ฐ์ฒด)๋ ๋ฌผ๊ฑด์ ์ฉ๋์ ๋ฐ๋ผ ํ ์ ์๋ ํ๋(method)๊ฐ ์ ํด์ ธ ์๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด๋ค ๊ฐ์ฒด์ธ์ง๋ฅผ ๋ฐํ๊ณ , ๊ทธ ๊ฐ์ฒด๊ฐ ํ ์ ์๋ ํจ์๋ฅผ ์ ์ํด ๋๋ ๊ฒ์ด ๋ณด๋ค ์ค์ ์ ์ธ ์ ๊ทผ์ด๋ค.
์ด ๋ย ํด๋์คย ์ ๊ฐ๋ ์ ์ ์ด ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค๋ ์ด๋ป๊ฒ ๋ง๋ค์ง ์๊ฐํด๋์ย ์ค๊ณ๋ย ๋ผ ์๊ฐํ๋ฉด ๋๋ค.
Class ์์ฑ ๋ฐฉ๋ฒ
Member data
์ค์ ์ธ์์ ๋น์ ํ๋ฉด ๋ฌผ์ฒด๋ฅผ ๋ง๋๋ ํ์์ ํด๋นํ๋ค!
ํด๋น ํด๋์ค๋ฅผ ์ ์ธํ ๋, ๊ธฐ๋ณธ์ผ๋ก ์ด๋ค ๊ฐ์ ๊ฐ์ง๊ณ ์ ๋์์ ํ ๊ฒ์ธ์ง ์ ์ํ๋ค.
Member function
๋ฌผ์ฒด์ ๋ํ ํ๋์ ์ ์ํ๋ ๋ถ๋ถ์ด๋ค. ํจ์๋ฅผ ์ ์ธํ๋ฏ ์ ์ด์ฃผ๋ฉด ๋๋ค.
Private, public
ํด๋์ค๋ฅผ ๋ง๋๋ ํ์๋ ํน์ ๋ฌผ์ฒด์ ๋ํด ์ค๊ณ๋๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๋์ผํ๋ฏ๋ก, ์ฌ์ฉ์ ์งํฅ์ ์ด์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด ๋ฆฌ๋ชจ์ปจ์ ์ค๊ณํ๋ค๊ณ ํ์ ๋ ์ฌ์ฉ์๋ ์ ๋ ฅ ์ ํธ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฌผ๋ง ์๋ฉด๋์ง, ๊ทธ ์ค๊ฐ์ ์์ฉํ๋ ๋ค๋ฅธ ๋ณ์์ ๋ํด ์ ์ดํ ํ์๊ฐ ์๋ค.
๋ฐ๋ผ์ ํด๋์ค๋ฅผ ๋ง๋๋ ์ค๊ณ์ ์
์ฅ์์ ํด๋์ค ๋ด์์๋ง ์๋ํ๋ย private
ย ๊ตฌ๊ฐ๊ณผ ํด๋์ค ๋ฐ์์ ์ ๊ทผ๊ฐ๋ฅํย public
ย ๊ตฌ๊ฐ์ผ๋ก ๋๋ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค.
Constructor
์ฐ๋ฆฌ๊ฐ ๋ฌผ๊ฑด์ ๋ ์ฌ๋ฆฌ๋ฉด, ๋ค๋ฅธ ๋ฌผ๊ฑด๋ค์ด ์ธ์์๋ ์กด์ฌํ์ง๋ง ๊ณตํต์ ์ ๊ฐ์ง๋ค.
์๋ฅผ ๋ค์ด ๋ฆฌ๋ชจ์ปจ์ด๋ผ ํ๋ค๋ฉด, ๋ณดํต 10๊ฐ ์ ๋์ ์ซ์๋ฒํผ๊ณผ, ์ ์๋ฒํผ ์ ๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌ๋ ค์๋ ๋ชจ์ต์ ๋ ์ฌ๋ฆด ๊ฒ์ด๋ค.
์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฌ์ฉ์๊ฐ ํน์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋,ย ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ผ ํ๋ ๊ฐ์ด ์กด์ฌํ๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๊ฑธ ์ค์ ํ ์ ์๊ฒ, ํน์ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง ์ ์๊ฒ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค.
์ด๊ฒ์ย ์์ฑ์ย ๋ผ ํ๋ค.
Public
ย ๋ฐ์ ์ ์ธ์ ํ๊ณ ์ฌ์ฉํ๋๋ฐ, ์ด ๋ ์ผ๋ฐ์ ์ธ ํจ์์ ๋ชจ์๊ณผ ๋ค๋ฅด๊ฒย Output
ย ์ด ์๋ค. ๋ํ, ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค! ๊ธฐ์ตํด๋ ํ์๊ฐ ์๋ค.
Example
Example 1
#include <iostream>
using namespace std;
class Point {
// ํด๋์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ ๋ณ์๋ฅผ Member variable ์ด๋ผ ํ๋ค.
private: // x, y ๋ณ์๋ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋๊ณ , ํจ์๋ก ์ด ๋ณ์๋ฅผ ์ ์ดํ๋ ๋ฐฉํฅ์ผ๋ก ์ฝ๋ฉํ๋ ๊ฒ์ด ์ข์.
int x; // ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉ๊ฐ๋ฅ
int y;
// ํด๋์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ ํจ์๋ฅผ Member Function(Method) ์ด๋ผ ํ๋ค.
public: // ํด๋์ค ์ธ๋ถ์์๋ ์ฌ์ฉ๊ฐ๋ฅ
void setXY(int _x, int _y) {
x = _x;
y = _y;
} // pt1.x = 1 ๊ณผ ๊ฐ์ด ์ง์ ์ ์ผ๋ก ์ ๊ทผํ๊ธฐ๋ณด๋ค๋ ํจ์๋ก ๋ณ๊ฒฝ์ํจ๋ค.
// ์ด๋ ๊ฒ ํจ์๋ฅผ ์คํํด์ ๊ฐ์ ํ ๋นํด์ค๋ค.
int getX() {return x;} // ๊ฐ์ ๊ฐ์ ธ์ฌ ๋๋ ์ด๋ ๊ฒ ํจ์๋ฅผ ๋ง๋ค์ด์ ๊ฐ์ ธ์จ๋ค.
int getY() {return y;}
// ์ถ๋ ฅํ๋ ํจ์๋ ์๋ก ๋ง๋ค์ด์ค๋ค.
void print(){
cout << "(" << x << ", " << y << ")" << endl;
}
};
int main(){
Point pt1, pt2; // Point๋ผ๋ ํด๋์ค๋ก ๋ถํฐ ๊ฐ์ฒด 2๊ฐ๋ฅผ ๋ง๋ ๋ค.
// pt1.x = 1; // x, y๋ฅผ public ์์ ์ ์ธํ๋ค๋ฉด ์คํ๊ฐ๋ฅํ ์ฝ๋์ด๋ค.
// pt1.y = 2;
pt1.setXY(1, 2); // ์์ฑ๋ ๊ฐ์ฒด pt1์ ๊ฐ์ ํ ๋นํ๋ค.
cout << pt1.getX() << endl; // pt1์ x๊ฐ์ ๊ฐ์ ธ์์ ์ถ๋ ฅํ๋ค.
// cout << pt1.x << ", " << pt1.y <<endl; // public ์ผ๋ก ์ ์ธํ๋ค๋ฉด ๊ฐ๋ฅํ ์ฝ๋
pt1.print(); // pt1 ๊ฐ์ ์ถ๋ ฅํด๋ผ
pt2.print();
int temp = pt1.getX(); // ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ
cout << temp << endl;
return 0;
}
Example 2
#include <iostream>
#include <string>
using namespace std;
class Account {
private:
string name;
string id;
double balance;
public:
// constructor
// ์์ฑ์์ ์ด๋ฆ์ class์ ์ด๋ฆ๊ณผ ๊ฐ๋ค.
// output์ด ์๋ค.
// ์ด๊ธฐํ๋ฅผ ๋ด๋นํ๋ ํจ์ (์์ฑ์)
// ์๋ฌด ๊ฒ๋ ์
๋ ฅ์ด ์๋์์ ๋ ์ด๊ธฐ๊ฐ
Account():
name("์ด๊ธฐ๊ฐ์ด๋ฆ"), id(0000), balance(0){
}
// ์ฌ์ฉ์๊ฐ ํ๊ณ ์ถ์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๊ณ ์ถ์ ๋,
Account(string _name, string _id, double _bal):
name(_name), id(_id), balance(_bal){
// ์ด๊ธฐํ๊ฐ ์งํ๋ ๋ ๋์๋๋ ํจ์๊ฐ ๋ค์ด๊ฐ๋ ๊ณต๊ฐ
// ๋ง์ด๋์ค ํต์ฅํ๋ ๊ฒ ์๋๋ฏ๋ก ์๊ณ ๊ฐ ์์๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
if (balance < 0){
cout << "Error, negatice balance" << endl;
balance = 0;
}
}
// Method
// ์๊ธํ ๋,
void deposit(int _amt){
balance += _amt;
}
// ์ถ๊ธํ ๋, ์๊ณ ๋ณด๋ค ์ถ๊ธ๊ธ์ก์ด ๋ง์ผ๋ฉด false๋ฅผ ๋ฐํ
bool withdraw(int _amt){
if( balance - _amt < 0)
return false;
// ์ถ๊ธ์ด ๊ฐ๋ฅํ๋ฉด ์๊ณ ์์ ๊ฐ์ ๋นผ๊ณ true ๋ฐํ
else{
balance -= _amt;
return true;
}
}
void print(){
cout << setw(10) << name << setw(10) << id << setw(10) << balance << endl;
}
};
int main(){
Account ac1("์ต์์", "0316", 5000);
ac1.print();
ac1.deposit(2000);
ac1.print();
// ac1.withdraw(3000);
// ac1.print();
if(!ac1.withdraw(10000))
cout << "์์ก ๋ถ์กฑ" << endl;
ac1.print();
ac1.withdraw(5000);
ac1.print();
return 0;
}
Example 3
์ฌ์ฉ์์ ๊ณ์ข์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ , ์ด๋ฆ๋ณ, ์์ด๋๋ณ, ์๊ณ ๋ณ ์ ๋ ฌ์ ํด์ ์ถ๋ ฅํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์. ๋จผ์ ์ค๋ช ์ด ์ ํ ์ฝ๋๋ถํฐ ๋ณด๊ณ ๊ฐ์.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Account{
public:
std::string name;
int id;
double balance;
};
void add_account(std::vector<Account>& accts){
std::string name;
int number;
double amount;
cout << "Enter name, account number, and account balance: ";
cin >> name >> number >> amount;
Account acct;
acct.name = name;
acct.id = number;
acct.balance = amount;
accts.push_back(acct);
}
void print_accounts(const std::vector<Account>& accts){
int n = (unsigned int)accts.size();
for (int i = 0; i < n; i++)
cout << accts[i].name << ", " << accts[i].id << ", " << accts[i].balance << endl;
}
void swap(Account& er1, Account& er2){
Account temp = er1;
er1 = er2;
er2 = temp;
}
bool less_than_by_name(const Account& e1, const Account& e2){
return e1.name < e2.name;
}
bool less_than_by_id(const Account& e1, const Account& e2){
return e1.id < e2.id;
}
bool less_than_by_balance(const Account& e1, const Account& e2){
return e1.balance < e2.balance;
}
void sort(std::vector<Account>& db, bool (*comp)(const Account&, const Account&)){
// ์ฐธ์กฐ๋ณ์ db๋ก vector๋ฅผ ๊ฐ์ ธ์ค๊ณ ,
// comp๋ผ๊ณ ๋ถ๋ฅผ ํน์ ํจ์์ ์์์ฃผ์๋ฅผ bool ํฌ์ธํฐ ๋ณ์์ ๋ด๋๋ค.
// ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์์ฃผ์์ ์๋ ํจ์๋
// Account ์๋ฃํ์ ๊ฐ์ง๋ ๋ณ์๋ฅผ ์ฐธ์กฐํด์ ๊ฐ์ ธ์จ ๋
์ ๋๊ฐ๋ฅผ ์
๋ ฅ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค.
// db์ ์ด ์ฌ์ด์ฆ๋ฅผ ๋ด์ ๋๋ค. ๋ฒกํฐ์ด๋ฏ๋ก unsigned int๋ก ๋ฐ์์ฃผ์ด์ผ ํ๋ค.
int size = (unsigned int)db.size();
// 10 ํฌ๊ธฐ์ธ ๋ฐฐ์ด์ด๋ผ๋ฉด, 0~8๊น์ง i๋ ์์ง์ธ๋ค.
for(int i = 0; i < size - 1; i++){
// ๊ทธ๋ฆฌ๊ณ ํด๋น ์ธ๋ฑ์ค๊ฐ ๊ฐ์ฅ ์์ ๊ฐ์ด๋ผ ๊ฐ์ ํ๋ค.
int smallest = i;
// i์ ๋ค์ ๋ฒ์งธ๋ถํฐ ๋๊น์ง ํ๋์ฉ ๋น๊ตํ๋ค.
for (int j = i + 1; j < size; j++)
if(comp(db[j], db[smallest]))
// ๋น๊ต๋ ์ฌ์ฉ์๊ฐ ์ด๋ค ํ๋ผ๋ฏธํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น๊ตํจ์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ ธ์ผ ํ๋ค.
// ์ฌ๊ธฐ์ ํจ์ํฌ์ธํฐ๋ฅผ ์
๋ ฅ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๊ฒ์ด ํจ๊ณผ๋ฅผ ๋ฐํํ๋ค.
// ํน์ ํจ์์ ๋ํด์ ๊ฐ์ฅ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ smallest ์ธ๋ฑ์ค์ ๊ฐ๊ณผ
// ํ์ฌ j์ธ๋ฑ์ค์ ๊ฐ์ ๋น๊ตํ๋ค.
// comp์ ํ๋ณด๊ฐ ๋ ์ ์๋ ํจ์๋ค
// (less_than_by_name, less_than_by_id, less_than_by_balance)
// ์ ๋ฆฌํด ๊ฐ์ ๋ชจ๋ boolian ์ด๋ค.
// ๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ํด ๋, True ์ด๋ค.
// ๋ฐ๋ผ์ ์ด if ๋ฌธ์ด ์คํ๋๊ธฐ ์ํด์๋ ๋ด๊ฐ ์๋ค๊ณ ๊ฐ์ ํ smallest ์ธ๋ฑ์ค๊ฐ
// j ์ธ๋ฑ์ค ๋ณด๋ค ํด ๋ ์คํ๋๋ฉฐ, ์ฐ๋ฆฌ๋ smallest ์ธ๋ฑ์ค๊ฐ j๊ฐ ๋์ด์ผ ํจ์ ์ ์ ์๋ค.
smallest = j;
// ๋๋จธ์ง ๊ฒฝ์ฐ๋ smallest ์ธ๋ฑ์ค๊ฐ ์ฌ์ ํ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก ๋ด๋น๋๋ฉด ๋๋ค.
// ๋ง์ฝ์ ์์ ์กฐ๊ฑด๋ฌธ์ด ์คํ๋์๋ค๋ฉด
// smallest๊ฐ ์ด์ ์ ์ธ๋ฑ์ค์ ๋ฌ๋ผ์ก์ ๊ฒ์ด๋ค.
// ์ด๋ ์ฐ๋ฆฌ๋ ์ค์ i ์ธํ
์ค์์์ smallest ์ธ๋ฑ์ค์ ๊ฐ์ ๋ฐ๊ฟ์ค์ผ ํ๋ค.
if (smallest != i)
swap(db[i], db[smallest]);
}
}
int main(){
// ์๋ฃํ์ด Account ํด๋์ค์ธ ๋ฒกํฐ๋ฅผ ์ ์ธํ๊ณ ์ด๊ฒ์ ์ด๋ฆ์ customers๋ผ ํ์.
std::vector<Account> customers;
char cmd;
bool done = false;
do{
cout << "[A]dd [N]ame [I]D [B]alanc [Q]uit ==> ";
cin >> cmd;
switch(cmd){
case 'A':
case 'a':
add_account(customers);
break;
case 'P':
case 'p':
print_accounts(customers);
break;
// ํจ์์ด๋ฆ์ด ํฌ์ธํฐ์ด๋ฏ๋ก ํจ์์ด๋ฆ์์ฒด๋ฅผ ๋๊ฒจ์ค๋ค.
case 'N':
case 'n':
sort(customers, less_than_by_name);
print_accounts(customers);
break;
case 'I':
case 'i':
sort(customers, less_than_by_id);
print_accounts(customers);
break;
case 'B':
case 'b':
sort(customers, less_than_by_balance);
print_accounts(customers);
break;
case 'Q':
case 'q':
done = true;
break;
}
}while(!done);
}
์ด์ ์ค๋ช ์ด ์๋ ์ฝ๋์ด๋ค.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Account{
public:
std::string name;
int id;
double balance;
};
void add_account(std::vector<Account>& accts){
std::string name;
int number;
double amount;
cout << "Enter name, account number, and account balance: ";
cin >> name >> number >> amount;
Account acct;
acct.name = name;
acct.id = number;
acct.balance = amount;
accts.push_back(acct);
}
void print_accounts(const std::vector<Account>& accts){
int n = (uint32_t)accts.size();
for (int i = 0; i < n; i++)
cout << accts[i].name << ", " << accts[i].id << ", " << accts[i].balance << endl;
}
void swap(Account& er1, Account& er2){
Account temp = er1;
er1 = er2;
er2 = temp;
}
bool less_than_by_name(const Account& e1, const Account& e2){
return e1.name < e2.name;
}
bool less_than_by_id(const Account& e1, const Account& e2){
return e1.id < e2.id;
}
bool less_than_by_balance(const Account& e1, const Account& e2){
return e1.balance < e2.balance;
}
void sort(std::vector<Account>& db, bool (*comp)(const Account&, const Account&)){
int size = (uint32_t)db.size();
for(int i = 0; i < size - 1; i++){
int smallest = i;
for (int j = i + 1; j < size; j++)
if(comp(db[j], db[smallest]))
smallest = j;
if (smallest != i)
swap(db[i], db[smallest]);
}
}
int main(){
std::vector<Account> customers;
char cmd;
bool done = false;
do{
cout << "[A]dd [N]ame [I]D [B]alanc [Q]uit ==> ";
cin >> cmd;
switch(cmd){
case 'A':
case 'a':
add_account(customers);
break;
case 'P':
case 'p':
print_accounts(customers);
break;
case 'N':
case 'n':
sort(customers, less_than_by_name);
print_accounts(customers);
break;
case 'I':
case 'i':
sort(customers, less_than_by_id);
print_accounts(customers);
break;
case 'B':
case 'b':
sort(customers, less_than_by_balance);
print_accounts(customers);
break;
case 'Q':
case 'q':
done = true;
break;
}
}while(!done);
}