😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[ν΄λž˜μŠ€μ™€ 객체] 객체 생성 및 ν™œμš© λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/C++

[ν΄λž˜μŠ€μ™€ 객체] 객체 생성 및 ν™œμš©

μ§•μ§•μ•ŒνŒŒμΉ΄ 2024. 2. 21. 00:24
728x90
λ°˜μ‘ν˜•

<ν™©κΈ°νƒœ λ‹˜μ˜ λͺ…ν’ˆ C++ Programming μ„œμ μ„ μ°Έκ³ ν•΄μ„œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

 

🐍 Circle 클래슀의 객체 생성 및 ν™œμš©

// Circle 클래슀이 객체 생성 및 ν™œμš©
#include <iostream>
using namespace std;

class Circle
{
public:
    int radius;
    double getArea();
};

double Circle::getArea()
{
    return 3.14 * radius * radius;
}

int main()
{
    // 객체 생성
    Circle donut;
    // 멀버 λ³€μˆ˜
    donut.radius = 1;
    // 멀버 ν•¨μˆ˜
    double area = donut.getArea();
    cout << "dount 면적은 " << area << endl;

    Circle pizza;
    pizza.radius = 30;
    area = pizza.getArea();
    cout << "pizza 면적은 " << area << endl;
}

/*
11:53:03 gani@LOVELY-GANI Chapter3 ±|master βœ—|→ g++ -o 3_1 3_1.cpp
11:53:21 gani@LOVELY-GANI Chapter3 ±|master βœ—|→ ./3_1
dount 면적은 3.14
pizza 면적은 2826
*/

 

🐍 Rectangle ν΄λž˜μŠ€ λ§Œλ“€κΈ°

// Rectangle 클래슀 λ§Œλ“€κΈ°
#include <iostream>
using namespace std;

class Rectangle
{
public:
    int width;
    int height;
    int getArea();
};

// Rectangle 클래슀 κ΅¬ν˜„
int Rectangle::getArea()
{
    return width * height;
}

int main()
{
    // 객체 생성
    Rectangle rect;
    // 멀버 λ³€μˆ˜
    rect.width = 3;
    // 멀버 λ³€μˆ˜
    rect.height = 5;
    // 멀버 ν•¨μˆ˜
    cout << "μ‚¬κ°ν˜•μ˜ 면적은 " << rect.getArea() << endl;
}

/*
11:58:45 gani@LOVELY-GANI Chapter3 ±|master βœ—|→ g++ -o 3_2 3_2.cpp
11:58:48 gani@LOVELY-GANI Chapter3 ±|master βœ—|→ ./3_2
μ‚¬κ°ν˜•μ˜ 면적은 15
*/

 

 

🐍 2개의 μƒμ„±μžλ₯Ό κ°€μ§„ Circle ν΄λž˜μŠ€

// 2개의 μƒμ„±μžλ₯Ό 가진 Circle 클래슀
#include <iostream>
using namespace std;

class Circle
{
public:
    int radius;
    // κΈ°λ³Έ μƒμ„±μž
    Circle();
    Circle(int r);
    double getArea();
};

Circle::Circle()
{
    // λ°˜μ§€λ¦„ κ°’ μ΄ˆκΈ°ν™”
    radius = 1;
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
}

Circle::Circle(int r)
{
    // λ°˜μ§€λ¦„ κ°’ μ΄ˆκΈ°ν™”
    radius = r;
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
}

double Circle::getArea()
{
    return 3.14 * radius * radius;
}

int main()
{
    Circle donut;
    double area = donut.getArea();
    cout << "donut 면적은 " << area << endl;

    Circle pizza(30);
    area = pizza.getArea();
    cout << "pizza 면적은 " << area << endl;
}

/*
μƒμ„±μž : ν΄λž˜μŠ€λŠ” 객체가 생성될 λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” μƒμ„±μž λΌλŠ” νŠΉλ³„ν•œ 멀버 ν•¨μˆ˜λ₯Ό 톡해 객체λ₯Ό μ΄ˆκΈ°ν™”
ν•œ ν΄λž˜μŠ€μ— μ—¬λŸ¬ 개의 μƒμ„±μžλ₯Ό λ‘˜ 수 μžˆμœΌλ‚˜, 이쀑 ν•˜λ‚˜λ§Œ μ‹€ν–‰λœλ‹€
μƒμ„±μž ν•¨μˆ˜μ˜ 이름은 클래슀 이름과 λ™μΌν•˜κ²Œ μž‘μ„±
μƒμ„±μž ν•¨μˆ˜μ˜ μ›ν˜•μ— 리턴 νƒ€μž… μ„ μ–Έ X
μƒμ„±μžλŠ” 쀑볡 κ°€λŠ₯함 (맀개 λ³€μˆ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ€ λ‹€λ₯΄κ²Œ)

λ°˜μ§€λ¦„ 1 원 생성
donut 면적은 3.14
λ°˜μ§€λ¦„ 30 원 생성
pizza 면적은 2826
*/

 

β˜‘οΈ μƒμ„±μž

