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

[객체의 μ°Έμ‘°, 볡사 μƒμ„±μž] ν•¨μˆ˜ 호좜 μ‹œ 객체 전달 λ³Έλ¬Έ

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

[객체의 μ°Έμ‘°, 볡사 μƒμ„±μž] ν•¨μˆ˜ 호좜 μ‹œ 객체 전달

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

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

 

🐍 ν•¨μˆ˜ ν˜ΈμΆœ μ‹œ κ°μ²΄ μ „달
β˜‘οΈ 1) 값에 μ˜ν•œ 호좜 κ³Όμ •
ν•¨μˆ˜ μ•ˆμ—μ„œ λ§€κ°œ λ³€μˆ˜ κ°μ²΄μ— μ–΄λ–€ λ³€ν™”κ°€ μΌμ–΄λ‚˜λ„ μ‹€μΈμž (원본 κ°μ²΄) λ₯Ό ν›Όμ†μ‹œν‚€μ§€ μ•ŠλŠ” μž₯점
μ‹€μΈμž κ°μ²΄μ˜ ν¬κΈ°κ°€ ν¬λ©΄ κ°μ²΄λ₯Ό λ³΅μ‚¬ν•˜λŠ” μ‹œκ°„이 μ»€μ§€λŠ” λ‹¨μ 

객체가 ν•¨μˆ˜μ— μ „λ‹¬λ˜λ©΄, ν•¨μˆ˜μ˜ λ§€κ°œ λ³€μˆ˜ κ°μ²΄κ°€ μƒμ„±λ˜κ³ , ν•¨μˆ˜κ°€ μ’…λ£Œν•˜λ©΄ λ§€κ°œ λ³€μˆ˜ κ°μ²΄κ°€ μ†Œλ©Έλœλ‹€
맀개 λ³€μˆ˜ κ°μ²΄μ˜ μƒμ„±μžμ™€ μ†Œλ©Έμžκ°€ λͺ¨λ‘ μ‹€ν–‰λ˜λŠ”κ°€? -> μ•„λ‹ˆλ‹€
객체λ₯Ό λ§€κ°œ λ³€μˆ˜λ‘œ κ°€μ§€λŠ” ν•¨μˆ˜μ˜ κ²½μš° C++ μ»΄νŒŒμΌλŸ¬λŠ” λ§€κ°œ λ³€μˆ˜ κ°μ²΄μ˜ μƒμ„±μžλŠ” μ‹€ν–‰λ˜μ§€ μ•Šκ³  μ†Œλ©Έμžλ§Œ μ‹€ν–‰λ˜λ„둝 μ»΄νŒŒμΌ ν•œλ‹€

μ»΄νŒŒμΌλŸ¬λŠ” λ§€κ°œ λ³€μˆ˜ κ°μ²΄μ˜ μƒμ„±μžκ°€ μ‹€ν–‰λ˜μ§€ μ•Šλ„둝 ν•œλ‹€
μ†Œλ©Έμžμ˜ κ²½μš°λŠ” λ‹€λ₯΄λ‹€

맀개 λ³€μˆ˜ κ°μ²΄μ˜ μƒμ„±μžκ°€ μ‹€ν–‰λ˜μ§€ γ…‡λ‚³κ³  μ†Œλ©Έμžλ§Œ μ‹€ν–‰λ˜λŠ” λΉ„λŒ€μΉ­ κ΅¬μ‘°λŠ”, ν•¨μˆ˜ ν˜ΈμΆœ μ‹œ μ›λ³Έ κ°μ²΄μ˜ μƒνƒœλ₯Ό κ·Έλž˜λ„ λ§€κ°œ λ³€μˆ˜ κ°μ²΄μ— μ „λ‹¬λ˜λ‘œκ³  ν•˜κΈ° μœ„ν•œ κ²ƒ

🚨 볡사 μƒμ„±μž
값에 μ˜ν•œ ν˜ΈμΆœ μ‹œ μ»΄νŒŒμΌλŸ¬λŠ” λ§€κ°œ λ³€μˆ˜ κ°μ²΄μ˜ μƒμ„±μž λŒ€μ‹  λ³΅μ‚¬ μƒμ„±μžκ°€ ν˜ΈμΆœλ˜λ„둝 μ»΄νŒŒμΌν•˜κΈ° λ•Œλ¬Έμ— μƒμ„±μžκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” κ²ƒμ΄λ‹€
μ»΄νŒŒμΌλŸ¬λŠ” ν΄λž˜μŠ€μ— λ³΅μ‚¬ μƒμ„±μžκ°€ μž‘μ„±λ˜μ–΄ μžˆμ§€ μ•Šμ€ κ²½μš°, μ‹€μΈμž κ°μ²΄μ˜ λ©€λ²„ λ³€μˆ˜λ₯Ό 1:1둜 λ§€κ°œ λ³€μˆ˜ κ°μ²΄μ— λ³΅μ‚¬ν•˜λŠ” λ””ν΄νŠΈ λ³΅μ‚¬ μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ μ‚½μž…ν•œλ‹€

