C, C++

[C++] ๊ฐ์ฒด ์ง€ํ–ฅ

๋ฒผ๋ฆฌ01 2024. 8. 19. 13:54

๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ์–ธ์–ด. ๊ธฐ๋ณธ ๋‹จ์œ„๋ฅผ ๊ฐ์ฒด๋กœ ํ•œ๋‹ค.

์ถ”์ƒํ™”, ์บก์Аํ™”, ๋‹คํ˜•์„ฑ, ์ƒ์†

์ƒ์†๊ณผ ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•ด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž„์œผ๋กœ์จ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.

๊ฐ์ฒด: Object. ์‚ฌ๋ฌผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋….

์ ˆ์ฐจํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๊ธฐ๋Šฅ ๋‹จ์œ„ ⇒ ํ•จ์ˆ˜

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๊ธฐ๋Šฅ ๋‹จ์œ„ ⇒ ๊ฐ์ฒด(ํด๋ž˜์Šค. ๋ณ€์ˆ˜+ํ•จ์ˆ˜)

 

๐Ÿ“Œํด๋ž˜์Šค(Class)

์—ฐ๊ด€์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๋†“์€ ์ถ”์ƒ์  ๋ฐ์ดํ„ฐํ˜•(์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…). ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค.

์ƒ์„ฑ์ž, ์†Œ๋ฉธ์ž(C#, Java, JavaScript์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ), ๋ฉค๋ฒ„ ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ.

 

๊ฐ์ฒด ์ƒ์„ฑ

์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•: ๋ณ€์ˆ˜ ์„ ์–ธ

 

void exampleFunction() {
    TV myTV;  // ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ
    myTV.power(true);
    // myTV๋Š” ํ•จ์ˆ˜ ๋ธ”๋ก์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ํŒŒ๊ดด๋จ
}

 

 

ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•: ํ•ด๋‹น ์ž๋ฃŒํ˜•์˜ ํฌ์ธํ„ฐ์— new ์—ฐ์‚ฐ์ž๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์ฐธ์กฐ

 

void exampleFunction() {
    TV* myTV = new TV();  // ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ
    myTV->power(true);
    delete myTV;  // ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
}

 

 

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

delete ๋กœ ๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค.

 

 

์ ‘๊ทผ ์ œ์–ด์ž(์ ‘๊ทผ ์ง€์ •์ž)

ํด๋ž˜์Šค ์ƒ์„ฑ ์‹œ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. private protected public

private ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ.

public ๊ณต๊ฐœ(์ œํ•œ ์—†์Œ)

protected ์ƒ์† ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ.

์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ private ์ด ๋œ๋‹ค.

๋ณ€์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•˜๋ฉด, ์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

 

#include <iostream>

class MyClass{

private:
		int a;
public:
		int b;
		
	void setA(int a) {
		this->a = a;
	}

	int getA() {
		return this->a;
	}
}

void main(){
	
		MyClass m;
		
		m.a = 10; // ๋นŒ๋“œ ์—๋Ÿฌ: ๋ฉค๋ฒ„ MyClass::a์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
		m.b = 10;
		
		m.setA(10);

		std::cout << m.getA() << std::endl; // 10
	
}

 

 

ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๊ณผ ์ •์˜๋ถ€๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

class MyClass {

    private:
            int a;
            int b;

    public:
            void setA(int a);
    };

    void MyClass::setA(int a) {
            this->a = a;
    }

    void main() {

            MyClass m;
            m.setA(10);

}

 

 

 

 

์ƒ์„ฑ์ž(Constructor)

๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ํ•จ์ˆ˜. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์ผ๋ฟ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ„ด ํƒ€์ž…์€ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ(void๋„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.) ํ•จ์ˆ˜ ์ด๋ฆ„์€ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๋™์ผํ•˜๋‹ค. ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด ์„ ์–ธ ์‹œ์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ƒ์„ฑ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉ ํ• ์ˆ˜ ์žˆ๋‹ค.

 

#include <iostream>

class MyClass{

private:
		int a;
		int b;
public:
		MyClass(){
			this->a = 1;
			this->b = 2;
		}
		
		MyClass(int a, int b){
			this->a = a;
			this->b = b;
		}
		
		void getA(){
				return this->a;
		}
		
		void getB(){
				return this->b;
		}

}

void main(){
		MyClass m1;
		
		std::cout << "m1.a = " << m1.getA() << std::endl;
		
		MyClass m2 = MyClass(10, 20);
		
		std::cout << "m2.a = " << m2.getA() << std::endl;
		
}
1
10

 

 

 

๊ธฐ๋ณธ ์ƒ์„ฑ์ž(Default Constructor)

๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ค‘๊ด„ํ˜ธ ๋‚ด๋ถ€๋„ ์—†๋Š” ์ƒ์„ฑ์ž. ์ƒ์„ฑ์ž๋ฅผ ๋‹จ ํ•˜๋‚˜๋„ ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋‚ด๋ถ€๊ฐ€ ๋น„์–ด์žˆ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

 

 

์†Œ๋ฉธ์ž(Destructor)

๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์—๋Š” ์†Œ๋ฉธ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•œ๋‹ค. ๋‹จ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ์–ธ์–ด์˜ ๊ฒฝ์šฐ ์†Œ๋ฉธ์ž์˜ ํ–‰์œ„๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์‹คํ–‰ํ•œ๋‹ค.

ํ•จ์ˆ˜ ์ด๋ฆ„์€ ํด๋ž˜์Šค ์ด๋ฆ„ ์•ž์— ~ ๋ฅผ ๋ถ™์—ฌ ์„ ์–ธํ•œ๋‹ค. ๊ฐ์ฒด๊ฐ€ ํŒŒ๊ดด๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ์ƒ์„ฑ์ž์™€ ๋‹ฌ๋ฆฌ ์˜ค๋ฒ„๋กœ๋”ฉํ•  ์ˆ˜ ์—†๋‹ค. (๋‹จ ํ•œ ๊ฐœ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. )

  • ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” First In Last Out ๊ตฌ์กฐ๋กœ ๋‚˜์ค‘์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ๋จผ์ € ์†Œ๋ฉธ๋œ๋‹ค.

 

#include <iostream>

class MyClass{

private:
    int a;
    int b;
public:
    MyClass(){
        this->a = 1;
        this->b = 2;
    }

    ~MyClass(){
        std::cout << "bye!" << std::endl;
    }

    void getA(){
            return this->a;
    }

}

void main(){
    MyClass m1;

    std::cout << "m1.a = " << m1.getA() << std::endl;
		
}

 

1
bye!

 

 

class์™€ struct

C์–ธ์–ด์—๋Š” ์ ‘๊ทผ์ œํ•œ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. C++์—์„œ๋Š” struct์—๋„ ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์ธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

struct ์™€ class ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ ‘๊ทผ ์ œ์–ด์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Œ.

struct ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

class ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ private ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„(์บก์Аํ™”)์— ์ ํ•ฉํ•˜๋‹ค.

๋‘˜ ๋‹ค ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€๋งŒ class ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

 

struct MyStruct {
    int x;  // ๊ธฐ๋ณธ์ ์œผ๋กœ public
};

 

class MyClass {
    int x;  // ๊ธฐ๋ณธ์ ์œผ๋กœ private
};

 

 

๊ฐ์ฒด(Object)

์‹ค์„ธ๊ณ„์— ์กด์žฌํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒ์ ์ธ ๊ฐœ๋….

 

๊ฐ์ฒด? ์ธ์Šคํ„ด์Šค?

๊ฐ์ฒด๋ฅผ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์„ ์–ธํ•œ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•œ ๊ฒƒ์„ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ํ•œ๋‹ค.

์ž๋ฐ”์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด ํฌ์ธํ„ฐ์ง€๋งŒ, C++์˜ ๊ฒฝ์šฐ int ๋“ฑ์˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜์ด๋ฏ€๋กœ, ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด ๊ทธ ์ž์ฒด๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด mp1 ์ด ์žˆ๊ณ  ๊ฐ์ฒด mp2 ๊ฐ€ ์žˆ์„ ๋•Œ, mp2 ์— mp1 ๋ฅผ ๋Œ€์ž…ํ•˜๋ฉด ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๋ฏ€๋กœ(๊นŠ์€ ๋ณต์‚ฌ), ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ฐ์ฒด๋‹ค.

 

MousePoint mp1 = MousePoint(10, 20); // ํ˜น์€ MousePoint mp1(10, 20);
MousePoint mp2 = MousePoint(100, 200);

mp1 = mp2
mp1.setX(999);

cout <<"mp1.x :" << mp1.getX() << endl;
cout <<"mp2.x :" << mp2.getX() << endl;

 

mp1.x : 999
mp2.x :10

 

 

 

 

๋งŒ์•ฝ mp1 ๊ณผ mp2 ๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ(์–•์€ ๋ณต์‚ฌ)ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด mp1.setX(999); ์ดํ›„๋กœ๋Š” mp1 ์˜ x ์™€ mp2 ์˜ x ๋ชจ๋‘ 999๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ถœ๋ ฅํ•ด๋ณด๋ฉด ๊ฐ๊ฐ์˜ ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๊ฐ์ฒด ๋ฐฐ์—ด

์‚ฌ์šฉ์ž ์ •์˜ ์ž๋ฃŒํ˜•(ํด๋ž˜์Šค)์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ผ๊ณ  ํ•  ๋•Œ, ๋‹ค์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด. ๋‹ค์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ค๋ฃจ๊ณ  ์‹ถ์„ ๋•Œ ๊ทธ ๊ฐ์ฒด๋“ค์„ ๋ฐฐ์—ด์— ๋‹ด์€ ๊ฒƒ์ด ๊ฐ์ฒด ๋ฐฐ์—ด์ด๋‹ค.

๊ฐ์ฒด ๋ฐฐ์—ด์˜ ๊ฐ์ฒด๋„ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

#include <iostream>

using namespace std;

class MousePoint {

private : 
	int x, y;

public :
	MousePoint(int x, int y) {
		this->x = x;
		this->y = y;
	}

	void setXY(int x, int y) {
		this->x = x;
		this->y = y;
	}

	int getX() {
		return this->x;
	}

	int getY() {
		return this->y;
	}
};

void main() {

	MousePoint mpArr[3] = { MousePoint(10, 20), MousePoint(30, 40), MousePoint(50, 60) };

	for (int i = 0; i < sizeof(mpArr) / sizeof(mpArr[0]); i++) {
		cout << "[" << i + 1 << "] x: " << mpArr[i].getX() << ", y: " << mpArr[i].getY() << endl;
	}

}

 

[1] x: 10, y: 20
[2] x: 30, y: 40
[3] x: 50, y: 60

 

 

 

 

๊ฐ์ฒด ํฌ์ธํ„ฐ

๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜. ๊ฐ์ฒด๋ฅผ ๊ฐ„์ ‘ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

์ž๋ฐ”์˜ ๋ชจ๋“  ๊ฐ์ฒด ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด ํฌ์ธํ„ฐ๋‹ค.

	MousePoint ms(10, 20);
	MousePoint* msPtr;

	msPtr = &ms;

	cout << msPtr->getX() << endl;

 

 

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

 

MousePoint* msPtr = new MousePoint();

 

 

์œ„์—์„œ ์ž๋ฐ”์˜ ๊ฐ์ฒด ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ๊ฐ์ฒด ํฌ์ธํ„ฐ๋ผ๊ณ  ํ–ˆ๋‹ค. ์ž๋ฐ”๋Š” ํฌ์ธํ„ฐ ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— * ํฌ์ธํ„ฐ๋ฅผ ์ƒ๋žตํ•œ๋‹ค.

 

 

 

this ํฌ์ธํ„ฐ

๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ. ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ๋•Œ, ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด์ธ์ง€ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค.

์ฆ‰, ๋ฉค๋ฒ„ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์˜ ์ฃผ์†Œ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ์ฒด ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

void SetID(int id){
   this->id = id;
}

 

 

์œ„ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜๋œ๋‹ค.

void SetId(MyClass* const this, int id){
		this->id = id;		
}

 

 

๋ชจ๋“  ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” this ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

this ํฌ์ธํ„ฐ๋กœ ์ž๊ธฐ ์ž์‹ ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

MyClass& SetId(int id){
		this->id = id;
		return this*;
}

MyClass& SetName(std::string name){
		this->name = name;
		return this*;
}

 

void main(){
		MyClass c = MyClass();
		c.SetId(1).SetName("์ƒˆ๋กœ์šด์ด๋ฆ„");
}

 

 

์ „๋‹ฌ ์ธ์ž๊ฐ€ ๊ฐ์ฒด์ธ ํ•จ์ˆ˜(Call by value)

์ธ์ž๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์˜ฌ ๊ฒฝ์šฐ ๊ฐ์ฒด ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋ฐ›์•„์˜จ๋‹ค.

call by value๋กœ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ. ์ž๋ฐ”์™€ ๋‹ฌ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š”๋‹ค. ์ž๋ฐ”๋Š” call by reference.

 

void SetRect(MousePoint mp1, MousePoint mp2) {
	cout << "[ํ•จ์ˆ˜ ๋‚ด mp1]" << mp1.getX() << " ," << mp1.getY() << endl;
	cout << "[ํ•จ์ˆ˜ ๋‚ด mp2]" << mp2.getX() << " ," << mp2.getY() << endl;

	mp1.setXY(1000, 2000);
	cout << "[๋ณ€๊ฒฝ ํ›„ mp1]" << mp1.getX() << " ," << mp1.getY() << endl;
}

 

[ํ•จ์ˆ˜ ๋‚ด mp1]10 ,20
[ํ•จ์ˆ˜ ๋‚ด mp2]100 ,200
[๋ณ€๊ฒฝ ํ›„ mp1]1000 ,2000
[ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„]10 ,20

 

 

๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋„˜๊ฒจ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—,ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ mp1 ๊ณผ ๋ฉ”์ธ ํ•จ์ˆ˜์˜ mp1 ์€ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์ฃผ์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ mp1 ์„ ๋ณ€๊ฒฝํ–ˆ๋”๋ผ๋„ ๋ฉ”์ธ ํ•จ์ˆ˜์˜ mp1 ์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

 

 

์ „๋‹ฌ ์ธ์ž๊ฐ€ ๊ฐ์ฒด ์ฃผ์†Œ์ธ ํ•จ์ˆ˜(Call by reference)

`์‚ฌ์šฉ์ž์ •์˜ํƒ€์ž…&` ๋กœ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ„์นญ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž.

 

void CopyObject(MousePoint& mp1, MousePoint& mp2) {

	cout << "void CopyObject() -----------------" << endl;
	
	cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
	cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;

	mp1 = mp2;

	mp1.setXY(12, 24);
	cout << "mp1.setXY(12, 24); ----------------------------" << endl;

	cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
	cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;

	cout << "mp1 = mp2; ----------------------------" << endl;
	mp1 = mp2;

	cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
	cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;

	mp2.setXY(1200, 2400);
	cout << "mp2.setXY(1200, 2400); ----------------------------" << endl;

	cout << "[mp1]" << mp1.getX() << ", " << mp1.getY() << endl;
	cout << "[mp2]" << mp2.getX() << ", " << mp2.getY() << endl;

	cout << "----------------------------" << endl;

}

 

	MousePoint mp1(10, 20);
	MousePoint mp2(100, 200);

	//SetRect(mp1, mp2);
	CopyObject(mp1, mp2);

	cout << "[ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„]" << mp1.getX() << ", " << mp1.getY() << endl;
	cout << "[ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„]" << mp2.getX() << ", " << mp2.getY() << endl;

 

void CopyObject() -----------------
[mp1]10, 20
[mp2]100, 200
mp1.setXY(12, 24); ----------------------------
[mp1]12, 24
[mp2]100, 200
mp1 = mp2; ----------------------------
[mp1]100, 200
[mp2]100, 200
mp2.setXY(1200, 2400); ----------------------------
[mp1]100, 200
[mp2]1200, 2400
----------------------------
[ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„]100, 200
[ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„]1200, 2400

 

 

 

 

๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด mp1 = mp2 ๋ผ๊ณ  ๋Œ€์ž…ํ–ˆ์„ ๋•Œ, ์ž๋ฐ”์ฒ˜๋Ÿผ ์–•์€ ๋ณต์‚ฌ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด์˜ ๊ฐ’๋งŒ์„ ๋ณต์‚ฌํ•ด์ฃผ๊ณ  ์—ฌ์ „ํžˆ ๊ฐ์ฒด ์ž์‹ ์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์ฆ‰, mp1 = mp2 ๋ผ๊ณ  ๋Œ€์ž…์„ ํ•˜๋”๋ผ๋„ ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.

๋ณ„์นญ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž!!! ์ฐธ์กฐ๋กœ ๋„˜๊ฒจ์ฃผ๋”๋ผ๋„ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง„ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋ณ€์ˆ˜๋‹ค.

  • ์ดํ›„ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ์—๋Š” ๋ณ€์ˆ˜๋Š” ์Šคํƒ, ๊ฐ์ฒด๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด ๊ฐ์ฒด๋ฅผ ํฌ์ธํ„ฐ๋กœ ์ฐธ์กฐํ•ด์•ผํ•œ๋‹ค. new ์—ฐ์‚ฐ์ž๋Š” ํž™๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๊ฐ์ฒด ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  •  

const ํ•จ์ˆ˜

์‚ฌ์ „ ⇒ constant : ์ƒ์ˆ˜(ๅธธๆ•ธ, constant)๋ž€ ์ˆ˜์‹์—์„œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ๋œปํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋ณ€ํ•˜๋Š” ๊ฐ’ ๋ณ€์ˆ˜์™€ ๋ฐ˜๋Œ€์ด๋‹ค. // ์œ„ํ‚ค๋ฐฑ๊ณผ ํ•จ์ˆ˜์—์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ํ•จ์ˆ˜. ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— const ๋ฅผ ๋ถ™์—ฌ ์„ ์–ธํ•œ๋‹ค. const void MyFunction(int a)

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

 

const ๋ณ€์ˆ˜

์ดˆ๊ธฐํ™”๋œ ์ดํ›„๋กœ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ์ œ์–ดํ•จ. const MousePoint mp1(10, 20); ์ดํ›„ mp1 ์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ คํ•˜๊ฑฐ๋‚˜, mp1 = mp2; ์ฒ˜๋Ÿผ ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋Œ€์ž…ํ•˜๋ คํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

const ๋ณ€์ˆ˜์—์„œ๋Š” const ํ•จ์ˆ˜๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๋”๋ผ๋„, const ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

 

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

์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ์ : ํด๋ž˜์Šค ๋‚ด๋ถ€ ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ์ฒ ํ•™์— ์œ„๋ฐฐ๋œ๋‹ค.

ex) ๊ณ ๊ฐ๋ช…, ๊ณ ๊ฐ ์˜ˆ๊ธˆ ์ž”์•ก์€ ๋ณ„๋„๋กœ ๊ด€๋ฆฌ๋˜์ง€๋งŒ ์ด์ž์œจ์€ ๊ณตํ†ต์œผ๋กœ ๊ฐ€์ง„๋‹ค.