ν΄λž˜μŠ€λŠ” 객체가 생성될 λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” μƒμ„±μž λΌλŠ” νŠΉλ³„ν•œ 멀버 ν•¨μˆ˜λ₯Ό 톡해 객체λ₯Ό μ΄ˆκΈ°ν™”
ν•œ ν΄λž˜μŠ€μ— μ—¬λŸ¬ κ°œμ˜ μƒμ„±μžλ₯Ό λ‘˜ μˆ˜ μžˆμœΌλ‚˜, μ΄μ€‘ ν•˜λ‚˜λ§Œ μ‹€ν–‰λœλ‹€
μƒμ„±μž ν•¨μˆ˜μ˜ μ΄λ¦„은 ν΄λž˜μŠ€ μ΄λ¦„κ³Ό λ™μΌν•˜κ²Œ μž‘μ„±
μƒμ„±μž ν•¨μˆ˜μ˜ μ›ν˜•μ— λ¦¬ν„΄ νƒ€μž… μ„ μ–Έ X
μƒμ„±μžλŠ” μ€‘볡 κ°€λŠ₯함 (맀개 λ³€μˆ˜ κ°œμˆ˜λ‚˜ νƒ€μž…은 λ‹€λ₯΄κ²Œ)

 

🐍 μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μž ν˜ΈμΆœ μ—°μŠ΅ (μœ„μž„ μƒμ„±μž λ§Œλ“€κΈ°)

객체 μ΄ˆκΈ°ν™”λ₯Ό μ „λ‹΄ν•˜λŠ” νƒ€κ²Ÿ μƒμ„±μžμ™€ νƒ€κ²Ÿ μƒμ„±μžμ— κ°μ²΄ μ΄ˆκΈ°ν™”λ₯Ό μœ„μž„ν•˜λŠ” μœ„μž„ μƒμ„±μž

// μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μž 호좜 μ—°μŠ΅ (μœ„μž„ μƒμ„±μž λ§Œλ“€κΈ°)
#include <iostream>
using namespace std;

class Circle
{
public:
    int radius;
    // μœ„μž„ μƒμ„±μž
    Circle();
    // νƒ€κ²Ÿ μƒμ„±μž
    Circle(int r);
    double getArea();
};

// μœ„μž„ μƒμ„±μž (delegating constructor) : μƒμ„±μžκ°€ λ‹€λ₯Έ μƒμ„±μž 호좜
// μ€‘λ³΅λœ μ΄ˆκΈ°ν™” μ½”λ“œλ₯Ό ν•˜λ‚˜μ˜ μƒμ„±μžλ‘œ λͺ°κ³ , λ‹€λ₯Έ μƒμ„±μžμ—κ²Œ 이 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ²Œ 함
Circle::Circle() : Circle(1) {}

// νƒ€κ²Ÿ μƒμ„±μž : 객체 μ΄ˆκΈ°ν™”λ₯Ό μ „λ‹΄μ‹œν‚΄μœΌλ‘œμ¨ 객체의 생성 과정이 λͺ…λ£Œν•΄μ§€κ³  λ‹¨μˆœν•΄μ§
Circle::Circle(int r)
{
    // λ°˜μ§€λ¦„ κ°’ μ΄ˆκΈ°ν™”
    radius = r;
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
}

double Circle::getArea()
{
    return 3.14 * radius * radius;
}

int main()
{
    Circle donut;
    double area = donut.getArea();
    cout << "donut 면적은 " << area << endl;

    Circle pizza(30);
    area = pizza.getArea();
    cout << "pizza 면적은 " << area << endl;
}

/*
객체 μ΄ˆκΈ°ν™”λ₯Ό μ „λ‹΄ν•˜λŠ” νƒ€κ²Ÿ μƒμ„±μžμ™€ νƒ€κ²Ÿ μƒμ„±μžμ— 객체 μ΄ˆκΈ°ν™”λ₯Ό μœ„μž„ν•˜λŠ” μœ„μž„ μƒμ„±μž

λ°˜μ§€λ¦„ 1 원 생성
donut 면적은 3.14
λ°˜μ§€λ¦„ 30 원 생성
pizza 면적은 2826
*/

 

🐍 멀버 λ³€μˆ˜ μ΄ˆκΈ°ν™”와 μœ„μž„ μƒμ„±μž ν™œμš©

μƒμ„±μžμ™€ λ©€λ²„ λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”
클래슀의 λ©€λ²„ λ³€μˆ˜λ“€μ€ μžλ™μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”ν•œλ‹€
β˜‘οΈ 1) μƒμ„±μž μ½”λ“œμ—μ„œ 멀버 λ³€μˆ˜ μ΄ˆκΈ°ν™”
Point::Point()
{
    x = 0;
    y = 0;
}
Point::Point(int a, int b)
{
    x = a;
    y = b;
}

β˜‘οΈ 2) μƒμ„±μž μ„œλ‘μ— μ΄ˆκΉƒκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
Point::Point() : x(0), y(0)
{
}
Point::Point(int a, int b)
{
    : x(a), y(b)
}

β˜‘οΈ 3) 클래슀 μ„ μ–ΈλΆ€μ—μ„œ 직접 μ΄ˆκΈ°ν™”
class Point
{
    int x = 0;
    int y = 0;
};

// 멀버 λ³€μˆ˜ μ΄ˆκΈ°ν™”μ™€ μœ„μž„ μƒμ„±μž ν™œμš©
#include <iostream>
using namespace std;

class Point
{
    int x, y;

public:
    Point();
    Point(int a, int b);
    void show()
    {
        cout << "(" << x << ", " << y << ")" << endl;
    }
};

