メインコンテンツへスキップ
レッスン 10 / 15推定時間: 25

設計図と実物:クラスとオブジェクトの関係

車の設計図から実際の車を作るように、プログラムでも「設計図(クラス)」から「実物(オブジェクト)」を作ります。現実世界の物事をプログラムで表現する方法を学びましょう!

はじめに

これまで学んだことを振り返ると:

  • 変数:1つの箱に1つのデータ
  • 配列:番号付きのたくさんの箱

でも、現実世界のものはもっと複雑ですよね。

例えば「人間」を表現したいとき:

  • 名前
  • 年齢
  • 身長
  • 体重
  • 好きな食べ物

これらをバラバラに管理するのは大変...

そこで登場するのが「クラス」と「オブジェクト」です!

クラスとオブジェクトって何?

身の回りの例で理解しよう

🏭 設計図と実物の関係

車の例

  • 設計図(クラス):車の作り方が書いてある図面
  • 実際の車(オブジェクト):工場で作られた本物の車

クッキーの例

  • クッキー型(クラス):星型、ハート型などの型
  • 焼いたクッキー(オブジェクト):型で作った実際のクッキー

家の例

  • 建築図面(クラス):家の設計図
  • 建てた家(オブジェクト):実際に住める家

つまり:

  • クラス = 設計図、型、ひな形
  • オブジェクト = クラスから作った実物

基本的な使い方

クラスを作る(設計図を描く)

// 「ペット」クラスを作る
クラス ペット {
    // ペットが持つ情報(属性)
    名前
    種類
    年齢
    
    // ペットができること(メソッド)
    鳴く() {
        もし 種類 == "犬" なら
            返す "ワンワン!"
        そうでなければ もし 種類 == "猫" なら
            返す "ニャー!"
    }
    
    自己紹介() {
        返す "私は" + 名前 + "です。" + 年齢 + "歳の" + 種類 + "です。"
    }
}

オブジェクトを作る(実物を作る)

// ペットクラスから実際のペットを作る
私のペット1 = 新しい ペット()
私のペット1.名前 = "ポチ"
私のペット1.種類 = "犬"
私のペット1.年齢 = 3

私のペット2 = 新しい ペット()
私のペット2.名前 = "タマ"
私のペット2.種類 = "猫"
私のペット2.年齢 = 2

// 使ってみる
私のペット1.自己紹介()  // "私はポチです。3歳の犬です。"
私のペット1.鳴く()      // "ワンワン!"

私のペット2.自己紹介()  // "私はタマです。2歳の猫です。"
私のペット2.鳴く()      // "ニャー!"

もっと実践的な例

1. 生徒クラス

クラス 生徒 {
    // 属性
    名前
    学年
    出席番号
    テストの点数 = []  // 配列も使える!
    
    // メソッド
    テストを受ける(点数) {
        テストの点数.追加(点数)
        "テストで" + 点数 + "点を取りました"
    }
    
    平均点を計算() {
        もし テストの点数.長さ == 0 なら
            返す 0
        
        合計 = 0
        テストの点数の各点数 に対して繰り返す:
            合計 = 合計 + 点数
        
        返す 合計 ÷ テストの点数.長さ
    }
    
    成績表() {
        平均 = 平均点を計算()
        "名前:" + 名前
        "学年:" + 学年 + "年生"
        "平均点:" + 平均 + "点"
    }
}

// 使ってみる
太郎くん = 新しい 生徒()
太郎くん.名前 = "山田太郎"
太郎くん.学年 = 5
太郎くん.出席番号 = 15

太郎くん.テストを受ける(85)
太郎くん.テストを受ける(92)
太郎くん.テストを受ける(78)

太郎くん.成績表()

2. ゲームキャラクタークラス

クラス キャラクター {
    // 属性
    名前
    レベル = 1
    HP = 100
    最大HP = 100
    攻撃力 = 10
    経験値 = 0
    
    // メソッド
    攻撃する(敵) {
        ダメージ = ランダム(攻撃力 - 2, 攻撃力 + 2)
        敵.ダメージを受ける(ダメージ)
        名前 + "の攻撃!" + ダメージ + "のダメージ!"
    }
    
    ダメージを受ける(ダメージ量) {
        HP = HP - ダメージ量
        もし HP < 0 なら
            HP = 0
        
        名前 + "は" + ダメージ量 + "のダメージを受けた!"
        "残りHP:" + HP + "/" + 最大HP
    }
    
    レベルアップ() {
        レベル = レベル + 1
        最大HP = 最大HP + 20
        HP = 最大HP  // 全回復
        攻撃力 = 攻撃力 + 5
        
        "レベルアップ!レベル" + レベル + "になった!"
    }
}