๊ฐ์ฒด๋งˆ๋‹ค ๊ณ ์œ ๋กœ ๊ฐ€์ง€๋Š” ๋ฉค๋ฒ„ ์†์„ฑ์ด ์•„๋‹ˆ๋ผ, ๊ฐ™์€ ๊ฐ’์„ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์„ฑ์งˆ์ด ํ•„์š”ํ•œ๋ฐ, ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•  ๊ฒฝ์šฐ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์ฒ ํ•™์— ์œ„๋ฐฐ๋˜๋ฏ€๋กœ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์„ฑ์งˆ์„ ๋ชจ๋‘ ๊ฐ€์ง„ static ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค.

static ๋ณ€์ˆ˜์™€ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค.

์Šคํƒ: ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น.

ํž™: ์‚ฌ์šฉ์ž(๊ฐœ๋ฐœ์ž)๊ฐ€ malloc ๋˜๋Š” new ์—ฐ์‚ฐ์ž๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์˜์—ญ. ํ•ด์ œ ์‹œ๊นŒ์ง€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

 

์ดˆ๊ธฐํ™”

#include <iostream>

using namespace std;

class Deposit {
public : 
	Deposit() {
	}

	void bankBalance() {
		balance = balance + (balance * interestRate);
	}

	double getBalance() {
		return this->balance;
	}

private : 
	char* name;
	double balance;
	static double interestRate;
};