// μœ„μž„ μƒμ„±μž
Point::Point() : Point(0, 0) {}

// νƒ€κ²Ÿ μƒμ„±μž
Point::Point(int a, int b) : x(a), y(b) {}

int main()
{
    Point origin;
    Point target(10, 20);

    origin.show();
    target.show();
}

/*
(0, 0)
(10, 20)
*/

/*
μƒμ„±μžμ™€ 멀버 λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”
클래슀의 멀버 λ³€μˆ˜λ“€μ€ μžλ™μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”ν•œλ‹€
1) μƒμ„±μž μ½”λ“œμ—μ„œ 멀버 λ³€μˆ˜ μ΄ˆκΈ°ν™”
Point::Point()
{
    x = 0;
    y = 0;
}
Point::Point(int a, int b)
{
    x = a;
    y = b;
}

2) μƒμ„±μž μ„œλ‘μ— μ΄ˆκΉƒκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
Point::Point() : x(0), y(0)
{
}
Point::Point(int a, int b)
{
    : x(a), y(b)
}

3) 클래슀 μ„ μ–ΈλΆ€μ—μ„œ 직접 μ΄ˆκΈ°γ…—ν•˜
class Point
{
    int x = 0;
    int y = 0;
};
*/

 

🐍 ν΄λž˜μŠ€μ— μƒμ„±μžκ°€ κΌ­ μžˆμ–΄μ•Ό ν• κΉŒ?
κΈ°λ³Έ μƒμ„±μž = λ””ν΄νŠΈ μƒμ„±μž
ν΄λž˜μŠ€μ— μ„ μ–Έλœ μ–΄λ–€ μƒμ„±μžλ„ μ—†μ„ λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μƒμ„±ν•΄μ£ΌλŠ” μƒμ„±μž
λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž
μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ—†λŠ” 클래슀의 경우 μ»΄νŒŒμΌλŸ¬λŠ” 보이지 μ•Šκ²Œ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ‚½μž…ν•œλ‹€
μƒμ„±μžκ°€ ν•˜λ‚˜λΌλ„ μ„ μ–Έλœ ν΄λž˜μŠ€μ˜ κ²½μš°, μ»΄νŒŒμΌλŸ¬λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™ μ‚½μž…ν•˜μ§€ μ•ŠλŠ”λ‹€

#include <iostream>
using namespace std;

class Rectangle
{
public:
    int width, height;
    // μƒμ„±μž
    Rectangle();
    Rectangle(int w, int h);
    Rectangle(int length);
    bool isSquare();
};

Rectangle::Rectangle()
{
    width = height = 1;
}

Rectangle::Rectangle(int w, int h)
{
    width = w;
    height = h;
}

Rectangle::Rectangle(int length)
{
    width = height = length;
}

bool Rectangle::isSquare()
{
    if (width == height)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    Rectangle rect1;
    Rectangle rect2(3, 5);
    Rectangle rect3(3);

    if (rect1.isSquare())
        cout << "rect1 은 μ •μ‚¬κ°ν˜•!" << endl;
    if (rect2.isSquare())
        cout << "rect2 은 μ •μ‚¬κ°ν˜•!" << endl;
    if (rect3.isSquare())
        cout << "rect3 은 μ •μ‚¬κ°ν˜•!" << endl;
}

/*
rect1 은 μ •μ‚¬κ°ν˜•!
rect3 은 μ •μ‚¬κ°ν˜•!

ν΄λž˜μŠ€μ— μƒμ„±μžκ°€ κΌ­ μžˆμ–΄μ•Ό ν• κΉŒ?
- κΈ°λ³Έ μƒμ„±μž = λ””ν΄νŠΈ μƒμ„±μž
ν΄λž˜μŠ€μ— μ„ μ–Έλœ μ–΄λ–€ μƒμ„±μžλ„ 없을 λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μƒμ„±ν•΄μ£ΌλŠ” μƒμ„±μž
λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž
μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ—†λŠ” 클래슀의 경우 μ»΄νŒŒμž‰γ„ΉλŸ¬λŠ” 보이지 μ•Šκ²Œ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ‚½μž…ν•œλ‹€
μƒμ„±μžκ°€ ν•˜λ‚˜λΌλ„ μ„ μ–Έλœ 클래슀의 경우, μ»΄νŒŒμΌλŸ¬λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™ μ‚½μž…ν•˜μ§€ μ•ŠλŠ”λ‹€
*/

 

πŸμ†Œλ©Έμž(destructor)
객체가 μ†Œλ©Έλ˜λŠ” μ‹œμ μ—μ„œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” 클래슀의 멀버 ν•¨μˆ˜
μ†Œλ©Έμžμ˜ λͺ©μ μ€ 객체가 μ‚¬λΌμ§ˆ λ•Œ ν•„μš”ν•œ 마무리 μž‘μ—…μ„ μœ„ν•¨(λ©”λͺ¨λ¦¬ μš΄μ˜μ²΄μ œμ— λŒλ¦¬κ±°λ‚˜ 파일 μ €μž₯ λ‹«κΈ°, λ„€νŠΈμ›Œν¬ ν•΄μ œ)
μƒμ„±λœ λ°˜λŒ€μˆœμœΌλ‘œ 객체가 μ†Œλ©Έλœλ‹€
μ†Œλ©Έμžμ˜ 이름은 클래슀 이름 μ•žμ— ~을 뢙인닀
μ†Œλ©ΈμžλŠ” 리턴 νƒ€μž…μ΄ μ—†μœΌλ©° μ–΄λ–€ 값도 λ¦¬ν„΄ν•΄μ„œλŠ” μ•ˆλœλ‹€
μ†Œλ©ΈμžλŠ” 였직 ν•œ 개만 μ‘΄μž¬ν•˜λ©° λ§€κ°œλ³€μˆ˜λ₯Ό 가지지 μ•ŠλŠ”λ‹€
μ†Œλ©Έμžκ°€ μ„ μ–Έλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ μ†Œλ©Έμžκ°€ μžλ™μœΌλ‘œ μƒμ„±λœλ‹€

