JiwonDev

3. Class

by JiwonDev

C1. ๊ตฌํ˜„๋ถ€์™€ ์„ ์–ธ๋ถ€

Cpp์—์„œ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ๊ตฌํ˜„๋ถ€(.cpp)์™€ ์„ ์–ธ๋ถ€(.h)๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.


#include "Person.h"

int main()
{
    Person p1;
    p1.SetPerson("ํ™๊ธธ๋™",20,true);
    p1.ShowPerson();

    return 0;
}
/*	Person.h	*/

//์—ฌ๋Ÿฌ๋ฒˆ include ๋˜๋Š”๊ฑธ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒ˜๋ฆฌ๋ฌธ์ด๋‹ค.
#ifndef PROJECT_PERSON_H // ๋ณดํ†ต '์˜์–ด_๋Œ€๋ฌธ์ž_H' ๋กœ ์ด๋ฆ„์„ ์ง“๋Š”๋‹ค.
#define PROJECT_PERSON_H

class Person
{
    private: // ์ ‘๊ทผ ์ œํ•œ์ž(๋น„๊ณต๊ฐœ)
        char* m_name;
        int m_age = 0; // c++11 ๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •(์ƒ์„ฑ์ž๊ฐ€ ์—†์„ ๋•Œ)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
        bool m_gender;
        
    public: //์ ‘๊ทผ ์ œํ•œ์ž(๊ณต๊ฐœ)
        Person(); // ๋””ํดํŠธ ์ƒ์„ฑ์ž
        ~Person(); //์†Œ๋ฉธ์ž
        void SetPerson(char* name, int age, bool gender); 
        
    	//ํ•จ์ˆ˜๋„ public ์„ ์–ธ ๊ฐ€๋Šฅ
        void ShowPerson();
};

#endif // ifndef ์ข…๋ฃŒ

 

์ฐธ๊ณ ๋กœ ๊ตฌํ˜„๋ถ€(.cpp)์—์„œ๋Š” ๊ผญ ํ•œ ํด๋ž˜์Šค๋กœ ๋‚ด์šฉ์„ ์ ์„ ํ•„์š”๋Š” ์—†๋‹ค.

๋”ฐ๋กœ ๋‚˜๋ˆ ์„œ Class:: ์œผ๋กœ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋”ฐ๋กœ ์ ์–ด์ค˜๋„ ๋œ๋‹ค.

/*	 Person.cpp 	*/

#include "Person.h" // ์„ ์–ธ๋ถ€๋ฅผ include ํ•œ๋‹ค.

Person::Person(){
}
 
Person::~Person(){
    // delete[] ๋ฐฐ์—ด์ด๋ฆ„
}
 
void Person::SetPerson(char* name, int age, bool gender){
    this->m_name = name; // ์ฐธ๊ณ ๋กœ ์ง€์—ญ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋‹ค๋ฉด this๋ฅผ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.
    this->m_age = age;
    this->m_gender = gender;
}
 
