[C++] return value

hyng·2023년 2월 28일
0

열혈 c++ 프로그래밍에는 oop 단계별 프로젝트가 있다. 간단하게 '은행 계좌 관리 프로그램'을 만드는 것인데 구현 중에 의도한 대로 동작하지 않았던 부분이 있었다.

입금 기능의 경우 계좌 id를 입력받아 계좌를 찾고 입력 금액만큼 계좌의 잔액을 업데이트한다.

    void Deposit() {
        int id, money;

        cout << "[입   금]\n";
        cout << "계좌ID: ";
        cin >> id;
        cout << "입금액: ";
        cin >> money;
        Account account = Find(id);
        account.Deposit(money);
        cout << "입금완료\n";
    }
    Account Find(int id) {
        for (int i = 0; i < index; i++) {
            if (accounts[i].IsSame(id)) {
                return accounts[i];
            }
        }
    }
    void Deposit(int money) {
        this->balance += money;
    }

간단하게 배열에서 해당 id 값을 가지는 계좌를 찾아서 금액을 증액 시킨다.

주요 코드는 위와 같고 전체 코드는 아래와 같다.

#include <iostream>
using namespace std;

class Account{
private:
    int id;
    int balance;
    char name[20];
    Account(int id, int balance, char name[20]) {
        this->id = id;
        this->balance = balance;
        ::strcpy(this->name, name);
    }
public:
    Account() {

    }
    static Account Of(int _id, int _balance, char _name[20]) {
        return Account(_id, _balance, _name);
    }
    bool IsSame(int id) {
        return this->id == id;
    }
    void Deposit(int money) {
        this->balance += money;
    }

    void Withdraw(int money) {
        if (this->balance < money) {
            cout << "잔액부족\n";
            return;
        }
        this->balance -= money;
        cout << "출금완료\n";
    }
    void ShowInfo() {
        cout << "계좌ID: " << id << "\n";
        cout << "이 름: " << name << "\n";
        cout << "잔 액: " << balance << "\n";
    }
};

class Accounts {
private:
    static const int SIZE = 100;
    Account accounts[SIZE];
    int index = 0;
    Account Find(int id) {
        for (int i = 0; i < index; i++) {
            if (accounts[i].IsSame(id)) {
                return accounts[i];
            }
        }
    }
public:
    void Make() {
        int id, balance;
        char name[20];

        cout << "[계좌개설]\n";
        cout << "계좌ID: ";
        cin >> id;
        cout << "이 름: ";
        cin >> name;
        cout << "입금액: ";
        cin >> balance;

        Account account = Account::Of(id, balance, name);
        accounts[index++] = account;
        cout << "\n";
    }

    void Deposit() {
        int id, money;

        cout << "[입   금]\n";
        cout << "계좌ID: ";
        cin >> id;
        cout << "입금액: ";
        cin >> money;
        Account account = Find(id);
        account.Deposit(money);
        cout << "입금완료\n\n";
    }

    void Withdraw() {
        int money;
        int id;
        cout << "[출   금]\n";
        cout << "계좌ID: ";
        cin >> id;
        cout << "출금액: ";
        cin >> money;

        Account account = Find(id);
        account.Withdraw(money);
    }
    void Inquire() {
        for (int i = 0; i < index; i++) {
            accounts[i].ShowInfo();
        }
    }
};

class Program {
private:
    enum {
        MAKE=1, DEPOSIT, WITHDRAW, INQUIRE, EXIT
    };
    void ShowMenu() {
        cout << " 1. 계좌개설\n 2. 입금\n 3. 출금\n 4. 계좌정보 전체 출력\n 5. 프로그램 종료\n 선택: ";
    }
public:
    void Start() {
        Accounts accounts;
        while (true) {
            ShowMenu();
            int choice;
            cin >> choice;
            switch(choice) {
                case MAKE:
                    accounts.Make();
                    break;
                case DEPOSIT:
                    accounts.Deposit();
                    break;
                case WITHDRAW:
                    accounts.Withdraw();
                    break;
                case INQUIRE:
                    accounts.Inquire();
                    break;
                case EXIT:
                    break;
            }
        }
    }
};

int main() {
    Program program;
    program.Start();
}

근데 이상하게 분명 balance에 money를 더해줬음에도 불구하고
확인해 보면 더해져 있지가 않았다..

뭔가 이상해서 객체의 주소값을 찍어봤다.

    void Deposit() {
        int id, money;

        cout << "[입   금]\n";
        cout << "계좌ID: ";
        cin >> id;
        cout << "입금액: ";
        cin >> money;
        Account account = Find(id);
        account.Deposit(money);
        cout << &account << "\n";
        cout << &accounts[0] << "\n";
        cout << "입금완료\n\n";
    }


확인해 보니 배열에서 찾아오는 계좌 객체와 배열에 저장된 객체가 달랐다.

검색해 보니 c++에서는 단순하게 객체를 반환할 경우 저장된 '값'만 복사해서 반환하기 때문에 동일한 객체에 접근하기 위해서는 '주소값'을 반환해 주어야 한다고 한다.

주소값을 받도록 변경하고, 테스트를 해보면 값이 제대로 나오는 것을 확인할 수 있다.


    void Deposit() {
        int id, money;

        cout << "[입   금]\n";
        cout << "계좌ID: ";
        cin >> id;
        cout << "입금액: ";
        cin >> money;
        Account& account = Find(id);
        account.Deposit(money);
        cout << &account << "\n";
        cout << &accounts[0] << "\n";
        cout << "입금완료\n\n";
    }
    Account& Find(int id) {
        for (int i = 0; i < index; i++) {
            if (accounts[i].IsSame(id)) {
                return accounts[i];
            }
        }
    }

profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글