#include <iostream>
using namespace std;

class Circle
{
public:
    int radius;
    Circle();
    Circle(int r);
    ~Circle();
    double getArea();
};

Circle::Circle()
{
    radius = 1;
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
}

Circle::Circle(int r)
{
    radius = r;
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
}

// μ†Œλ©Έμž
Circle::~Circle()
{
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 μ†Œλ©Έ" << endl;
}

double Circle::getArea()
{
    return 3.14 * radius * radius;
}

int main()
{
    Circle donut;
    Circle pizza(30);
    return 0;
}

/*
λ°˜μ§€λ¦„ 1 원 생성
λ°˜μ§€λ¦„ 30 원 생성
λ°˜μ§€λ¦„ 30 원 μ†Œλ©Έ
λ°˜μ§€λ¦„ 1 원 μ†Œλ©Έ

μ†Œλ©Έμž(destructor)
- 객체가 μ†Œλ©Έλ˜λŠ” μ‹œμ μ—μ„œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” 클래슀의 멀버 ν•¨μˆ˜
- μ†Œλ©Έμžμ˜ λͺ©μ μ€ 객체가 μ‚¬λΌμ§ˆ λ•Œ ν•„μš”ν•œ 마무리 μž‘μ—…μ„ μœ„ν•¨(λ©”λͺ¨λ¦¬ μš΄μ˜μ²΄μ œμ— λŒλ¦¬κ±°λ‚˜ 파일 μ €μž₯ λ‹«κΈ°, λ„€νŠΈμ›Œν¬ ν•΄μ œ)
- μƒμ„±λœ λ°˜λŒ€μˆœμœΌλ‘œ 객체가 μ†Œλ©Έλœλ‹€
- μ†Œλ©Έμžμ˜ 이름은 클래슀 이름 μ•žμ— ~을 뢙인닀
- μ†Œλ©ΈμžλŠ” 리턴 νƒ€μž…μ΄ μ—†μœΌλ©° μ–΄λ–€ 값도 λ¦¬ν„΄ν•΄μ„œλŠ” μ•ˆλœλ‹€
- μ†Œλ©ΈμžλŠ” 였직 ν•œ 개만 μ‘΄μž¬ν•˜λ©° λ§€κ°œλ³€μˆ˜λ₯Ό 가지지 μ•ŠλŠ”λ‹€
- μ†Œλ©Έμžκ°€ μ„ μ–Έλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ μ†Œλ©Έμžκ°€ μžλ™μœΌλ‘œ μƒμ„±λœλ‹€
*/

 

🐍 μƒμ„±μž/μ†Œλ©Έμž μ‹€ν–‰ μˆœμ„œ
- ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έλœ κ°μ²΄λ₯Ό μ§€μ—­ κ°μ²΄
- ν•¨μˆ˜ λ°”κΉ₯에 μ„ μ–Έλœ κ°μ²΄λ₯Ό μ „μ—­ κ°μ²΄

지역 κ°μ²΄λŠ” ν•¨μˆ˜κ°€ μ‹€ν–‰λ  λ•Œ μƒμ„±λ˜κ³  ν•¨μˆ˜κ°€ μ’…λ£Œλ  λ•Œ μ†Œλ©Έλ˜μ§€λ§Œ,
μ „μ—­ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ΄ λ‘œλ”©λ  λ•Œ μƒμ„±λ˜κ³  main() μ΄ μ’…λ£Œν•œ λ’€ ν”„λ‘œκ·Έλž¨ λ©”λͺ¨λ¦¬κ°€ μ‚¬λΌμ§ˆ λ•Œ μ†Œλ©Έλœλ‹€
μ „μ—­ κ°μ²΄λ‚˜ μ§€μ—­ κ°μ²΄ λͺ¨λ‘ μƒμ„±λœ μˆœμ„œμ˜ λ°˜λŒ€μˆœμœΌλ‘œ μ†Œλ©Έλœλ‹€

// 지역 객체와 μ „μ—­ 객체의 생성 및 μ†Œλ©Έ μˆœμ„œ
#include <iostream>
using namespace std;

class Circle
{
public:
    int radius;
    Circle();
    Circle(int r);
    ~Circle();
    double getArea();
};

Circle::Circle()
{
    radius = 1;
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
}

Circle::Circle(int r)
{
    radius = r;
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
}

// μ†Œλ©Έμž
Circle::~Circle()
{
    cout << "λ°˜μ§€λ¦„ " << radius << " 원 μ†Œλ©Έ" << endl;
}