double Deposit::interestRate = 0.0;

 

 

์˜์—ญ ๊ฒฐ์ • ์—ฐ์‚ฐ์ž :: ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.

static ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ณ€์ˆ˜๋กœ, ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ๋ณ„๋„๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.

 

 

๋ณ€๊ฒฝ

public:
	static void setInterestRate(double) {
		Deposit::interestRate = 0.05;
	}

 

๊ฐ์ฒด๋งˆ๋‹ค ๊ฐ€์ง€๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ, ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•ด์„œ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

 

 

const๋Š” const๋ผ๋ฆฌ, static์€ static๋ผ๋ฆฌ!

static ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

static์€ ํด๋ž˜์Šค ์„ ์–ธ ์‹œ ์ด๋ฏธ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์˜ฌ๋ผ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ์ฒด ๋‚ด ์ผ๋ฐ˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ๋’ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. static ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์—์„œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ผ๋ฐ˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

static ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ static ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ณต์šฉ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์œผ๋ฏ€๋กœ ํ•จ์ˆ˜๋ฅผ static์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

	Deposit kim, lee, park;

	kim.setInterestRate(0.55); // ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์˜ณ์ง€ ์•Š์Œ
	Deposit::setInterestRate(0.55);

 

 

static ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋ฅผ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— this ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

friend

