個人的な備忘録：Python のクラスとオブジェクトを使ってシンプルな家計簿を作り、アウトプットしてみた

## はじめに

このプログラムは、Python を使って **シンプルな家計簿アプリ** を実装したものです。

:::note info
**ユーザーが支出を登録し、その合計を計算・確認できるようになっています。**
:::

Python の **クラス設計** や **リスト操作**、**ループ処理** などの基礎を学ぶのにも適した内容です。

## 書こうと思ったきっかけ

日常の支出を記録する簡単な仕組みがあれば便利だと考え、Python の **オブジェクト指向** を活かして作成してみました。

また、**クラスを活用したデータ管理** や **リストを用いた集計処理** を実践的に学ぶ機会としても良い題材だと思い、このプログラムを作成しました。

## 完成したコード

```test.py
class Expense:
    def __init__(self, category, amount):
        self.category = category
        self.amount = amount

class Budget:
    def __init__(self):
        self.expenses = []

    def add_expense(self, category, amount):
        self.expenses.append(Expense(category, amount))

    def total_spent(self):
        return sum(expense.amount for expense in self.expenses)

    def show_expenses(self):
        print("\n=== 家計簿 ===")
        for expense in self.expenses:
            print(f"{expense.category}: ¥{expense.amount}")
        print(f"合計支出: ¥{self.total_spent()}")

budget = Budget()
while True:
    action = input("\n支出を追加(a) / 確認(s) / 終了(q): ").lower()
    if action == "a":
        category = input("カテゴリーを入力してください: ")
        amount = int(input("金額を入力してください: "))
        budget.add_expense(category, amount)
        print("支出を追加しました！")
    elif action == "s":
        budget.show_expenses()
    elif action == "q":
        break
    else:
        print("無効な入力です。")
```

### コードの流れ

このコードは **シンプルな家計簿アプリ** で、ユーザーが支出を記録し、合計金額を確認できる仕組みになっています。

動作の流れは次のとおりです。

**クラスの定義**
- **`Expense` クラス**  
  - 支出のカテゴリと金額を管理。

- **`Budget` クラス**  
  - 家計簿の管理、支出の追加、合計計算、表示を担当。

**ユーザーの操作**
- **`while True` ループでユーザーに選択肢を提示。**
- **入力に応じた処理を実行**
  - `"a"` → **支出を追加**（カテゴリと金額を入力し、リストに追加）
  - `"s"` → **支出一覧を表示**（登録済みの支出と合計金額を表示）
  - `"q"` → **プログラムを終了**（`break` でループを抜ける）
  - **その他** → **無効な入力としてエラーメッセージを表示。**

このように、シンプルな操作で **家計簿を管理** できる仕組みになっています。

## 実際に実行してみる
まず、以下のコマンドを実行して作成したコードの動作を確認します。

```bash
python test.py
```

**実行結果**

```bash
 ~/Desktop ((git)-[main])  python test.py

支出を追加(a) / 確認(s) / 終了(q): a
カテゴリーを入力してください: ラーメン
金額を入力してください: 1200
支出を追加しました！

支出を追加(a) / 確認(s) / 終了(q): a
カテゴリーを入力してください: 牛丼
金額を入力してください: 650
支出を追加しました！

支出を追加(a) / 確認(s) / 終了(q): s

=== 家計簿 ===
ラーメン: ¥1200
牛丼: ¥650
合計支出: ¥1850

支出を追加(a) / 確認(s) / 終了(q):
```

**実際の画面**

![Screenshot 2025-02-05 at 9.00.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c6a1bcb3-01f0-7dd8-5be8-264fce139239.png)

## コードの解説
### クラスの定義

```py
class Expense:
    def __init__(self, category, amount):
        self.category = category
        self.amount = amount
```

- **`category`（カテゴリ）と`amount`（金額）を管理するクラス。**
- **コンストラクタ `__init__()` で、カテゴリと金額を設定する。**

```py
class Budget:
    def __init__(self):
        self.expenses = []
```

- **支出データを管理するリスト (`self.expenses`) を初期化。**

### 家計簿の機能

```py
def add_expense(self, category, amount):
    self.expenses.append(Expense(category, amount))
```

- **ユーザーが入力したカテゴリと金額を `Expense` のインスタンスとして追加。**

```py
def total_spent(self):
    return sum(expense.amount for expense in self.expenses)
```

- **登録された支出の合計金額を計算して返す。**

```py
def show_expenses(self):
    print("\n=== 家計簿 ===")
    for expense in self.expenses:
        print(f"{expense.category}: ¥{expense.amount}")
    print(f"合計支出: ¥{self.total_spent()}")
```

- 登録された支出一覧と合計金額を表示。

### ユーザーの操作

```py
while True:
    action = input("\n支出を追加(a) / 確認(s) / 終了(q): ").lower()
```

- 無限ループでユーザーの入力を受け付け、小文字 (`.lower()`) に統一。

```py
if action == "a":
    category = input("カテゴリーを入力してください: ")
    amount = int(input("金額を入力してください: "))
    budget.add_expense(category, amount)
    print("支出を追加しました！")
```

カテゴリと金額を入力し、`add_expense()` でリストに追加。

```py
elif action == "s":
    budget.show_expenses()
```

- 支出一覧と合計を表示。

```py
elif action == "q":
    break
```

- `break` でループを抜け、プログラムを終了。

```py
else:
    print("無効な入力です。")
```

- **`a`、`s`、`q` 以外の入力はエラーメッセージを表示。**

## まとめ
最後までお読みいただき、ありがとうございました。***Python のクラスとオブジェクトを使ってシンプルな家計簿を作ることで、関数の仕組みや活用方法への理解が深まりました。***

今後も、このような基礎的な内容を分かりやすく整理し、丁寧にまとめていこうと思います。