【Ruby】レッスン5-01:クラスとインスタンスの基本を理解しよう

50110130

一つ前の章では様々なコレクションについて学習しました。

今回は クラスの基本 について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:オブジェクト指向編

 ・Lesson5-1:クラスの基本を理解しよう ◁今回はココ
 ・Lesson5-2:イニシャライザを理解しよう
 ・Lesson5-3:アクセスメソッドを理解しよう
 ・Lesson5-4:クラス変数とクラスメソッドを理解しよう
 ・Lesson5-5:privateメソッドを理解しよう
 ・Lesson5-6:正規表現を理解しよう
 ・Lesson5-7:クラスの継承を理解しよう
 ・Lesson5-8:ファイル操作を理解しよう
 ・Lesson5-9:オーバーライドを理解しよう
 ・Lesson5-10:モジュールを使ってみよう
 ・Lesson5-11:ミックスインを使ってみよう
 ・確認問題5-☆1:モンスター捕獲ゲームを作ろう
 ・確認問題5-☆2:モンスターとの戦闘ゲームを作ろう
 ・確認問題5-☆3:マルバツゲームを作ろう

<<前のページ

Rubyの記事一覧

次のページ>>

Rubyのクラスとインスタンス|オブジェクト指向の第一歩を学ぼう

Rubyのクラスはオブジェクトを作成するためのテンプレートと表現されます。

クラスを使うことで関連するデータ(状態)と動作(メソッド)をまとめて管理できます。

たとえば人を表すクラスを作りたい場合、「名前」や「年齢」などの情報をデータとして扱い、「挨拶をする」「年齢を増やす」といった動作をメソッドとして定義できます。

【初心者向け】Rubyのオブジェクト指向を分かりやすくまとめた概念図。 特にクラスの継承、オーバーライド、モジュール、ミックスイン、インスタンス生成の関係性を視覚的に理解できるようまとめている。

Rubyでクラスを定義する基本構文とは

Rubyでクラスを定義するには、次のようにします。

class クラス名
  # メソッドや変数を定義
end

クラス名はキャメルケース(単語の先頭を大文字にする形式)で記述するのが一般的です。

具体例を見てみましょう。以下は「User」というクラスを定義して、インスタンスを生成して使用する例です。

class User  # Userという名前のクラスを定義
  def greet # greetという名前のメソッドを定義
    puts "こんにちは!私はRubyを学習中です。" #greetメソッドの処理内容
  end
end

定義したクラスを使ってインスタンスというものを生成し、メソッドを呼び出します。

user = User.new # Userクラスからインスタンスを生成し、変数userに代入
user.greet # 変数userに格納されたインスタンスのgreetメソッドを呼び出し

このコードを実行すると、以下のように出力されます。

こんにちは!私はRubyを学習中です。

インスタンスの意味と特徴を理解しよう

クラスから生成される具体的なオブジェクトのことをインスタンスと呼びます。

インスタンスごとにデータや動作が独立しており、クラスを使うことで複数のインスタンスを効率的に管理できます。

クラス = データや動作を書いた設計図。クラス自体は動作しない。
インスタンス = クラスから作られる、実際に動作するプログラム。

クラスからインスタンスを生成して使う流れ

以下のコードを見ていきましょう。

class User           # Userという新しいクラスを定義
  def set_name(name) # 名前を設定するset_nameメソッドを定義
    @name = name     # インスタンス変数@nameに引数nameを代入
  end

  def greet # 挨拶を表示するメソッドを定義
    puts "こんにちは!私は#{@name}です。"
  end
end
# Userクラスからインスタンスを生成
user1 = User.new # Userクラスの新しいインスタンスを生成し、変数user1に代入
user2 = User.new # Userクラスの新しいインスタンスを生成し、変数user2に代入

# インスタンスごとに名前を設定
user1.set_name("Taro")   # user1のset_nameメソッドを呼び出し、@nameに"Taro"を設定
user2.set_name("Hanako") # user2のset_nameメソッドを呼び出し、@nameに"Hanako"を設定