ํด๋ž˜์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ friend ๋กœ ์„ ์–ธํ•˜๋ฉด, ์„ ์–ธ๋œ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๋ณธ์ธ์˜ ํด๋ž˜์Šค์— ์–ด๋–ค ๋ฉค๋ฒ„๋“  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.(์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ๋ฌด์‹œํ•œ๋‹ค.)

friend๋Š” ์ผ๋ฐฉ์  ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ์„ ๋ฐ›์€ ์ชฝ๋งŒ ์ƒ๋Œ€์—๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ์Œ๋ฐฉ์œผ๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด ์Œ๋ฐฉ์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋‹ค๋ฅธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ์—†๋Š” ๊ฐœ๋…์ด๋‹ค.

 

#include <iostream>

using namespace std;

class FriendDeposit {

public:
	FriendDeposit(Deposit d) {
		interestRate = d.interestRate;
	}

	double interestRate;

};

class Deposit {
public : 

	friend class FriendDeposit;

	Deposit() {
		Deposit::nCount++;
		cout << "[nCount]"  << Deposit::nCount << endl;
			}

	~Deposit() {
		Deposit::nCount--;
		cout << "[nCount]" << Deposit::nCount << endl;
	}

	double getBalance() {
		return this->balance;
	}

	static void setInterestRate(double interestRate) {
		Deposit::interestRate = interestRate;
	}

