peewoong 2024. 4. 17. 19:29

โœ๏ธconst = ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜ํ™” ์‹œํ‚จ๋‹ค (๋ณ€ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค)

๐ŸŸฉ const int * ptr = &a

์ƒ์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ, ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์„ ์ƒ์ˆ˜ํ™”

๊ฐ’ ๋ณ€๊ฒฝX ์ฃผ์†Œ ๋ณ€๊ฒฝO

๊ฐ€๋ฆฌํ‚ค๋Š” ์›๋ณธ ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ์ƒ์ˆ˜ํ™”X (์ƒ์ˆ˜ ์ทจ๊ธ‰)

 

๐ŸŸฉ int * const ptr = &a

์ƒ์ˆ˜ ํฌ์ธํ„ฐ, ํฌ์ธํ„ฐ ์ž์ฒด๋ฅผ ์ƒ์ˆ˜ํ™”

๊ฐ’ ๋ณ€๊ฒฝO ์ฃผ์†Œ ๋ณ€๊ฒฝX

 

๐ŸŸฉ const int * const ptr = &a

์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ƒ์ˆ˜ ํฌ์ธํ„ฐ

๊ฐ’ ๋ณ€๊ฒฝX ์ฃผ์†Œ ๋ณ€๊ฒฝX

 

๐ŸŒŸ ๊ฐ’ ๋ณ€๊ฒฝ *ptr = 1;

๐ŸŒŸ ์ฃผ์†Œ ๋ณ€๊ฒฝ ptr = &b;

 

๐ŸŸฉ const๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ const๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๋ฉค๋ฒ„ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์€ ๋ถˆ๊ฐ€๋Šฅ

ํ•จ์ˆ˜์˜ const ์„ ์–ธ ์œ ๋ฌด๋Š” ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ์กฐ๊ฑด์ด ๋œ๋‹ค.

const int a;

void Func(){}
void Func() const{}

โœ๏ธnew & delete

๐ŸŸฉ ๋ฉ”๋ชจ๋ฆฌ ๋™์  ํ• ๋‹น๋ฐฉ๋ฒ•

ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐํ•˜๋Š” ์ผ์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

int *ptr1 = new int;            // intํ˜• ๋ณ€์ˆ˜ ํ• ๋‹น
double *ptr2 = new double       // doubleํ˜• ๋ณ€์ˆ˜ ํ• ๋‹น
int *arr1 = new int[3];         // ๊ธธ์ด๊ฐ€ 3์ธ intํ˜• ๋ฐฐ์—ด ํ• ๋‹น
douible *arr2 = new double[7];  // ๊ธธ์ด๊ฐ€ 7์ธ doubleํ˜• ๋ฐฐ์—ด ํ• ๋‹น

 

๐ŸŸฉ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฐฉ๋ฒ•

new ์—ฐ์‚ฐ์ž๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ๋ฐ˜๋“œ์‹œ delete ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ ์†Œ๋ฉธํ•ด์•ผ ํ•œ๋‹ค.

delete ptr1;
delete ptr2;
delete []arr1;
delete []arr2;

 

๋ณ€์ˆ˜์˜ ์„ฑํ–ฅ์„ ์ง€๋‹ˆ๋Š”(๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ) ๋Œ€์ƒ์— ๋Œ€ํ•ด์„œ๋Š” ์ฐธ์กฐ์ž์˜ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํž™ ์˜์—ญ์— ์ ‘๊ทผํ•  ๋•Œ, ํฌ์ธํ„ฐ, ์ฐธ์กฐ์ž๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

int *ptr = new int;
int &ref = *ptr;    // ํž™ ์˜์—ญ์— ํ• ๋‹น๋œ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž ์„ ์–ธ
ref = 20;
cout << *ptr << endl;

โœ๏ธ friend

private ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์„ ์–ธ

๐Ÿ‘‰ ์ •๋ณด ์€๋‹‰์— ๋ฐ˜ํ•˜๋Š” ์„ ์–ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉ

 

๐ŸŸฉ ํด๋ž˜์Šค์˜ friend ์„ ์–ธ

class Boy{
private:
	int height;
    friend class Girl; // Girl ํด๋ž˜์Šค์— ๋Œ€ํ•œ friend ์„ ์–ธ
    
public:
	Boy(int len) : height(len){
    
    }
};

class Girl{
private:
	char name[20];
public:
	Girl(char *num){
    	strcpy(name, num);
    }
    
    void ShowYourFriendInfo(Boy &frn){
    	cout << "His height : " << frn.height << endl;
        // Girl์ด Boy์˜ friend๋กœ ์„ ์–ธ๋˜์—ˆ์œผ๋ฏ€๋กœ, private ๋ฉค๋ฒ„์— ์ง์ ‘์ ‘๊ทผ ๊ฐ€๋Šฅ
    }
}

 