β˜‘οΈ 2) μ£Όμ†Œμ— μ˜ν•œ ν˜ΈμΆœ κ³Όμ •
ν•¨μˆ˜ ν˜ΈμΆœ μ‹œ κ°μ²΄λ₯Ό ν†΅μ§Έλ‘œ λ³΅μ‚¬ν•˜μ—¬ λ„˜κΈ°λŠ” κ°’에 μ˜ν•œ ν˜ΈμΆœ λŒ€μ‹ ,
객체의 μ£Όμ†Œλ§Œ μ „λ‹¬ν•˜λŠ” μ£Όμ†Œμ˜ μ˜ν•œ ν˜ΈμΆœλ˜λ„둝 ν•¨

원본 κ°μ²΄λ₯Ό ν†΅μ§Έλ‘œ μ „λ‹¬ν•˜λŠ” κ°’에 μ˜ν•œ ν˜ΈμΆœμ— λΉ„ν•΄, μ›λ³Έ κ°μ²΄λ₯Ό λ³΅μ‚¬ν•˜λŠ” μ‹œκ°„ μ†Œλͺ¨κ°€ μ—†μŒ
맀개 λ³€μˆ˜κ°€ λ‹€λˆˆ ν¬μΈν„°μ΄λ―€λ‘œ, μƒμ„±μž μ†Œλ©Έμžμ˜ λΉ„λŒ€μΉ­μ˜ λ¬Έμ œλ„ μ—†λ‹€
ν•˜μ§€λ§Œ, λ§€κ°œ λ³€μˆ˜ ν¬μΈν„°λ‘œ μ˜λ„ν•˜μ§€ μ•Šκ²Œ μ›λ³Έ κ°μ²΄λ₯Ό ν›Όμ†ν•  κ°€λŠ₯성이 μžˆκΈ° λ•Œλ¬Έμ— μ‘°μ‹¬ν•œλ‹€

// 값에 μ˜ν•œ 호좜 μ‹œ 맀개 λ³€μˆ˜μ˜ μƒμ„±μž μ‹€ν–‰λ˜μ§€ μ•ŠμŒ
#include <iostream>
using namespace std;

class Circle
{
private:
    int radius;

public:
    Circle();
    Circle(int r);
    ~Circle();
    double getArea() { return 3.14 * radius * radius; }
    int getRadius() { return radius; }
    void setRadius(int radius) { this->radius = radius; }
};

Circle::Circle()
{
    radius = 1;
    cout << "μƒμ„±μž μ‹€ν–‰ radius = " << radius << endl;
}

Circle::Circle(int radius)
{
    this->radius = radius;
    cout << "μƒμ„±μž μ‹€ν–‰ radius = " << radius << endl;
}

Circle::~Circle()
{
    cout << "μ†Œλ©Έμž μ‹€ν–‰ radius = " << radius << endl;
}

// 객체 c 의 μƒμ„±μž μ‹€ν–‰λ˜μ§€ μ•ŠμŒ + 객체 c 의 μ†Œλ©Έμž 싀행됨
void increase(Circle c)
{
    int r = c.getRadius();
    c.setRadius(r + 1);
}

int main()
{
    Circle waffle(30);
    // μƒμ„±μž ν˜ΈμΆœμ€ μ•ˆλ˜κ³ , μ†Œλ©Έμž ν˜ΈμΆœμ€ λœλ‹€
    increase(waffle);
    cout << waffle.getRadius() << endl;
}

/*
μƒμ„±μž μ‹€ν–‰ radius = 30
μ†Œλ©Έμž μ‹€ν–‰ radius = 31
30
μ†Œλ©Έμž μ‹€ν–‰ radius = 30
*/