	static double getInterestRate() {
		return Deposit::interestRate;
	}

private : 
	char* name;
	double balance;
	static double interestRate;
	static int nCount;
};

 

 

๐Ÿ“Œ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)

์ด๋ฆ„์ด ๊ฐ™์ง€๋งŒ ์ „๋‹ฌ ์ธ์ž์˜ ๊ฐœ์ˆ˜๋‚˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ. ex) ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

๋ฐ˜ํ™˜ ํƒ€์ž…์€ ๊ด€๊ณ„๊ฐ€ ์—†์Œ. ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ์˜ค๋ฒ„๋กœ๋”ฉ์ด ์•„๋‹ˆ๋‹ค.

C์–ธ์–ด์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (C์–ธ์–ด๋Š” ํ•จ์ˆ˜๋ฅผ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. C++์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•œ๋‹ค.)

 

๐Ÿ“Œ์ถ”์ƒํ™”(Abstraction)

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

์‚ฌ๋ฌผ์˜ ํŠน์„ฑ์„ ์ •๋ฆฌํ•˜์—ฌ ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ.

๊ฐœ: ๋ˆˆ, ์ฝ”, ์ž…, ๊ท€, ๋‹ค๋ฆฌ / ์ง–๋‹ค(), ๋จน๋‹ค(), ๋‹ฌ๋ฆฌ๋‹ค()

 

๐Ÿ“Œ์ƒ์†(Inheritance)

๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒƒ. ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ๊ธฐ๋Šฅ์„ ๋˜ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ์ƒ์† ๋ฐ›์•„ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. ์ถ”์ƒํ™”(์ผ๋ฐ˜ํ™”)๋˜์–ด์žˆ๋Š” ๋ถ€๋ชจ๋ฅผ ๋ฌผ๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ์ถ”์ƒ์ ์ด ๋˜๋ฉฐ, ์ž์‹ ํด๋ž˜์Šค๋กœ ๋‚ด๋ ค๊ฐˆ์ˆ˜๋ก ๊ตฌ์ฒด์ ์ด ๋œ๋‹ค.

์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ ๋˜๋Š” ์†Œ๋ฉธ ์‹œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž, ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (์ƒ์„ฑ์ž: ๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž → ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž) (์†Œ๋ฉธ์ž: ์ž์‹ ํด๋ž˜์Šค ์†Œ๋ฉธ์ž → ๋ถ€๋ชจ ํด๋ž˜์Šค ์†Œ๋ฉธ์ž)

 

 

โœจ๋‹คํ˜•์„ฑ(Polymorphism)

์‚ฌ์ „: ๊ฐ™์€ ์ข…์˜ ์ƒ๋ฌผ์ด๋ฉด์„œ๋„ ์–ด๋–ค ํ˜•ํƒœ๋‚˜ ์„ฑ์งˆ์ด ๋‹ค์–‘ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ. ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์˜ ๋ณ€์ˆ˜๋กœ ์ฐธ์กฐํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ. ํด๋ž˜์Šค๊ฐ€ ์ƒ์† ๊ด€๊ณ„์— ์žˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๋‹ค์ฑ„๋กœ์šด ์„ฑ์งˆ.

 

์ฐธ์กฐํ˜• ์บ์ŠคํŒ…(์—…์บ์ŠคํŒ…/๋‹ค์šด์บ์ŠคํŒ…)

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉค๋ฒ„์˜ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ ˆํ•จ. ์Šค๋งˆํŠธ ํ‹ฐ๋น„๊ฐ€ ์žˆ์„ ๋•Œ, ์ผ๋ฐ˜ ๋ฆฌ๋ชจ์ปจ๊ณผ ์Šค๋งˆํŠธ ๋ฆฌ๋ชจ์ปจ์œผ๋กœ ์กฐ์ข…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•จ.

์—…์บ์ŠคํŒ…(Upcasting)

์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ. ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž () ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ. ์ž์‹ ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผ์„ ์ œํ•œํ•จ.

๋‹ค์šด์บ์ŠคํŒ…(Downcasting)

๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ. ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์—…์บ์ŠคํŒ…๋œ ๋ณ€์ˆ˜๋ฅผ ์ž์‹ ํด๋ž˜์Šค๋กœ ๋ณต๊ตฌํ•˜์—ฌ ์ œํ•œ ๋ฐ›์•˜๋˜ ํ•„๋“œ์™€ ๊ธฐ๋Šฅ์„ ํšŒ๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

โœจ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)

์ƒ์† ๋ฐ›์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ. ๊ธฐ์กด์˜ ๊ฒƒ์„ ๋ฎ์–ด ์“ด๋‹ค.

#include <iostream>

using namespace std;

int Plus(int a, int b) {
	return a + b;
}

int Plus(int a, int b, int c) {
	return a + b + c;
}

double Plus(double a, double b) {
	return a + b;
}

int main() {

	int a = 1;
	int b = 2;
	int c = 3;

	double d = 1.1;
	double e = 2.2;

	cout << Plus(a, b) << endl;
	cout << Plus(a, b, c) << endl;
	cout << Plus(d, e) << endl;

	return 0;
}
3
6
3.3

 

 

 

๐Ÿ“Œ์บก์Аํ™”(Encapsulation)

๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€์งˆ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์†์„ฑ๊ณผ ํ–‰์œ„๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋‚ด๋ถ€๋ฅผ ์€๋‹‰ํ•จ. ์ธํ„ฐํŽ˜์ด์Šค(Getter, Setter)๋ฅผ ํ†ตํ•ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์–ดํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” private protected ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ.

์ •๋ณด ์€๋‹‰๊ณผ ์บก์Аํ™”๊ฐ€ ๊ฐ™์€ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ, ์ •๋ณด ์€๋‹‰ ๊ธฐ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ์บก์Аํ™”์ž„.

์ƒ์†์„ ํ†ตํ•œ ํƒ€์ž… ์€๋‹‰๋„ ํ•  ์ˆ˜ ์žˆ์Œ. ⇒ ์ž์‹ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•˜์—ฌ ๊ตฌ์ฒด์ ์ธ ์ž์‹ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์€๋‹‰ํ•จ.(๋‹คํ˜•์„ฑ)

์ถ”์ƒํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ํฌํ•จ์‹œ์ผœ ์Šค์Šค๋กœ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์„ ์บก์Аํ™”๋ผ๊ณ  ํ•จ.