double Circle::getArea()
{
    return 3.14 * radius * radius;
}

// μ „μ—­ 객체 생성
Circle globalDonut(1000);
Circle globalPizza(2000);

// 지역 객체 생성
void f()
{
    Circle fDonut(100);
    Circle fPizza(200);
}

int main()
{
    // 지역 객체 생성
    Circle mainDonut;
    Circle mainPizza(30);
    f();
}

/*
λ°˜μ§€λ¦„ 1000 원 생성
λ°˜μ§€λ¦„ 2000 원 생성
λ°˜μ§€λ¦„ 1 원 생성
λ°˜μ§€λ¦„ 30 원 생성
λ°˜μ§€λ¦„ 100 원 생성
λ°˜μ§€λ¦„ 200 원 생성
λ°˜μ§€λ¦„ 200 원 μ†Œλ©Έ
λ°˜μ§€λ¦„ 100 원 μ†Œλ©Έ
λ°˜μ§€λ¦„ 30 원 μ†Œλ©Έ
λ°˜μ§€λ¦„ 1 원 μ†Œλ©Έ
λ°˜μ§€λ¦„ 2000 원 μ†Œλ©Έ
λ°˜μ§€λ¦„ 1000 원 μ†Œλ©Έ

μƒμ„±μž/μ†Œλ©Έμž μ‹€ν–‰ μˆœμ„œ
- ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έλœ 객체λ₯Ό 지역 객체
- ν•¨μˆ˜ λ°”κΉ₯에 μ„ μ–Έλœ 객체λ₯Ό μ „μ—­ 객체

지역 κ°μ²΄λŠ” ν•¨μˆ˜κ°€ 싀행될 λ•Œ μƒμ„±λ˜κ³  ν•¨μˆ˜κ°€ μ’…λ£Œλ  λ•Œ μ†Œλ©Έλ˜μ§€λ§Œ,
μ „μ—­ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ΄ λ‘œλ”©λ  λ•Œ μƒμ„±λ˜κ³  main() 이 μ’…λ£Œν•œ λ’€ ν”„λ‘œκ·Έλž¨ λ©”λͺ¨λ¦¬κ°€ μ‚¬λΌμ§ˆ λ•Œ μ†Œλ©Έλœλ‹€
μ „μ—­ κ°μ²΄λ‚˜ 지역 객체 λͺ¨λ‘ μƒμ„±λœ μˆœμ„œμ˜ λ°˜λŒ€μˆœμœΌλ‘œ μ†Œλ©Έλœλ‹€
*/

 

🐍  컴파일 였λ₯˜κ°€ λ°œμƒν•˜λŠ” κ³³ (μƒμ„±μžλ₯Ό public으둜 ν•΄μ•Όν•œλ‹€!)

β˜‘οΈ μ ‘κ·Ό μ§€μ •μž

객체λ₯Ό μΊ‘μŠν™”ν•˜κ³ , μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•œ κ³΅κ°œ λ©€λ²„와 μ™ΈλΆ€μ˜ μ ‘근을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” λΉ„κ³΅κ°œ λ©€λ²„λ₯Ό κ΅¬λΆ„ν•œλ‹€
λ””ν΄νŠΈ μ ‘κ·Ό 지정은 private (μΊ‘μŠν™”μ˜ κΈ°λ³Έ 원칙이 λΉ„κ³΅κ°œμ΄κΈ° λ•Œλ¬Έ)


- private λ©€λ²„
클래슀 λ‚΄μ˜ λ©€λ²„ ν•¨μˆ˜λ“€μ—κ²Œλ§Œ μ ‘근이 ν—ˆμš©ν•˜μ§€
- public λ©€λ²„
클래슀 λ‚΄μ™Έλ₯Ό λ§‰λ‘ ν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“  ν•¨μˆ˜λ“€μ—κ²Œ μ ‘근이 ν—ˆμš©
- protected λ©€λ²„
클래슀 λ‚΄μ˜ λ©€λ²„ ν•¨μˆ˜μ™€ μ΄ ν΄λž˜μŠ€λ₯Ό μƒμ†λ°›μ€ νŒŒμƒ ν΄λž˜μŠ€μ˜ λ©€λ²„ ν•¨μˆ˜μ—κ²Œλ§Œ μ ‘근이 ν—ˆμš©λ¨

β˜‘οΈ  멀버 λ³΄ν˜Έμ™€ μƒμ„±μž
멀버 λ³€μˆ˜λŠ” private둜 μ§€μ •ν•˜λŠ” κ²ƒμ΄ λ°”λžŒμ§ν•¨
클래슀 μ™ΈλΆ€μ—μ„œ κ°μ²΄λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” μƒμ„±μžλŠ” public으둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€ (그렇지 μ•ŠμœΌλ©΄ μ»΄νŒŒμΌ μ˜€λ₯˜)
BUT, μ™ΈλΆ€μ—μ„œ κ°μ²΄λ₯Ό μƒμ„±ν•  μˆ˜ μ—†λ„둝 μƒμ„±μžλ₯Ό private μœΌλ‘œ μ„ μ–Έν•˜κΈ°λ„ ν•˜κ³ ,
μžμ‹ ν΄λž˜μŠ€μ—μ„œλ§Œ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ„둝 protected λ‘œ μ„ μ–Έν•˜κΈ°λ„ ν•œλ‹€