/*
- ν•¨μˆ˜ 호좜 μ‹œ 객체 전달
1) 값에 μ˜ν•œ 호좜 κ³Όμ •
ν•¨μˆ˜ μ•ˆμ—μ„œ 맀개 λ³€μˆ˜ 객체에 μ–΄λ–€ λ³€ν™”κ°€ μΌμ–΄λ‚˜λ„ μ‹€μΈμž (원본 객체) λ₯Ό ν›Όμ†μ‹œν‚€μ§€ μ•ŠλŠ” μž₯점
μ‹€μΈμž 객체의 크기가 크면 객체λ₯Ό λ³΅μ‚¬ν•˜λŠ” μ‹œκ°„μ΄ μ»€μ§€λŠ” 단점

객체가 ν•¨μˆ˜μ— μ „λ‹¬λ˜λ©΄, ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜ 객체가 μƒμ„±λ˜κ³ , ν•¨μˆ˜κ°€ μ’…λ£Œν•˜λ©΄ 맀개 λ³€μˆ˜ 객체가 μ†Œλ©Έλœλ‹€
맀개 λ³€μˆ˜ 객체의 μƒμ„±μžμ™€ μ†Œλ©Έμžκ°€ λͺ¨λ‘ μ‹€ν–‰λ˜λŠ”κ°€? -> μ•„λ‹ˆλ‹€
객체λ₯Ό 맀개 λ³€μˆ˜λ‘œ κ°€μ§€λŠ” ν•¨μˆ˜μ˜ 경우 C++ μ»΄νŒŒμΌλŸ¬λŠ” 맀개 λ³€μˆ˜ 객체의 μƒμ„±μžλŠ” μ‹€ν–‰λ˜μ§€ μ•Šκ³  μ†Œλ©Έμžλ§Œ μ‹€ν–‰λ˜λ„λ‘ 컴파일 ν•œλ‹€

μ»΄νŒŒμΌλŸ¬λŠ” 맀개 λ³€μˆ˜ 객체의 μƒμ„±μžκ°€ μ‹€ν–‰λ˜μ§€ μ•Šλ„λ‘ ν•œλ‹€
μ†Œλ©Έμžμ˜ κ²½μš°λŠ” λ‹€λ₯΄λ‹€

맀개 λ³€μˆ˜ 객체의 μƒμ„±μžκ°€ μ‹€ν–‰λ˜μ§€ γ…‡λ‚³κ³  μ†Œλ©Έμžλ§Œ μ‹€ν–‰λ˜λŠ” λΉ„λŒ€μΉ­ κ΅¬μ‘°λŠ”, ν•¨μˆ˜ 호좜 μ‹œ 원본 객체의 μƒνƒœλ₯Ό κ·Έλž˜λ„ 맀개 λ³€μˆ˜ 객체에 μ „λ‹¬λ˜λ‘œκ³  ν•˜κΈ° μœ„ν•œ 것

@볡사 μƒμ„±μž
값에 μ˜ν•œ 호좜 μ‹œ μ»΄νŒŒμΌλŸ¬λŠ” 맀개 λ³€μˆ˜ 객체의 μƒμ„±μž λŒ€μ‹  볡사 μƒμ„±μžκ°€ ν˜ΈμΆœλ˜λ„λ‘ μ»΄νŒŒμΌν•˜κΈ° λ•Œλ¬Έμ— μƒμ„±μžκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” 것이닀
μ»΄νŒŒμΌλŸ¬λŠ” ν΄λž˜μŠ€μ— 볡사 μƒμ„±μžκ°€ μž‘μ„±λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우, μ‹€μΈμž 객체의 멀버 λ³€μˆ˜λ₯Ό 1:1둜 맀개 λ³€μˆ˜ 객체에 λ³΅μ‚¬ν•˜λŠ” λ””ν΄νŠΈ 볡사 μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ μ‚½μž…ν•œλ‹€

2) μ£Όμ†Œμ— μ˜ν•œ 호좜 κ³Όμ •
ν•¨μˆ˜ 호좜 μ‹œ 객체λ₯Ό ν†΅μ§Έλ‘œ λ³΅μ‚¬ν•˜μ—¬ λ„˜κΈ°λŠ” 값에 μ˜ν•œ 호좜 λŒ€μ‹ ,
객체의 μ£Όμ†Œλ§Œ μ „λ‹¬ν•˜λŠ” μ£Όμ†Œμ˜ μ˜ν•œ ν˜ΈμΆœλ˜λ„λ‘ 함

원본 객체λ₯Ό ν†΅μ§Έλ‘œ μ „λ‹¬ν•˜λŠ” 값에 μ˜ν•œ ν˜ΈμΆœμ— λΉ„ν•΄, 원본 객체λ₯Ό λ³΅μ‚¬ν•˜λŠ” μ‹œκ°„ μ†Œλͺ¨κ°€ μ—†μŒ
맀개 λ³€μˆ˜κ°€ λ‹€λˆˆ ν¬μΈν„°μ΄λ―€λ‘œ, μƒμ„±μž μ†Œλ©Έμžμ˜ λΉ„λŒ€μΉ­μ˜ λ¬Έμ œλ„ μ—†λ‹€
ν•˜μ§€λ§Œ, 맀개 λ³€μˆ˜ ν¬μΈν„°λ‘œ μ˜λ„ν•˜μ§€ μ•Šκ²Œ 원본 객체λ₯Ό 훼손할 κ°€λŠ₯성이 있기 λ•Œλ¬Έμ— μ‘°μ‹¬ν•œλ‹€
*/

 

728x90
λ°˜μ‘ν˜•
Comments