# インスタンスごとに異なる挨拶を表示
user1.greet  # user1のgreetメソッドを呼び出し、"こんにちは!私はTaroです。"と表示される
user2.greet  # user2のgreetメソッドを呼び出し、"こんにちは!私はHanakoです。"と表示される

クラスとインスタンスの基本を振り返ろう

今回はオブジェクト指向編の導入として、簡単な「クラスの定義と使用」方法について説明しました。

ただし、今回説明した内容は実際に現場で使用される書き方とは違う、かなり冗長な書き方となっています。

これは次の記事で紹介する「イニシャライザ」を使用していないためであり、イニシャライザを使用することでコードはより洗練されます。

まずはこのような基礎的な書き方をマスターし、オブジェクト指向の基礎を身につけましょう。

練習問題|クラスとインスタンスを使った基本プログラムを作成しよう

クラスの基本をしっかりと身に着けるため、練習問題に挑戦しましょう。

クラスとインスタンスを使った挨拶&年齢計算プログラム

Rubyでクラスとインスタンスを使うプログラムを作成し、オブジェクト指向プログラミングの基本を学びましょう。

ユーザーの名前を表示し、ユーザーの生まれた年から年齢を計算して表示するプログラムを作成してください。

クラスにメソッドを定義して、これらの機能を実現します。

以下の要件に従ってコードを完成させてください。

  • クラス定義User という名前のクラスを作成すること。
  • メソッド1display_name という名前のメソッドを定義し、引数として受け取った名前を "こんにちは、〇〇さん!" の形式で出力すること。
  • メソッド2calculate_age という名前のメソッドを定義し、生まれた年を引数に受け取り、現在の年からその年を引いて年齢を計算すること。計算した年齢を "あなたは〇〇歳です。" の形式で出力すること。
  • インスタンス生成User クラスからインスタンスを生成すること。
  • メソッドの呼び出し: インスタンスから display_name と calculate_age メソッドを呼び出すこと。

ただし、以下のような実行結果となるコードを書くこと。

こんにちは、太郎さん!
あなたは34歳です。

【ヒント】自力で解くのが難しい人へ

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:Userクラスの定義
  □ display_nameメソッドの定義
  □ □ 引数nameを使って「こんにちは、#{name}さん!」という文字列を出力
  □ calculate_ageメソッドの定義
  □ □ 現在の年をTime.now.yearで取得し、変数current_yearに代入
  □ □ 引数birth_yearからcurrent_yearを引き、変数ageに代入
  □ □ 「あなたは#{age}歳です。」という文字列を出力

2:Userクラスからインスタンスuserを生成
3:userインスタンスのdisplay_nameメソッドを呼び出し、「太郎」を引数として渡す
4:userインスタンスのcalculate_ageメソッドを呼び出し、1990を引数として渡す

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# ユーザーを表すクラスを定義します
class User
  # ユーザーの名前を表示するメソッド
=begin
【穴埋め問題1】
ここでdisplay_nameという名前のメソッドを定義し、
引数nameを受け取って「こんにちは、#{name}さん!」と表示するコードを書いてください。
=end

  # ユーザーの年齢を計算するメソッド
=begin
【穴埋め問題2】
ここでcalculate_ageという名前のメソッドを定義し、
引数birth_yearを受け取って現在の年からbirth_yearを引いて年齢を計算し、
「あなたは#{age}歳です。」と表示するコードを書いてください。
=end
end

# クラスを使用してインスタンスを作成
=begin
【穴埋め問題3】
ここでUserクラスのインスタンスを作成し、変数userに代入してください。
=end

# 名前を表示する
=begin
【穴埋め問題4】
ここでuserのdisplay_nameメソッドを呼び出し、
引数として"太郎"を渡してください。
=end

# 年齢を計算して表示する
=begin
【穴埋め問題5】
ここでuserのcalculate_ageメソッドを呼び出し、
引数として1990を渡してください。
=end

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