// 컴파일 였λ₯˜κ°€ λ°œμƒν•˜λŠ” κ³³ (μƒμ„±μžλ₯Ό public으둜 ν•΄μ•Όν•œλ‹€!)
#include <iostream>
using namespace std;

class PrivateAccessError
{
private:
    int a;
    void f();
    PrivateAccessError();

public:
    int b;
    PrivateAccessError(int x);
    void g();
};

PrivateAccessError::PrivateAccessError()
{
    a = 1;
    b = 1;
}

PrivateAccessError::PrivateAccessError(int x)
{
    a = x;
    b = x;
}

void PrivateAccessError::f()
{
    a = 5;
    b = 5;
}

void PrivateAccessError::g()
{
    a = 6;
    b = 6;
}

int main()
{
    // PrivateAccessError()λŠ” private μ΄λ―€λ‘œ main() μ—μ„œ ν˜ΈμΆœν•  수 μ—†μŒ!!!!
    PrivateAccessError objA;
    PrivateAccessError objB(100);
    // aλŠ” PrivateAccessError 클래슀의 private λ©€λ²„μ΄λ―€λ‘œ main() μ—μ„œ ν˜ΈμΆœν•  수 μ—†μŒ!!!!
    objB.a = 10;
    objB.b = 20;
    // f() λŠ” PrivateAccessError 클래슀의 private λ©€λ²„μ΄λ―€λ‘œ main() μ—μ„œ ν˜ΈμΆœν•  수 μ—†μŒ!!!!
    objB.f();
    objB.g();
}

/*
- μ ‘κ·Ό μ§€μ •μž
객체λ₯Ό μΊ‘μŠν™”ν•˜κ³ , μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•œ 곡개 멀버와 μ™ΈλΆ€μ˜ 접근을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” λΉ„κ³΅κ°œ 멀버λ₯Ό κ΅¬λΆ„ν•œλ‹€
λ””ν΄νŠΈ μ ‘κ·Ό 지정은 private (μΊ‘μŠν™”μ˜ κΈ°λ³Έ 원칙이 λΉ„κ³΅κ°œμ΄κΈ° λ•Œλ¬Έ)

- private 멀버
클래슀 λ‚΄μ˜ 멀버 ν•¨μˆ˜λ“€μ—κ²Œλ§Œ 접근이 ν—ˆμš©ν•˜μ§€
- public 멀버
클래슀 λ‚΄μ™Έλ₯Ό λ§‰λ‘ ν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“  ν•¨μˆ˜λ“€μ—κ²Œ 접근이 ν—ˆμš©
- protected 멀버
클래슀 λ‚΄μ˜ 멀버 ν•¨μˆ˜μ™€ 이 클래슀λ₯Ό 상속받은 νŒŒμƒ 클래슀의 멀버 ν•¨μˆ˜μ—κ²Œλ§Œ 접근이 ν—ˆμš©λ¨

- 멀버 λ³΄ν˜Έμ™€ μƒμ„±μž
멀버 λ³€μˆ˜λŠ” private둜 μ§€μ •ν•˜λŠ” 것이 λ°”λžŒμ§ν•¨
클래슀 μ™ΈλΆ€μ—μ„œ 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” μƒμ„±μžλŠ” public으둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€ (그렇지 μ•ŠμœΌλ©΄ 컴파일 였λ₯˜)
BUT, μ™ΈλΆ€μ—μ„œ 객체λ₯Ό 생성할 수 없도둝 μƒμ„±μžλ₯Ό private 으둜 μ„ μ–Έν•˜κΈ°λ„ ν•˜κ³ ,
μžμ‹ ν΄λž˜μŠ€μ—μ„œλ§Œ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ„λ‘ protected 둜 μ„ μ–Έν•˜κΈ°λ„ ν•œλ‹€
*/

 

 

🐍 ν•¨μˆ˜ ν˜ΈμΆœμ— λ”°λ₯Έ μ‹œκ°„ μ˜€λ²„ν—€λ“œ
μ‹œκ°„μ„ λ¬΄μ‹œν•  μˆ˜ μ—†λŠ” λΉ„쀑을 μ°¨μ§€ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€
짧은 μ½”λ“œλ‘œ ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄, ν•¨μˆ˜ ν˜ΈμΆœμ˜ μ˜€λ²„ν—€λ“œκ°€ μƒλŒ€μ μœΌλ‘œ μ»€μ„œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œκ°„이 κΈΈμ–΄μ§€λŠ” γ…γ„΄μΈμ΄ λœλ‹€

 