// 戦闘シミュレーション
勇者 = 新しい キャラクター()
勇者.名前 = "ゆうしゃ"

スライム = 新しい キャラクター()
スライム.名前 = "スライム"
スライム.HP = 30
スライム.最大HP = 30
スライム.攻撃力 = 5

// 戦闘開始!
勇者.攻撃する(スライム)
スライム.攻撃する(勇者)

3. 銀行口座クラス

クラス 銀行口座 {
    // 属性
    口座番号
    名義人
    残高 = 0
    取引履歴 = []
    
    // メソッド
    入金(金額) {
        もし 金額 <= 0 なら
            返す "エラー:正しい金額を入力してください"
        
        残高 = 残高 + 金額
        取引履歴.追加("入金:+" + 金額 + "円")
        返す "入金完了。残高:" + 残高 + "円"
    }
    
    出金(金額) {
        もし 金額 > 残高 なら
            返す "エラー:残高不足です"
        
        残高 = 残高 - 金額
        取引履歴.追加("出金:-" + 金額 + "円")
        返す "出金完了。残高:" + 残高 + "円"
    }
    
    明細を見る() {
        "=== " + 名義人 + "様の口座明細 ==="
        "口座番号:" + 口座番号
        "現在の残高:" + 残高 + "円"
        
        "--- 取引履歴 ---"
        取引履歴の各履歴 に対して繰り返す:
            履歴
    }
}

// 使ってみる
私の口座 = 新しい 銀行口座()
私の口座.口座番号 = "123-456789"
私の口座.名義人 = "山田太郎"

私の口座.入金(10000)
私の口座.出金(3000)
私の口座.入金(5000)
私の口座.明細を見る()

クラスの継承(発展的な内容)

基本クラスを拡張する

// 基本となる「動物」クラス
クラス 動物 {
    名前
    年齢
    
    食べる() {
        名前 + "が食事をしています"
    }
    
    寝る() {
        名前 + "が寝ています"
    }
}

// 動物クラスを継承した「犬」クラス
クラス 犬 は 動物 を継承 {
    犬種
    
    吠える() {
        "ワンワン!"
    }
    
    散歩する() {
        名前 + "と散歩に行きます"
    }
}

// 動物クラスを継承した「猫」クラス
クラス 猫 は 動物 を継承 {
    毛の色
    
    鳴く() {
        "ニャーニャー"
    }
    
    毛づくろい() {
        名前 + "が毛づくろいしています"
    }
}

// 使ってみる
我が家の犬 = 新しい ()
我が家の犬.名前 = "マロン"
我が家の犬.年齢 = 5
我が家の犬.犬種 = "柴犬"

我が家の犬.食べる()    // 動物クラスのメソッドも使える!
我が家の犬.吠える()    // 犬クラス独自のメソッド
我が家の犬.散歩する()

よくある間違いと対処法

間違い1:クラスとオブジェクトを混同

// ❌ 間違い
ペット.名前 = "ポチ"  // クラスに直接値を入れようとしている

// ✅ 正解
私のペット = 新しい ペット()  // まずオブジェクトを作る
私のペット.名前 = "ポチ"      // オブジェクトに値を入れる

間違い2:メソッドの呼び出し忘れ

// ❌ 間違い
私のペット.自己紹介  // ()を忘れている

// ✅ 正解
私のペット.自己紹介()  // メソッドは()をつけて呼び出す

練習問題

問題1:商品クラスを作る

お店の商品を管理するクラスを作ってください。

  • 商品名、価格、在庫数を管理
  • 購入メソッド(在庫を減らす)
  • 入荷メソッド(在庫を増やす)
  • 在庫確認メソッド
答えを見る
クラス 商品 {
    商品名
    価格
    在庫数 = 0
    
    購入(個数) {
        もし 個数 > 在庫数 なら
            返す "在庫不足です。現在の在庫:" + 在庫数 + "個"
        
        在庫数 = 在庫数 - 個数
        合計金額 = 価格 × 個数
        
        返す 商品名 + "を" + 個数 + "個購入しました。合計:" + 合計金額 + "円"
    }
    
    入荷(個数) {
        在庫数 = 在庫数 + 個数
        返す 商品名 + "を" + 個数 + "個入荷しました。現在の在庫:" + 在庫数 + "個"
    }
    
    在庫確認() {
        返す 商品名 + ":" + 価格 + "円(在庫:" + 在庫数 + "個)"
    }
}