void Person::ShowPerson(){
    printf("%s, %d, ", this->m_name, this->m_age);
    
    if(this->m_gender == true)
        printf("๋‚จ์„ฑ\n");
    else
        pring("์—ฌ์„ฑ\n);
}

 

2. ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ

Class c; ์™€ Class*c = new Class(); ์˜ ์ฐจ์ด

๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ํ•˜๋‹ค์˜ค๋ฉด ํ—ท๊ฐˆ๋ฆด ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, Cpp์—์„œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ new ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”์—†๋‹ค.

์ผ๋ฐ˜ ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค.

์ผ๋ฐ˜ ์ž๋ฃŒํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ€์ˆ˜์˜ ์ƒ์„ฑ๋ฒ”์œ„(Scope)๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹น ํ•ด์ œ๋œ๋‹ค.


MyClass name; // ํ• ๋‹น์™„๋ฃŒ.
name.method() // ๋ฐ”๋กœ ์‚ฌ์šฉ

 

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  new ํ‚ค์›Œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ๋Š”, ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋™์ ํ• ๋‹น์— ์‚ฌ์šฉ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ํ• ๋‹น ํ•  ๊ฒฝ์šฐ ์ž๋ฐ”์ฒ˜๋Ÿผ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  new ์—ฐ์‚ฐ์ž์— ์˜ํ•ด ์ƒ์„ฑ์ž๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

์–ด์ฐŒ๋ณด๋ฉด ๋‹น์—ฐํ•œ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๊ธฐ์กด์˜ malloc์„ ์‚ฌ์šฉํ•˜๋Š” C์–ธ์–ด์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์œผ๋‹ˆ ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋„ ์—†์—ˆ๋‹ค.


Student *kim;
kim = new Student();
kim->showData(); // ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ํด๋ž˜์Šค ์ ‘๊ทผ (->)

์—ฌ๊ธฐ์„œ ๊ฐœ๊ฐ™์€ CPP์˜ ์žฅ์ . ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์–ธ์–ด๋ผ๋Š” ๊ฑธ ์ƒ๊ธฐ์‹œ์ผœ์ค€๋‹ค.

ํ• ๋‹น๋œ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์ œ(delete, free) ์‹œ์ผœ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ๋‚จ์•„์žˆ๊ฒŒ๋œ๋‹ค.

๋ฌผ๋ก  ์ตœ๊ทผ์˜ GCC์—๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ์–ด์„œ ์–ด๋Š์ •๋„๋Š” ํ•ด๊ฒฐํ•ด์ฃผ๊ธดํ•˜์ง€๋งŒ ํ‘œ์ค€์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ง์ ‘ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

3. ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋ผ์ด๋”ฉ


class Rectangle {
private: // ๋ช…์‹œํ•˜์ง€์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ private์ž…๋‹ˆ๋‹ค.
    int length;
    int breadth;

public:
    Rectangle() { // ์ƒ์„ฑ์ž
        length = 0;
        breadth = 0;
    }

    Rectangle(int l, int b) { // ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋ผ์ด๋”ฉ
        length = l;
        breadth = b;
    }
    ~Rectangle(){ // ์†Œ๋ฉธ์ž
        cout << "Destructor";
    }
};

 

3-1 ์ƒ์„ฑ์ž ์œ„์ž„

๊ธฐ์กด์˜ ์ƒ์„ฑ์ž๋ฅผ ์žฌ์‚ฌ์šฉ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, new_Init { old_Init() } ์ฒ˜๋Ÿผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€๋ง๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ž.


Class_init() { 
    // Code A 
} 

Class_init(int value) : Class_init() {// ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ์œ„์ž„ํ•œ๋‹ค. 
    // Code B
    // ์—ฌ๊ธฐ์— Class_init()๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฑด ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.
}

 

4. ์†Œ๋ฉธ์ž

๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ด๋‹ค.

๊ธฐ๋ณธ ์ž๋ฃŒํ˜• ๊ฐ’์ด๋ฉด ํฌ๊ฒŒ ํ•„์š” ์—†์ง€๋งŒ, ๋™์ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์— ํŽธํ•˜๋‹ค.

์ฐธ๊ณ ๋กœ C์–ธ์–ด์—์„œ๋Š” free() ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, CPP์—์„œ๋Š” delete ๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์ œ๊ณต๋œ๋‹ค.

delete๋ฅผ ์„ ์–ธํ•˜๊ฒŒ๋˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋‚˜ ์ž๋ฃŒํ˜•์˜ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.


class MyArray {
private:
    int* Array;
    int Length;

public:
    MyArray(int length) { // ์ƒ์„ฑ์ž
        this->Array = new int[static_cast<size_t>(length)]{};
        this->Length = length;
    }

    ~MyArray(){ // ์†Œ๋ฉธ์ž
        delete[] Array; 
        // ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ทธ๋ฃน ํ˜•์‹(๋ฆฌ์ŠคํŠธ)์ด๋ผ๋ฉด delete[] ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.
    }
};

 

5. ํด๋ž˜์Šค ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™”

CPP์—์„œ๋Š” ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”๋ฅผ ํ•  ๋•Œ๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋ผ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ int x = 5; ๋ฅผ int x { 5 }; ๋กœ ์ดˆ๊ธฐํ™” ํ•ด๋„ ๋œ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๋ฉค๋ฒ„๋ฅผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.


#include <iostream>

class Rectangle {
private:
    double m_Length = 1.0; // ๋˜๋Š” m_Length { 1.0 };
    double m_Width = 1.0;

public:
    Rectangle(double length, double width) : m_Length(length), m_Width(width){
        // ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ดˆ๊ธฐํ™”. + ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค.
    }

    Rectangle(double length) : m_Length(length){
        // m_Length ๋ณ€์ˆ˜๋Š” ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋œ๋‹ค. // m_Width ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ๊ฐ’ 1.0
    }
};

int main() {
    int x = {3};
    Rectangle y{ 2.0, 3.0}; // length = 2 , width = 3
    Rectangle z{2.0}; // length =2 , width = ๊ธฐ๋ณธ๊ฐ’ (๊ธฐ๋ณธ๊ฐ’์„ ์•ˆ์ ์—ˆ๋‹ค๋ฉด ์“ฐ๋ ˆ๊ธฐ๊ฐ’)
    return 0;
}

 

6. Class Chaining

ํด๋ž˜์Šค์˜ this ํฌ์ธํ„ฐ๋ฅผ ์‘์šฉํ•˜๋ฉด Number.Add(5).Add(5).Mul(6) ์ด๋Ÿฐ์‹์˜ ๊ตฌํ˜„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.


class Calc {
private: 
    int m_Value = 0;
    
public: 
    Calc& Add(int value) {
        m_Value += value; return *this; 
        // ํ—ท๊ฐˆ๋ฆฌ์ง€๋ง์ž. this ์ž์ฒด๋Š” 4๋ฐ”์ดํŠธ ํฌ์ธํ„ฐ ์ฃผ์†Œ๊ฐ’์ด๋‹ค.
        // Calc ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ• ๋ ค๋ฉด ๊ฐ’(*this)์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค
    } 
    
    Calc& Sub(int value) {
        m_Value -= value; return *this; 
    }
    
    Calc& Mul(int value) {
        m_Value *= value; return *this; 
    }
    
    int GetValue() { return m_Value; }
}; // ์„ธ๋ฏธ์ฝœ๋ก  ๊นŒ๋จน์ง€ ๋ง์ž.

int main() { 
    Calc calc; 
    calc.Add(5).Sub(3).Mul(4); 
    cout << calc.GetValue() << endl; // (+5-3)*4 = 8 
    return 0; 
}

 

7. Template Method

CPP์—์„œ ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์— ๋Œ€ํ•œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์˜ค๋ฒ„๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ์ณค์„ ๋•Œ


int sum(int a, int b){
    return a + b;
}
double sum(double a, double b){
    return a + b;
}

 

ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

// typename T ๊ณผ class T ์ œ๊ณต //

template <typename T>
T sum(T a, T b){ // sum<int>(a,b) ์ฒ˜๋Ÿผ ์‚ฌ์šฉ
    return a + b;
}

template <class T1, class T2>
void printAll(T1 a, T2 b){ 
	// printAll(m1,m2) ์ฒ˜๋Ÿผ ์‚ฌ์šฉ
    // ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋ฃŒํ˜•์„ ํŒ๋‹จ ๊ฐ€๋Šฅํ•˜๊ธฐ์— ์ƒ๋žต๊ฐ€๋Šฅ.
	
    cout << "T1 : " << a << endl;
    cout << "T2 : " << b << endl;
    cout << "T1 + T2 : " << a + b << endl;
}

 

7-1 ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ ํ•˜๋Š”๊ฒฝ์šฐ

ํ•ด๋‹น ํ•จ์ˆ˜์˜ ํ…œํ”Œ๋ฆฟ ์›ํ˜•์„ ์„ ์–ธ ํ•œ ํ›„, ๋ฐ‘์— ๊ตฌํ˜„๋ถ€๋ฅผ template<> ๋กœ ๋”ฐ๋กœ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.


template <class T> // ์›ํ˜•
T sum(T a, T b){
   return a + b;
}
 
template<>
char * sum<char*> (char* s1, char* s2){ // charํ˜•
   char * str= "[char *]๋ฌธ์ž์—ด์€ ๋”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."; 
   cout << "s1 : " << s1 << endl;
   cout << "s2 : " << s2 << endl;
   return str; 
}
   
template<>
const char * sum<const char*> (const char * s1,const char *s2){ // const char ํ˜•
   char * str= "[const char *]๋ฌธ์ž์—ด์€ ๋”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.";
   cout << "const s1 : " << s1 << endl;
   cout << "const s2 : " << s2 << endl;
   return str; 
}
 
template<>
string sum<string>(string s1, string s2){ // string ํ˜•
   string str = "[string]๋ฌธ์ž์—ด์€ ๋”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.";
   cout << "string s1 : " << s1 << endl;
   cout << "string s2 : " << s2 << endl; 
   return str;
}

 

7-2 ํด๋ž˜์Šค์—์„œ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋˜‘๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ์™ธ๋ถ€์— ๋ฉ”์„œ๋“œ๋ณ„๋กœ ๋”ฐ๋กœ ๊ตฌํ˜„ํ• ๋• ๊ฐ๊ฐ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค.


template <class T> // ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ
class Person{
private:
    string name;
    T height;
public:
    Person(string name, T height):name(name), height(height){}
 
    void printAll(){
        cout << "name : " << name << endl;
        cout << "number : " << height << endl;
    };
 
    void setName(string name){
        this->name = name;
    }
    void setNumber(T height){
        this->height = height;
    }
};
//ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ (ํ—ค๋”ํŒŒ์ผ ๋ถ„๋ฆฌ)

template <class T>
class Person{

private:
    string name;
    T height;
public:
    Person(string name, T height);
    void printAll();
    void setName(string name);
    void setNumber(T height);
}; // ์„ ์–ธ๋ถ€ ๋ (.h)


 //๊ตฌํ˜„๋ถ€ ์‹œ์ž‘ (.cpp)
template <class T> // :: ์ฒ˜๋Ÿผ, ๊ฐ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ์ ์–ด์ฃผ์–ด์•ผ ํ•จ.
Person<T>::Person(string name, T height):name(name), height(height){}
 
template <class T>
void Person<T>::printAll(){
    cout << "name : " << name << endl;
    cout << "number : " << height << endl;
};
// ... ์ดํ•˜ ์ƒ๋žต

 

'๐ŸŒฑBackend > CPP' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

4. STL  (0) 2020.12.29
3. ์˜ˆ์™ธ์ฒ˜๋ฆฌ  (0) 2020.12.29
2. Cpp์˜ ๋…ํŠนํ•œ ์‚ฌ์šฉ๋ฒ•  (0) 2020.12.26
1. Hello World  (0) 2020.12.26

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