この問題の解答例と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
# ユーザーを表すクラスを定義します
class User
  # ユーザーの名前を表示するメソッド
  def display_name(name)
    puts "こんにちは、#{name}さん!" # 名前を出力する
  end

  # ユーザーの年齢を計算するメソッド
  def calculate_age(birth_year)
    current_year = Time.now.year # 現在の年を取得
    age = current_year - birth_year # 年齢を計算
    puts "あなたは#{age}歳です。" # 年齢を出力
  end
end

# クラスを使用してインスタンスを作成
user = User.new

# 名前を表示する
user.display_name("太郎")

# 年齢を計算して表示する
user.calculate_age(1990)
Q
正解コードの解説

コードをブロックごとに分割して解説します。

クラスの定義

class User

class User: Rubyでクラスを定義するための構文です。

Userはクラスの名前で、この中にユーザー関連の機能を持つメソッドを記述します。

メソッドの定義 – 名前の表示

  def display_name(name)
    puts "こんにちは、#{name}さん!" # 名前を出力する
  end
  • def display_name(name): この行でdisplay_nameというメソッドを定義しています。このメソッドは引数nameを受け取り、名前を出力します。
  • puts: コンソールに文字列を出力します。
  • "こんにちは、#{name}さん!": 式展開を使ってnameの値を埋め込んだ挨拶文を生成します。

メソッドの定義 – 年齢の計算

  def calculate_age(birth_year)
    current_year = Time.now.year # 現在の年を取得
    age = current_year - birth_year # 年齢を計算
    puts "あなたは#{age}歳です。" # 年齢を出力
  end
  • def calculate_age(birth_year): この行でcalculate_ageというメソッドを定義しています。
    このメソッドは引数birth_yearを受け取り、年齢を計算して出力します。
  • Time.now.year: 現在の年を取得します。
  • current_year - birth_year: 現在の年から生まれた年を引いて年齢を計算します。
  • "あなたは#{age}歳です。": 計算した年齢を式展開で埋め込んだ文字列を出力します。

インスタンスの生成とメソッドの呼び出し

user = User.new
  • User.newUserクラスから新しいインスタンスを生成します。
  • このインスタンスをuserという変数に格納します。
user.display_name("太郎")
  • user.display_name("太郎")userインスタンスのdisplay_nameメソッドを呼び出し、”太郎”という引数を渡して実行します。
user.calculate_age(1990)
  • user.calculate_age(1990)userインスタンスのcalculate_ageメソッドを呼び出し、1990年を引数として渡して年齢を計算します。

まとめ

このプログラムではRubyでの「クラスの定義」と「インスタンスの作成」を学びました。

特にクラスの中で複数のメソッドを定義し、それを使う方法を理解することでプログラムの再利用性が高まり、コードを効率的に書けるようになります。

次の記事ではイニシャライザというメソッドを使用して、より効率的にコードを書く技術を学習します。

これによりオブジェクト指向プログラミングの基礎がさらに深まります。ぜひこのままチャレンジしましょう!

もっと分かりやすいサイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいRuby学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

Rubyの記事一覧

次のページ>>

FAQ|Rubyのクラスとインスタンスの基礎理解を深めよう

Q
Q1. Rubyのクラスとインスタンスの違いは何ですか?

クラスはオブジェクトの設計図で、インスタンスはその設計図から作られた実体です。クラスでは変数やメソッドの定義だけが行われ、実際の処理やデータの操作はインスタンスで行われます。

Q
Q2. Rubyでインスタンス変数に@を付けるのはなぜですか?

@を付けることで、その変数がインスタンスごとに保持される独立したデータであることを示します。これにより、異なるインスタンス間で変数の値が共有されず、個別の情報を扱えるようになります。

Q
Q3. Rubyで複数のインスタンスを使うとどんなメリットがありますか?

複数のインスタンスを使うことで、同じクラスを使って異なるデータを持つオブジェクトを効率的に管理できます。たとえば、Userクラスで複数のユーザーを生成し、それぞれ異なる名前や挨拶を扱うことが可能です。

記事URLをコピーしました