β˜‘οΈ μΈλΌμΈ ν•¨μˆ˜
짧은 μ½”λ“œλ‘œ κ΅¬μ„±λ„λ‹ˆ ν•¨μˆ˜μ— λŒ€ν•΄, ν•¨μˆ˜ ν˜ΈμΆœ μ˜€λ²„ν—€λ“œλ‘œ μΈν•œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ μ†λ„ μ €ν•˜λ₯Ό λ§‰κΈ° μœ„ν•΄ λ„μž…λœ κΈ°λŠ₯
ν•¨μˆ˜ μ•žμ— inline ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•œλ‹€
μ»΄νŒŒμΌλŸ¬λŠ” μΈλΌμΈ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” κ³³μ— μΈλΌμΈ ν•¨μˆ˜μ˜ μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚½μž…ν•˜μ—¬ ν•¨μˆ˜ ν˜ΈμΆœμ΄ μΌμ–΄λ‚˜μ§€ μ•Šκ²Œ ν•œλ‹€
멀버 λ³€μˆ˜μ˜ κ°’을 μ•Œμ•„λ‚΄κ³  λ©€λ²„ λ³€μˆ˜μ— κ°’을 μ“°λŠ” μ΄λ₯Έλ°” getter/setter λΌλŠ” μž‘은 λ©€λ²„ ν•¨μˆ˜λ“€μ΄ λ§Žμ΄ μ‘΄μž¬ν•œλ‹€
인라인 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” κ³³μ— μΈλΌμΈ ν•¨μˆ˜μ˜ μ½”λ“œλ₯Ό λ‹¨μˆœ μ‚½μž…ν•˜λ―€λ‘œ  ν˜ΈμΆœν•˜λŠ” κ³³μ΄ μ—¬λŸ¬ κ΅°λ° μžˆμœΌλ©΄ κ·Έλ§ŒνΌ μ „체 ν¬κΈ°κ°€ λŠ˜μ–΄λ‚˜λŠ” λ‹¨μ 

 

β˜‘οΈ 멀버 ν•¨μˆ˜μ˜ μΈλΌμΈ μ„ μ–Έκ³Ό μžλ™ μΈλΌμΈ
μƒμ„±μžλ₯Ό ν¬ν•¨ν•˜μ—¬ ν΄λž˜μŠ€μ˜ λͺ¨λ“  λ©€λ²„ ν•¨μˆ˜κ°€ μΈλΌμΈμœΌλ‘œ μ„ μ–Έλ  μˆ˜ μžˆλ‹€
멀버 ν•¨μˆ˜μ˜ ν¬κΈ°κ°€ μž‘은 κ²½μš°, ν΄λž˜μŠ€μ˜ μ„ μ–ΈλΆ€μ— μ§μ ‘ κ΅¬ν˜„ν•˜μ—¬λ„ λ¬΄λ°©ν•˜λ‹€
μ»΄νŒŒμΌλŸ¬λŠ” ν΄λž˜μŠ€μ˜ μ„ μ–ΈλΆ€μ— κ΅¬ν˜„λœ λ©€λ²„ ν•¨μˆ˜λ“€μ— λŒ€ν•΄μ„œ inline μ„ μ–Έμ΄ μ—†μ–΄λ„ μΈλΌμΈ ν•¨μˆ˜λ‘œ μžλ™ μ²˜λ¦¬ν•œλ‹€

β˜‘οΈ C++ ꡬ쑰체
ꡬ쑰체 STRUCT λ₯Ό μ§€μ›ν•œλ‹€
ν΄λž˜μŠ€μ™€ λ™μΌν•œ κ΅¬μ‘°μ™€ κΈ°λŠ₯을 κ°€μ§„λ‹€
struct ν‚€μ›Œλ“œλ₯Ό μ„ μ–Έν•˜λ©°, λ©€λ²„ λ³€μˆ˜μ™€ λ©€λ²„ ν•¨μˆ˜λ₯Ό κ°€μ§€κ³ , μ ‘κ·Ό μ§€μ •λ„ ν•΄μ•Ό ν•œλ‹€

β˜‘οΈ C++ ꡬ쑰체의 객체 생성
ꡬ쑰체 νƒ€μž… λ’€μ— κ°μ²΄ μ΄λ¦„을 μ§€μ •ν•˜λ©΄ λœλ‹€
객체 생성 μ‹œ struct ν‚€μ›Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€

β˜‘οΈ ꡬ쑰체와 클래슀의 차이점
멀버 λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ μƒμ„±μžμ™€ μ†Œλ©Έμž λΉ„λ‘―ν•œ λ©€λ²„ ν•¨μˆ˜λ₯Ό κ°€μ§ˆ μˆ˜ μžˆλ‹€
λ‹€λ₯Έ κ΅¬μ‘°μ²΄λ‚˜ ν΄λž˜μŠ€μ—κ²Œ μƒμ† κ°€λŠ₯ν•˜κ³  λ‹€λ₯Έ κ΅¬μ‘°μ²΄λ‚˜ ν΄λž˜μŠ€λ₯Ό μƒμ†λ°›μ„ μˆ˜ μžˆλ‹€
멀버듀은 μ ‘κ·Ό μ§€μ •μžλ‘œ μ§€μ •λ˜λ©° λ©€λ²„ ν™œμš©λ„ ν΄λž˜μŠ€μ™€ λ™μΌν•˜λ‹€
클래슀의 λ””ν΄νŠΈ μ ‘κ·Ό μ§€μ •μ΄ private λ°˜λ©΄ κ΅¬μ‘°μ²΄λŠ” public μ΄λ‹€

// Circle 클래슀λ₯Ό C++ 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ μž¬μž‘μ„±
#include <iostream>
using namespace std;

// ꡬ쑰체 μ„ μ–Έ
struct StructCircle
{
private:
    int radius;

public:
    // ꡬ쑰체의 μƒμ„±μž
    StructCircle(int r) { radius = r; }
    double getArea();
};

double StructCircle::getArea()
{
    return 3.14 * radius * radius;
}

int main()
{
    StructCircle waffle(3);
    cout << "면적은 " << waffle.getArea();
}