// 使用例
りんご = 新しい 商品()
りんご.商品名 = "りんご"
りんご.価格 = 100
りんご.入荷(50)
りんご.購入(3)
りんご.在庫確認()

問題2:図書館の本クラス

図書館の本を管理するクラスを作ってください。

  • タイトル、著者、貸出中かどうかを管理
  • 貸出メソッド
  • 返却メソッド
  • 本の情報表示メソッド
答えを見る
クラス 図書館の本 {
    タイトル
    著者
    貸出中 = false
    貸出回数 = 0
    
    貸出() {
        もし 貸出中 == true なら
            返す "この本は貸出中です"
        
        貸出中 = true
        貸出回数 = 貸出回数 + 1
        返す "「" + タイトル + "」を貸出しました"
    }
    
    返却() {
        もし 貸出中 == false なら
            返す "この本は貸出されていません"
        
        貸出中 = false
        返す "「" + タイトル + "」を返却しました"
    }
    
    情報表示() {
        状態 = 貸出中 ? "貸出中" : "貸出可能"
        
        "=== 本の情報 ==="
        "タイトル:" + タイトル
        "著者:" + 著者
        "状態:" + 状態
        "これまでの貸出回数:" + 貸出回数 + "回"
    }
}

// 使用例
ハリポタ = 新しい 図書館の本()
ハリポタ.タイトル = "ハリー・ポッターと賢者の石"
ハリポタ.著者 = "J.K.ローリング"

ハリポタ.貸出()
ハリポタ.情報表示()
ハリポタ.返却()

実践演習:CommandPlaygroundで体験

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

今日のまとめ

覚えておいてほしい3つのこと

  1. クラスは「設計図」、オブジェクトは「実物」
  2. クラスには「属性」(データ)と「メソッド」(動作)がある
  3. 一つのクラスから、たくさんのオブジェクトを作れる

次回予告

次のレッスンでは、「エラーとデバッグ」について学びます。

  • プログラムのエラーは怖くない!
  • エラーメッセージの読み方
  • バグを見つけて直す方法

エラーは学習のチャンス。失敗を恐れずにプログラミングを楽しむ方法を身につけましょう!

チャレンジ問題

ミッション:RPGの装備品クラス

RPGゲームの装備品(武器・防具)を管理するクラスを作ってください。

要件:

  • 装備品の名前、種類(武器/防具)、攻撃力または防御力
  • 装備する/外すメソッド
  • 強化メソッド(攻撃力や防御力を上げる)
  • 装備品の詳細表示メソッド
答えの例を見る
クラス 装備品 {
    名前
    種類  // "武器" または "防具"
    攻撃力 = 0
    防御力 = 0
    強化レベル = 0
    装備中 = false
    
    装備する() {
        もし 装備中 == true なら
            返す 名前 + "はすでに装備しています"
        
        装備中 = true
        返す 名前 + "を装備しました!"
    }
    
    外す() {
        もし 装備中 == false なら
            返す 名前 + "は装備していません"
        
        装備中 = false
        返す 名前 + "を外しました"
    }
    
    強化する() {
        強化レベル = 強化レベル + 1
        
        もし 種類 == "武器" なら
            攻撃力 = 攻撃力 + 5
            返す 名前 + "を強化!攻撃力が" + 攻撃力 + "になりました(+" + 強化レベル + ")"
        そうでなければ もし 種類 == "防具" なら
            防御力 = 防御力 + 3
            返す 名前 + "を強化!防御力が" + 防御力 + "になりました(+" + 強化レベル + ")"
    }
    
    詳細表示() {
        状態 = 装備中 ? "装備中" : "未装備"
        
        "=== " + 名前 + " ==="
        "種類:" + 種類
        もし 種類 == "武器" なら
            "攻撃力:" + 攻撃力
        そうでなければ
            "防御力:" + 防御力
        "強化レベル:+" + 強化レベル
        "状態:" + 状態
    }
}

// 使用例
伝説の剣 = 新しい 装備品()
伝説の剣.名前 = "エクスカリバー"
伝説の剣.種類 = "武器"
伝説の剣.攻撃力 = 50

竜の鎧 = 新しい 装備品()
竜の鎧.名前 = "ドラゴンメイル"
竜の鎧.種類 = "防具"
竜の鎧.防御力 = 30

// 装備して強化
伝説の剣.装備する()
伝説の剣.強化する()
伝説の剣.強化する()
伝説の剣.詳細表示()

素晴らしい!クラスとオブジェクトを使って、現実世界の複雑なものをプログラムで表現できるようになりました。これで、より本格的なプログラムが作れるようになりましたね!

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行