Skip to content

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() {
        this->name_ = "조선 예종 이황";
    }

    string GetName() const {
        return this->name_;
    }
};

int main() {
    KingInfo king_info;

    cout << king_info.GetName() << endl;

    return 0;
}
#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_;
}
조선 성종 이혈
조선 연산군 이융
연산군 즉위연도: 1494


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;
}
Class1: 0, 0,
Class2: 0, 1.00938e-320,
Class3: 0, 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;
}
10, 20, 3, 나운: 문자명왕 이름


6. 클래스 소멸자 정의

#include <iostream>
using namespace std;

class TempClass {
   public:
    TempClass() {
        cout << "생성자 호출" << endl;
    }
    ~TempClass() {
        cout << "소멸자 호출" << endl;
    }
};

int main() {
    TempClass *temp_class = new TempClass();

    delete temp_class;
    temp_class = nullptr;

    return 0;
}
생성자 호출
소멸자 호출


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 클래스

#include <iostream>
using namespace std;

static class Calculator {
   public:
    int Plus(const int x, const int y) const {
        return x + y;
    }
} calc;

int main() {
    cout << "1 + 2 = " << calc.Plus(1, 2) << endl;

    return 0;
}
1 + 2 = 3


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;
}
선조의 아들 광해군
선조 즉위 연도 1567년


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;
}
고조선 단군왕검 즉위 연도 BC: 2333
고려 충혜왕 즉위 연도 BC: 1330


12. 클래스 상속 Has-A 관계

#include <iostream>
using namespace std;

class Rent {
   public:
    void Payment() { cout << "임대료를 받습니다." << endl; }
};

class Landload : public Rent {
   public:
    void GetMoney() {
        cout << "건물주라서 ";
        this->Payment();
    }
};

int main() {
    Landload master = Landload();

    master.GetMoney();

    return 0;
}
건물주라서 임대료를 받습니다.


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;
}
아단성 전투 연도: 590


17. 멤버 함수 오버라이딩

#include <iostream>
using namespace std;

class Base {
   public:
    void Display() { cout << "고려 16대왕 예종" << endl; }
};

class Derived : public Base {
   public:
    void Display() { cout << "고려 17대왕 인종" << endl; }
};

int main() {
    Derived child = Derived();

    child.Display();

    return 0;
}
고려 17대왕 인종