/*
면적은 28.26

- ν•¨μˆ˜ ν˜ΈμΆœμ— λ”°λ₯Έ μ‹œκ°„ μ˜€λ²„ν—€λ“œ
μ‹œκ°„μ„ λ¬΄μ‹œν•  수 μ—†λŠ” 비쀑을 μ°¨μ§€ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€
짧은 μ½”λ“œλ‘œ ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄, ν•¨μˆ˜ 호좜의 μ˜€λ²„ν—€λ“œκ°€ μƒλŒ€μ μœΌλ‘œ μ»€μ„œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œκ°„μ΄ κΈΈμ–΄μ§€λŠ” ㅝㄴ인이 λœλ‹€

- 인라인 ν•¨μˆ˜
짧은 μ½”λ“œλ‘œ κ΅¬μ„±λ„λ‹ˆ ν•¨μˆ˜μ— λŒ€ν•΄, ν•¨μˆ˜ 호좜 μ˜€λ²„ν—€λ“œλ‘œ μΈν•œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 속도 μ €ν•˜λ₯Ό 막기 μœ„ν•΄ λ„μž…λœ κΈ°λŠ₯
ν•¨μˆ˜ μ•žμ— inline ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•œλ‹€
μ»΄νŒŒμΌλŸ¬λŠ” 인라인 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 곳에 인라인 ν•¨μˆ˜μ˜ μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚½μž…ν•˜μ—¬ ν•¨μˆ˜ 호좜이 μΌμ–΄λ‚˜μ§€ μ•Šκ²Œ ν•œλ‹€
멀버 λ³€μˆ˜μ˜ 값을 μ•Œμ•„λ‚΄κ³  멀버 λ³€μˆ˜μ— 값을 μ“°λŠ” 이λ₯Έλ°” getter/setter λΌλŠ” μž‘μ€ 멀버 ν•¨μˆ˜λ“€μ΄ 많이 μ‘΄μž¬ν•œλ‹€
인라인 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 곳에 인라인 ν•¨μˆ˜μ˜ μ½”λ“œλ₯Ό λ‹¨μˆœ μ‚½μž…ν•˜λ―€λ‘œ  ν˜ΈμΆœν•˜λŠ” 곳이 μ—¬λŸ¬ ꡰ데 있으면 그만큼 전체 크기가 λŠ˜μ–΄λ‚˜λŠ” 단점

- 멀버 ν•¨μˆ˜μ˜ 인라인 μ„ μ–Έκ³Ό μžλ™ 인라인
μƒμ„±μžλ₯Ό ν¬ν•¨ν•˜μ—¬ 클래슀의 λͺ¨λ“  멀버 ν•¨μˆ˜κ°€ 인라인으둜 선언될 수 μžˆλ‹€
멀버 ν•¨μˆ˜μ˜ 크기가 μž‘μ€ 경우, 클래슀의 선언뢀에 직접 κ΅¬ν˜„ν•˜μ—¬λ„ λ¬΄λ°©ν•˜λ‹€
μ»΄νŒŒμΌλŸ¬λŠ” 클래슀의 선언뢀에 κ΅¬ν˜„λœ 멀버 ν•¨μˆ˜λ“€μ— λŒ€ν•΄μ„œ inline 선언이 없어도 인라인 ν•¨μˆ˜λ‘œ μžλ™ μ²˜λ¦¬ν•œλ‹€

- C++ ꡬ쑰체
ꡬ쑰체 STRUCT λ₯Ό μ§€μ›ν•œλ‹€
ν΄λž˜μŠ€μ™€ λ™μΌν•œ ꡬ쑰와 κΈ°λŠ₯을 가진닀
struct ν‚€μ›Œλ“œλ₯Ό μ„ μ–Έν•˜λ©°, 멀버 λ³€μˆ˜μ™€ 멀버 ν•¨μˆ˜λ₯Ό 가지고, μ ‘κ·Ό 지정도 ν•΄μ•Ό ν•œλ‹€

- C++ ꡬ쑰체의 객체 생성
ꡬ쑰체 νƒ€μž… 뒀에 객체 이름을 μ§€μ •ν•˜λ©΄ λœλ‹€
객체 μƒˆμ—‡γ…‡ μ‹œ struct ν‚€μ›Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€

- ꡬ쑰체와 클래슀의 차이점
멀버 λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ μƒμ„±μžμ™€ μ†Œλ©Έμž λΉ„λ‘―ν•œ 멀버 ν•¨μˆ˜λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€
λ‹€λ₯Έ κ΅¬μ‘°μ²΄λ‚˜ ν΄λž˜μŠ€μ—κ²Œ 상속 κ°€λŠ₯ν•˜κ³  λ‹€λ₯Έ κ΅¬μ‘°μ²΄λ‚˜ 클래슀λ₯Ό 상속받을 수 μžˆλ‹€
멀버듀은 μ ‘κ·Ό μ§€μ •μžλ‘œ μ§€μ •λ˜λ©° 멀버 ν™œμš©λ„ ν΄λž˜μŠ€μ™€ λ™μΌν•˜λ‹€
클래슀의 λ””ν΄νŠΈ μ ‘κ·Ό 지정이 private 반면 κ΅¬μ‘°μ²΄λŠ” public 이닀
*/
728x90
λ°˜μ‘ν˜•
Comments