๐ŸŸฉ ํ•จ์ˆ˜์˜ friend ์„ ์–ธ

set_name ํ•จ์ˆ˜์—์„œ๋Š” Friend1 ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์ธ name ๋ณ€์ˆ˜์— ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

class Friend1 {
private :
	string name;     
    friend void set_name(Friend1&, string);
};  

void set_name(Friend1& f, string s) {    
	f.name = s;    
    cout << f.name << "\n";
}

int main(void) {    
	Friend1 f1;     
    set_name(f1, "aa");     
    return 0;
}

โœ๏ธ static

์ „์—ญ๋ณ€์ˆ˜์— ์„ ์–ธ๋œ static

๐Ÿ‘‰ ์„ ์–ธ๋œ ํŒŒ์ผ ๋‚ด์—์„œ๋งŒ ์ฐธ์กฐ๋ฅผ ํ—ˆ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ

 

ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธ๋œ static์˜ ์˜๋ฏธ

๐Ÿ‘‰ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋˜๊ณ , ์ง€์—ญ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋„ ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š”๋‹ค.

void Counter() {
	static int cnt;
    cnt++;
    cout << "Current cnt: "<< cnt << endl;
}

int main(void) {
	for(int i = 0; i < 10; ++i){
    	Counter();
    }
    
    return 0;
}

 

๐ŸŸฉ static ๋ฉค๋ฒ„๋ณ€์ˆ˜

static ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๋ณ„๋กœ ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ, ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด ์˜์—ญ์—์„œ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋œ๋‹ค.

class SoSimple{
private:
	static int simObjCnt; // static ๋ฉค๋ฒ„ ๋ณ€์ˆ˜, ํด๋ž˜์Šค ๋ณ€์ˆ˜
public:
	SoSimple(){
    	simObjCnt++;
        cout << simObjCnt << "๋ฒˆ์งธ SoSimple ๊ฐ์ฒด" << endl;
    }
};

int SoSimple::simObjCnt=0; // static ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”

 

static ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์™ธ๋ถ€์—์„œ์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋ ค๋ฉด, ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ public์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

class SoSimple{
public:
	static int simObjCnt;
public:
	SoSimple(){
    	simObjCnt++;               // ์ ‘๊ทผ ์ผ€์ด์Šค1
    }
};

int SoSimple::simObjCnt=0;

int main(void){
	cout << SoSimple::simObjCnt << "๋ฒˆ์งธ SoSimple ๊ฐ์ฒด" << endl;
    SoSimple sim1;
    SoSimple sim2;
    cout << SoSimple::simObjCnt << "๋ฒˆ์งธ SoSimple ๊ฐ์ฒด" << endl;     // ์ ‘๊ทผ ์ผ€์ด์Šค2
    cout << sim1.simObjCnt << "๋ฒˆ์งธ SoSimple ๊ฐ์ฒด" << endl;
    cout << sim2.simObjCnt << "๋ฒˆ์งธ SoSimple ๊ฐ์ฒด" << endl;          // ์ ‘๊ทผ ์ผ€์ด์Šค3
}

 

๐ŸŸฉ static ๋ฉค๋ฒ„ ํ•จ์ˆ˜

static ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ํŠน์ง•์ด ์ผ์น˜ํ•œ๋‹ค.

1. ์„ ์–ธ๋œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.

2. public์œผ๋กœ ์„ ์–ธ์ด ๋˜๋ฉด, ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์ด์šฉํ•ด์„œ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

3. ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

 

static ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด ๋‚ด์— ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉค๋ฒ„๋ณ€์ˆ˜๋‚˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

static ํ•จ์ˆ˜๋Š” static ๋ณ€์ˆ˜์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , static ํ•จ์ˆ˜๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐ŸŸฉ const static

const static ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋  ๋•Œ, ์ง€์ •๋œ ๊ฐ’์ด ์œ ์ง€๋˜๋Š” ์ƒ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฌธ๋ฒ•์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

class A{
public:
	const static int RUSSIA = 1707540;
}

int main(void){
	cout << "๋Ÿฌ์‹œ์•„ ๋ฉด์  : " << A.RUSSIA << "km << endl;
}

 

๐ŸŒŸ mutable

mutable๋กœ ์„ ์–ธ๋œ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” const ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

class SoSimple{
private:
	int num1;
    mutable int num2;
public:
	SoSimple(int n1, int n2) : num1(n1), num2(n2) {}
    
    void CopyToNum2() const {
    	num2 - num1;
    }
}