【Ruby】Lesson5-01|クラスとインスタンスの基本を理解しよう

一つ前の章では様々なコレクションについて学習しました。
今回は クラスの基本 について見ていきましょう。
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:マルバツゲームを作ろう
クラスとインスタンス|オブジェクト指向の第一歩

これから学習する「クラス」は、まさしくオブジェクト指向プログラミングの中心となる基本概念です。
クラスとは、関連する データ(状態)と動作(メソッド)を書いた設計図 のような役割を果たします。オブジェクトを作成するためのテンプレートです。
クラスをうまく使うことで複雑なプログラムを整理し、再利用可能なコードを作成することができます。
下の図は、これからLesson5を通して学習するオブジェクト指向の内容を全てまとめたものです。
右側のメインプログラムの部分が、これまであなたが学習してきたコードの概念図になります。コードは上から順に実行され、多数の処理や変数などが含まれています。
オブジェクト指向の入り口であるこの記事では、図の右上の「子クラス1 ⇒ インスタンス生成 ⇒ 変数」の部分だけを学習していきます。

クラスの定義構文|オブジェクトの設計図を書こう
Rubyでクラスを定義するには、次のように書きます。
class クラス名 # クラスの中身(メソッドや変数)を定義 end
クラス名は単語の先頭を大文字にする形式(キャメルケース)で記述するのが一般的です。
具体例を見てみましょう。以下は「User」という名前のクラスを定義しています。
class User # Userという名前のクラスを定義 lang = "Ruby" # langという名前の変数を定義してRubyという文字列を代入 def greet # greetという名前のメソッドを定義 puts "こんにちは!私は#{lang}を学習中です。" end end
このコードは、Userクラスの中に1つの変数と1つのメソッドを定義しており、それを実行すると「こんにちは!私はRubyを学習中です。」という文字列を返すコードです。
ただし、上述の通りクラスとはあくまでも設計図であり、クラスそのものは動作しません。
下記のインスタンス生成の章に進んでください。
インスタンス生成|設計図から作られるオブジェクトの実体
クラスの定義ができたらそれを元に実際のデータを扱うための「インスタンス」を生成します。
インスタンスはクラスを基にした「実体」であり、クラス内の変数やメソッドにアクセスするために使用します。
クラス = データや動作を書いた設計図。クラス自体は動作しない。
インスタンス = クラスから作られる、実際に動作するプログラム。
class User # Userという名前のクラスを定義 lang = "Ruby" # langという名前の変数を定義してRubyという文字列を代入 def greet # greetという名前のメソッドを定義 puts "こんにちは!私は#{lang}を学習中です。" end end user = User.new # Userクラスからインスタンスを生成し、変数userに代入 user.greet # 変数userに格納されたインスタンスのgreetメソッドを呼び出し
8行目の「User.new」の部分がインスタンス生成です。Userクラス(という設計図)からオブジェクトを作り出し、変数userに代入しています。
すなわち、変数userの中にはクラスの中で定義された変数とメソッドが入っています。
そして9行目「user.greet」は変数userの中にあるgreetメソッドの呼び出しています。
このコードを実行すると、以下のように出力されます。
こんにちは!私はRubyを学習中です。
このように、事前にクラスを定義しておくことで、クラス内の変数やメソッドを簡単に呼び出せるようになります。
まとめ|クラスとインスタンスの基本を振り返ろう
今回はオブジェクト指向編の導入として、簡単な「クラスの定義と使用」方法について説明しました。
クラスはデータとメソッドをまとめて表現するための基本的な構成要素です。
クラスを定義し、インスタンスを作成することで、複雑なデータ構造を効率よく扱えるようになります。
まずはこのような基礎的な書き方をマスターし、オブジェクト指向の基礎を身につけましょう。
次の記事では「イニシャライザ」を使用してより洗練されたコードを書いていきます。
練習問題|クラスとインスタンスを使った基本プログラムを作成しよう

クラスの基本をしっかりと身に着けるため、練習問題に挑戦しましょう。
クラスとインスタンスを使った挨拶&年齢計算プログラム
Rubyでクラスとインスタンスを使うプログラムを作成し、オブジェクト指向プログラミングの基本を学びましょう。
ユーザーの名前を表示し、ユーザーの生まれた年から年齢を計算して表示するプログラムを作成してください。
クラスにメソッドを定義して、これらの機能を実現します。
以下の要件に従ってコードを完成させてください。
- クラス定義:
User
クラスを作成すること。 - メソッド1:
display_name
メソッドを定義し、引数として名前を受け取り「こんにちは、〇〇さん!
」と出力すること。 - メソッド2:
calculate_age
メソッドを定義し、引数として生まれた年を受け取り、現在の年からその年を引いて年齢を計算すること。
計算した年齢を「あなたは〇〇歳です。
」と出力すること。
なお、現在の年は「Time.now.year」というコードで取得できます。以下のように記述しましょう。
current_year = Time.now.year # 現在の年を取得して変数current_yearに代入
ただし、以下のような実行結果となるコードを書くこと。
こんにちは、太郎さん! あなたは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での「クラスの定義」と「インスタンスの作成」を学びました。
特にクラスの中で複数のメソッドを定義し、それを使う方法を理解することでプログラムの再利用性が高まり、コードを効率的に書けるようになります。
次の記事ではイニシャライザというメソッドを使用して、より効率的にコードを書く技術を学習します。
これによりオブジェクト指向プログラミングの基礎がさらに深まります。ぜひこのままチャレンジしましょう!
FAQ|Rubyのクラスとインスタンスの基礎理解を深めよう
- Q1. Rubyのクラスとインスタンスの違いは何ですか?
-
クラスはオブジェクトの設計図で、インスタンスはその設計図から作られた実体です。クラスでは変数やメソッドの定義だけが行われ、実際の処理やデータの操作はインスタンスで行われます。
- Q2. Rubyでインスタンス変数に@を付けるのはなぜですか?
-
@を付けることで、その変数がインスタンスごとに保持される独立したデータであることを示します。これにより、異なるインスタンス間で変数の値が共有されず、個別の情報を扱えるようになります。
- Q3. Rubyで複数のインスタンスを使うとどんなメリットがありますか?
-
複数のインスタンスを使うことで、同じクラスを使って異なるデータを持つオブジェクトを効率的に管理できます。たとえば、Userクラスで複数のユーザーを生成し、それぞれ異なる名前や挨拶を扱うことが可能です。