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

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:クラスの定義と使用

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、メソッド、コレクション(レッスン1~4)クラスの定義と使用イニシャライザアクセスメソッドattr_accessorクラス変数とクラスメソッドprivateメソッド正規表現クラスの継承ファイル操作オーバーライドモジュールの定義と使用ミックスイン

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

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

*****↓↓正解コードの実行結果の例↓↓*****

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

この問題を解くヒント

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

ヒント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を引数として渡す

ヒント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

以上がこの問題の穴埋めコードです。

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



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

# ユーザーを表すクラスを定義します
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)

正解コードの解説

このプログラムでは「クラスとインスタンスの基本」を学びながら、ユーザーの名前を表示し、生まれた年から年齢を計算する方法を実践します。

それぞれのブロックを詳しく見ていきましょう。

クラスの定義

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.new: Userクラスから新しいインスタンスを生成します。

このインスタンスをuserという変数に格納します。

user.display_name("太郎")

user.display_name("太郎"): userインスタンスのdisplay_nameメソッドを呼び出し、”太郎”という引数を渡して実行します。

user.calculate_age(1990)

user.calculate_age(1990): userインスタンスのcalculate_ageメソッドを呼び出し、1990年を引数として渡して年齢を計算します。

まとめ

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

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

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

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

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Rubyのテキスト&問題集トップへ戻る
    トップページへ戻る