C++์—์„œ๋Š” ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ง์ ‘ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ“Œ์˜์—ญ ๊ฒฐ์ • ์—ฐ์‚ฐ์ž(::)

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ „์—ญ ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ์„ ๋•Œ, ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

#include <iostream>

using namespace std;

// ์ „์—ญ ๋ณ€์ˆ˜
int nTemp = 20;

int main() {

	// ์ง€์—ญ ๋ณ€์ˆ˜
	int nTemp = 10;

	cout << "nTemp์˜ ๊ฐ’์€ " << nTemp << "์ž…๋‹ˆ๋‹ค." << endl;

	return 0;
}
nTemp์˜ ๊ฐ’์€ 10์ž…๋‹ˆ๋‹ค.

 

 

 

์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜์—ญ ์ง€์ • ์—ฐ์‚ฐ์ž :: ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

cout << "nTemp์˜ ๊ฐ’์€ " << ::nTemp << "์ž…๋‹ˆ๋‹ค." << endl;
nTemp์˜ ๊ฐ’์€ 20์ž…๋‹ˆ๋‹ค.

 

 

์˜์—ญ ์ง€์ • ์—ฐ์‚ฐ์ž :: ์•ž์— ๋ช…์นญ ๊ณต๊ฐ„์ด ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ „์—ญ ๊ณต๊ฐ„์˜ ๋ณ€์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

 

 

๐Ÿ“Œ๋ช…์นญ ๊ณต๊ฐ„/์ด๋ฆ„ ๊ณต๊ฐ„(namespace)

์‹๋ณ„์ž ์‚ฌ์ด์˜ ์ด๋ฆ„ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์žฅ์น˜.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”์ธ ํ•จ์ˆ˜ ๋‚ด์—์„œ func() ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ์ง€ ๋ชจํ˜ธํ•˜๋ฏ€๋กœ ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

#include <iostream>

void func() {

	std::cout << "Aํ•™๊ธ‰ ์ฃผ์„ฑ์ด" << std::endl;
}

void func() {

	std::cout << "Bํ•™๊ธ‰ ์ฃผ์„ฑ์ด" << std::endl;
}

int main() {

	func();

	return 0;
}

// ๋นŒ๋“œ ์—๋Ÿฌ! void func(void) ํ•จ์ˆ˜์— ์ด๋ฏธ ๋ณธ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ˜„์‹ค์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์นญ ๊ณต๊ฐ„(namespace)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

#include <iostream>

namespace a {
	void func() {
		std::cout << "Aํ•™๊ธ‰ ์ฃผ์„ฑ์ด" << std::endl;
	}
}

namespace b {
	void func() {
		std::cout << "Bํ•™๊ธ‰ ์ฃผ์„ฑ์ด" << std::endl;
	}
}

int main() {

	a::func();
	b::func();

	return 0;
}

 

Aํ•™๊ธ‰ ์ฃผ์„ฑ์ด
Bํ•™๊ธ‰ ์ฃผ์„ฑ์ด

 

 

 

 

 

์ด๋•Œ, ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์ž‘์„ฑํ•œ๋‹ค๋ฉด main ํ•จ์ˆ˜์— a.cpp ์™€ b.cpp ๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

// a.cpp
#include <iostream>

namespace a {

	void func() {
		std::cout << "Aํ•™๊ธ‰ ์ฃผ์„ฑ์ด" << std::endl;
	}
	
}
// b.cpp
#include <iostream>

namespace b {

	void func() {
		std::cout << "Bํ•™๊ธ‰ ์ฃผ์„ฑ์ด" << std::endl;
	}

}

 

 

 

๋‘ ํŒŒ์ผ์„ ๋ฉ”์ธ ํ•จ์ˆ˜์— ํฌํ•จ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ—ค๋”ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.

#pragma once

#ifndef A_H
#define A_H

namespace a {
	void func();
}

#endif // !A_H

 

#pragma once

#ifndef B_H
#define B_H

namespace b {
	void func();
}

#endif // !B_H

 

// main.cpp

#include "a.h"
#include "b.h"

int main() {

	a::func();
	b::func();

	return 0;
}

 

 

 

Java์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์‹ค์ œ ๊ตฌํ˜„ ํŒŒ์ผ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค.

ex) ProductRepository ProductRepositoryImpl

 

 

 

๐Ÿ“Œ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’

ํ•จ์ˆ˜ ์ž‘์„ฑ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ธฐ๋ณธ๊ฐ’์„ ์ž…๋ ฅํ•ด๋‘๋ฉด ํ˜ธ์ถœ ์‹œ ์ธ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

#include <iostream>

using namespace std;

void func(int a = 10, int  b = 20) {
	cout << "a = " << a << ", b = " << b << endl;
}

int main() {

	func();
	func(500);
	func(1, 2);
	

	return 0;
}

 

 

 

๐Ÿ“Œ์ธ๋ผ์ธ ํ•จ์ˆ˜(Inline Function)

