7. 클래스
1. 클래스 정의
#include <iostream>
#include <string>
using namespace std;
class KingInfo {
private:
string name_;
public:
void SetName(string name) {
this->name_ = name;
}
string GetName() const {
return this->name_;
}
};
int main() {
KingInfo king_info;
king_info.SetName("조선 세조 이유");
cout << king_info.GetName() << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
class KingInfo {
private:
string name_;
public:
void SetName(string name);
string GetName() const;
};
int main() {
KingInfo king_info;
king_info.SetName("조선 세조 이유");
cout << king_info.GetName() << endl;
return 0;
}
void KingInfo::SetName(string name) {
this->name_ = name;
}
string KingInfo::GetName() const {
return this->name_;
}
2. 클래스 생성자 정의
#include <iostream>
#include <string>
using namespace std;
class KingInfo {
private:
string name_;
public:
KingInfo();
string GetName() const;
};
int main() {
KingInfo king_info;
cout << king_info.GetName() << endl;
return 0;
}
KingInfo::KingInfo() {
this->name_ = "조선 예종 이황";
}
string KingInfo::GetName() const {
return this->name_;
}
3. 클래스 복수 생성자 정의
#include <iostream>
#include <string>
using namespace std;
class KingInfo {
private:
string value_;
public:
KingInfo() {
this->value_ = "조선 성종 이혈";
}
KingInfo(const string value) {
this->value_ = value;
}
KingInfo(const int value) {
this->value_ = "연산군 즉위연도: ";
this->value_ += to_string(value);
}
string GetValue() const {
return this->value_;
}
};
int main() {
KingInfo king_info1 = KingInfo();
KingInfo king_info2 = KingInfo("조선 연산군 이융");
KingInfo king_info3 = KingInfo(1494);
cout << king_info1.GetValue() << endl;
cout << king_info2.GetValue() << endl;
cout << king_info3.GetValue() << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
class KingInfo {
private:
string value_;
public:
KingInfo();
KingInfo(const string value);
KingInfo(const int value);
string GetValue() const;
};
int main() {
KingInfo king_info1 = KingInfo();
KingInfo king_info2 = KingInfo("조선 연산군 이융");
KingInfo king_info3 = KingInfo(1494);
cout << king_info1.GetValue() << endl;
cout << king_info2.GetValue() << endl;
cout << king_info3.GetValue() << endl;
return 0;
}
KingInfo::KingInfo() {
this->value_ = "조선 성종 이혈";
}
KingInfo::KingInfo(const string value) {
this->value_ = value;
}
KingInfo::KingInfo(const int value) {
this->value_ = "연산군 즉위연도: ";
this->value_ += to_string(value);
}
string KingInfo::GetValue() const {
return this->value_;
}
4. 클래스 default
생성자
#include <iostream>
#include <string>
using namespace std;
class Class1 {
public:
int number_;
double prime_;
string word_;
Class1() = default;
};
class Class2 {
public:
int number_;
double prime_;
string word_;
Class2() {}
};
class Class3 {
public:
int number_;
double prime_;
string word_;
};
int main() {
Class1 *class1 = new Class1();
cout << "Class1: " << class1->number_ << ", "
<< class1->prime_ << ", " << class1->word_ << endl;
delete class1;
class1 = nullptr;
Class2 *class2 = new Class2();
cout << "Class2: " << class2->number_ << ", "
<< class2->prime_ << ", " << class2->word_ << endl;
delete class2;
class2 = nullptr;
Class3 *class3 = new Class3();
cout << "Class3: " << class3->number_ << ", "
<< class3->prime_ << ", " << class3->word_ << endl;
delete class3;
class3 = nullptr;
return 0;
}
5. 클래스 생성자 초기화 리스트
#include <iostream>
#include <string>
using namespace std;
class TempClass {
private:
int number1_ = 1;
const int number2_ = 2;
static const int number3_ = 3;
string name_ = "조다: 장수왕 아들";
public:
TempClass() : number1_(10), number2_(20), name_("나운: 문자명왕 이름") {}
void Print() {
cout << this->number1_ << ", " << this->number2_ << ", " << this->number3_ << ", " << this->name_ << endl;
}
};
int main() {
TempClass tc = TempClass();
tc.Print();
return 0;
}
6. 클래스 소멸자 정의
7. 동적 메모리 할당
#include <iostream>
using namespace std;
class Info {
private:
int *data;
int *data_arr;
public:
Info() {
cout << "생성자 호출" << endl;
this->data = new int();
this->data_arr = new int[3];
}
~Info() {
cout << "소멸자 호출" << endl;
}
void Dispose() {
delete this->data;
delete[] this->data_arr;
this->data = nullptr;
this->data_arr = nullptr;
}
int *GetData() const {
return this->data;
}
void SetData(int number) {
*(this->data) = number;
}
int *GetDataArr() const {
return this->data_arr;
}
void SetDataArr(int number1, int number2, int number3) {
(this->data_arr)[0] = number1;
(this->data_arr)[1] = number2;
(this->data_arr)[2] = number3;
}
};
int main() {
Info *info = new Info();
cout << endl
<< "== 생성자 호출 후 info->data ==" << endl;
cout << "주소: " << info->GetData() << endl;
cout << "주소의 값: " << *(info->GetData()) << endl;
cout << endl
<< "== info->data가 가리키는 주소의 값으로 123 저장 ==" << endl;
info->SetData(123);
cout << "주소: " << info->GetData() << endl;
cout << "주소의 값: " << *(info->GetData()) << endl;
cout << endl
<< "== 생성자 호출 후 info->data_arr ==" << endl;
cout << "주소: " << info->GetDataArr() << endl;
cout << "[0]의 값: " << (info->GetDataArr())[0] << endl;
cout << "[1]의 값: " << (info->GetDataArr())[1] << endl;
cout << "[2]의 값: " << (info->GetDataArr())[2] << endl;
cout << endl
<< "== info->data_arr의 각 인덱스에 1, 2, 3 저장 ==" << endl;
info->SetDataArr(1, 2, 3);
cout << "주소: " << info->GetDataArr() << endl;
cout << "[0]의 값: " << (info->GetDataArr())[0] << endl;
cout << "[1]의 값: " << (info->GetDataArr())[1] << endl;
cout << "[2]의 값: " << (info->GetDataArr())[2] << endl;
cout << endl
<< "== Dispose() 함수로 동적 메모리 해제 ==" << endl;
info->Dispose();
cout << "info->data가 가리키는 주소: " << info->GetData() << endl;
cout << "info->data_arr이 가리키는 주소: " << info->GetDataArr() << endl
<< endl;
delete info;
info = nullptr;
return 0;
}
생성자 호출
== 생성자 호출 후 info->data ==
주소: 0x600003854050
주소의 값: 0
== info->data가 가리키는 주소의 값으로 123 저장 ==
주소: 0x600003854050
주소의 값: 123
== 생성자 호출 후 info->data_arr ==
주소: 0x600003854060
[0]의 값: 0
[1]의 값: 0
[2]의 값: 0
== info->data_arr의 각 인덱스에 1, 2, 3 저장 ==
주소: 0x600003854060
[0]의 값: 1
[1]의 값: 2
[2]의 값: 3
== Dispose() 함수로 동적 메모리 해제 ==
info->data가 가리키는 주소: 0x0
info->data_arr이 가리키는 주소: 0x0
소멸자 호출
8. static
클래스
9. OOP 정보 은닉
#include <iostream>
#include <string>
using namespace std;
class KingInfo {
private:
string value_;
int number_;
public:
KingInfo() {}
void SetValue(const string value) {
if (value.empty() == false)
this->value_ = value;
else
cout << "잘못된 인자!" << endl;
}
string GetValue() const {
if (this->value_.empty() == false)
return this->value_;
else
return "설정을 먼저 해주세요.";
}
};
int main() {
KingInfo king_info1 = KingInfo();
king_info1.SetValue("조선 중종 이역");
KingInfo king_info2 = KingInfo();
king_info2.SetValue("조선 인종 이호");
// king_info1.value_ = "조선 명종 이환"; // 에러
cout << king_info1.GetValue() << endl;
cout << king_info2.GetValue() << endl;
return 0;
}
10. OOP 캡슐화
#include <iostream>
#include <string>
using namespace std;
class KingInfo {
private:
string name_;
string son_;
int ascend_;
public:
KingInfo() {}
void SetValue(const string name, const string son, int ascend) {
this->name_ = name;
this->son_ = son;
this->ascend_ = ascend;
}
string GetNameSon() const {
return this->name_ + "의 아들 " + this->son_;
}
string GetNameAscend() const {
return this->name_ + " 즉위 연도 " + to_string(this->ascend_) + "년";
}
};
int main() {
KingInfo king_info = KingInfo();
king_info.SetValue("선조", "광해군", 1567);
cout << king_info.GetNameSon() << endl;
cout << king_info.GetNameAscend() << endl;
return 0;
}
11. OOP 상속
#include <iostream>
#include <string>
using namespace std;
class Info {
public:
string name_;
int year_;
Info() {}
};
class GoodKing : public Info {
private:
string country_;
public:
GoodKing(const string country) : country_(country){};
void Display() {
cout << this->country_ << " " << this->name_
<< " 즉위 연도 BC: " << this->year_ << endl;
}
};
class BadKing : public Info {
private:
string country_;
public:
BadKing(const string country) : country_(country){};
void Display() {
cout << this->country_ << " " << this->name_
<< " 즉위 연도 BC: " << this->year_ << endl;
}
};
int main() {
GoodKing king1 = GoodKing("고조선");
king1.name_ = "단군왕검";
king1.year_ = 2333;
BadKing king2 = BadKing("고려");
king2.name_ = "충혜왕";
king2.year_ = 1330;
king1.Display();
king2.Display();
return 0;
}
12. 클래스 상속 Has-A 관계
13. 클래스 상속 Is-A 관계
#include <iostream>
using namespace std;
class Landload {
public:
void IamLandload() { cout << "건물주입니다." << endl; }
};
class Tenant {
public:
void IamTenant() { cout << "세입자입니다." << endl; }
};
class Nation : public Landload, public Tenant {
public:
bool is_landload_;
void Who() {
cout << "저는 ";
if (this->is_landload_ == true)
this->IamLandload();
else
this->IamTenant();
}
};
int main() {
Nation nation = Nation();
nation.is_landload_ = true;
nation.Who();
return 0;
}
14. 클래스 상속 Not-A 관계
#include <iostream>
using namespace std;
class Landload {
public:
void IamLandload() { cout << "건물주입니다." << endl; }
};
class MaleMonkey {
public:
void Favorite() { cout << "Favorite: Female Monkey" << endl; }
};
class Nation : public Landload {
public:
void Who() {
cout << "안녕하세요. ";
this->IamLandload();
}
};
int main() {
Nation nation = Nation();
nation.Who();
return 0;
}
15. friend
클래스
#include <iostream>
#include <string>
using namespace std;
class GoodKing;
class Info {
friend class GoodKing;
private:
string achieve_;
public:
Info() {}
};
class GoodKing : private Info {
public:
GoodKing() { this->achieve_ = "백제 중흥 근초고왕"; }
void Display() { cout << this->achieve_ << endl; }
};
class BadKing : public Info {
public:
BadKing() {}
// void Display() { cout << this->achieve_ << endl; } // 에러
};
int main() {
GoodKing king1 = GoodKing();
king1.Display();
BadKing king2 = BadKing();
// king2.Display();
return 0;
}
16. friend
함수
#include <iostream>
#include <string>
using namespace std;
class Ondal {
private:
int year_;
public:
friend void GetYear(Ondal ondal) {
cout << "아단성 전투 연도: " << ondal.year_ << endl;
}
void SetYear(int year) { this->year_ = year; }
};
int main() {
Ondal ondal = Ondal();
ondal.SetYear(590);
GetYear(ondal);
return 0;
}