ํ•จ์ˆ˜์— ์ž‘์„ฑํ•œ ์ฝ”๋“œ ๋ผ์ธ ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ๋ถ€์— ํฌํ•จ๋œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ ํ˜ธ์ถœ๋ถ€๋ฅผ ๊ธฐ์–ตํ–ˆ๋‹ค๊ฐ€ ํ•จ์ˆ˜๋กœ ๊ฐ€์„œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•œ ๋’ค ๋‹ค์‹œ ํ˜ธ์ถœ๋ถ€๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ํ•จ์ˆ˜๋ฅผ 100๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ํ˜ธ์ถœ๋ถ€์—์„œ ํ•จ์ˆ˜๋กœ 100๋ฒˆ ์˜ค๊ฐ€์•ผ ํ•œ๋‹ค.

์ด๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ๋ผ์ธ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ถœ์ด ์ผ์–ด๋‚˜๋Š” ์œ„์น˜๊ฐ€ ํ•จ์ˆ˜ ์ฝ”๋“œ ์ž์ฒด๋กœ ๋Œ€์ฒด๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜ ์‹คํ–‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ, ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ธฐ๋Šฅ์ด ๋‹จ์ˆœํ•˜๊ณ (์ฝ”๋“œ๊ฐ€ ์งง๊ณ ) ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

 

#include <iostream>

using namespace std;

void inline func() {
	cout << "This is Inline Func" << endl;
}

int main() {

	func();
	
	return 0;
}

 

 

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

C์–ธ์–ด์—์„œ๋Š” malloc realloc calloc free ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ–ˆ๋‹ค. C++์—์„œ๋Š” new delete ๋‘ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

new ์—ฐ์‚ฐ์ž๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’์ด ํ• ๋‹น๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

int* ptr = new int(9999);
cout << *ptr << endl; // 9999

 

๐Ÿ“ŒSTL(Standard Template Library)

ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ž๋ฃŒ๊ตฌ์กฐ(์ปจํ…Œ์ด๋„ˆ, ์ดํ„ฐ๋ ˆ์ดํ„ฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜)๋ฅผ ๋ชจ์•„๋†“์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

์ปจํ…Œ์ด๋„ˆ(์ž๋ฃŒ๊ตฌ์กฐ), ๋ฐ˜๋ณต์ž(iterator), ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ˆ˜์น˜

์ปจํ…Œ์ด๋„ˆ(Container)

Java์˜ ์ปฌ๋ ‰์…˜๊ณผ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ (Sequence Containers)
    • vector ๋™์  ๋ฐฐ์—ด๋กœ, ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํšจ์œจ์ ์ธ ๋์— ์š”์†Œ ์ถ”๊ฐ€/์ œ๊ฑฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • deque ์–‘์ชฝ ๋์—์„œ ๋น ๋ฅด๊ฒŒ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฑ(๋”๋ธ” ์—”๋””๋“œ ํ)์ž…๋‹ˆ๋‹ค.
    • list ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ, ์ž„์˜์˜ ์œ„์น˜์—์„œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
    • array ๊ณ ์ • ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. std::array๋Š” ํฌ๊ธฐ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ (Associative Containers)
    • set ๊ณ ์œ ํ•œ ์š”์†Œ๋“ค์„ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • map ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋ฉฐ, ํ‚ค๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • multiset ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ์ •๋ ฌ๋œ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
    • multimap ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํ‚ค-๊ฐ’ ์Œ์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ๋น„์ˆœ์ฐจ ์ปจํ…Œ์ด๋„ˆ (Unordered Containers)
    • unordered_set ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ์ง‘ํ•ฉ์œผ๋กœ, ์š”์†Œ๋“ค์€ ์ •๋ ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • unordered_map ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ํ‚ค-๊ฐ’ ์Œ ์ €์žฅ์†Œ๋กœ, ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • unordered_multiset ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
    • unordered_multimap ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํ‚ค-๊ฐ’ ์Œ์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ๊ธฐํƒ€
    • stack: LIFO(Last In First Out) ๋ฐฉ์‹์˜ ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ์ž…๋‹ˆ๋‹ค.
    • queue: FIFO(First In First Out) ๋ฐฉ์‹์˜ ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ์ž…๋‹ˆ๋‹ค.
    • priority_queue: ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ํ๋กœ, ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊บผ๋ƒ…๋‹ˆ๋‹ค.

C++์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ํฌ๋งท(์„œ์‹ ๋ฌธ์ž. ex) %d)์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ž…์ถœ๋ ฅ ์—ฐ์‚ฐ์ž << >> ๊ฐ€ ์˜ค๋ฒ„๋กœ๋”ฉ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

'C, C++' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[C++] ํ…œํ”Œ๋ฆฟ(Template)  (0) 2024.08.29
[C++] ์ƒ์†(Inheritance)  (0) 2024.08.29
[C] ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น  (0) 2024.08.13
[C] ๊ตฌ์กฐ์ฒด, ๊ณต์šฉ์ฒด  (0) 2024.08.13
[C] C์–ธ์–ด ๊ธฐ์ดˆ  (0) 2024.08.09