こんにちは!
Runteq75期Bのさとること、マッスルサイボーグです。呼びやすい方で読んでください。
せっかくなので、スクールで時間をお金をかけていることもあり、また多種多様なバックグランドの方と交流することができるこの環境を活かそうということで、個人的に以下の3つをサブ目標として設定しております。
1:他の受講生の方と積極的に交流する
2:イベント参加
3:技術記事の作成と公開
今回は3つ目の目標である、技術記事作成と公開の初めての記事ということで、Rubyのクラスについての理解のまとめと、個人的に学習でよく利用している概念図をまとめた記事を公開します。
これからRUNTEQの先輩方、同期の方々よろしくお願い致します。
それでは早速、どうぞ!!
Rubyのクラス、インスタンス、メソッドについて理解のために解説してみた
webアプリ開発を学んでいて多くの人がつまずくポイントとして、クラスという概念があると思う。
私も独学時代はclass.newなどを理解せずに、なんとなくコーディングをしていたが、改めてRUNTEQで学習を始めて、Rubyでのクラス、インスタンス、メソッドについて以前よりも理解が1歩ぐらい進んだので学習の復習と記事作成の練習も兼ねて、クラス、インスタンス、インスタンスメソッド、クラスメソッドについての定義方法と、日常生活の例を使って解説をしてみる。
また学習時に関係性の理解のために使った概念図も作成しておく。
初学者なので理解や図に誤りがあればすみません。
クラスとインスタンスとの関係性
クラスとは設計図で、この設計図をもとにして複数の機能を持った製品を作成することができる便利なものである。
そのクラス(設計図)を元にして作成されたのがインスタンス(オブジェクト)と呼ばれるもので、これがいわゆる単体の製品部分に当たる。
- クラス = 設計図
- インスタンス = 設計図をもとに作成されたもの
クラス(設計図)作成時には様々な機能を追加していくが、その時に必要なのがメソッドと呼ばれるものである。
メソッドはdef endで定義をする。これに処理を追加することでクラスに様々な機能が作成されていくイメージである。
def メソッド名 # ← 機能名
処理
end
そのメソッドで重要な以下の3つの種類がある。
- initializeメソッド
- インスタンスメソッド
- クラスメソッド
initializeメソッド
initializeメソッドは、クラスに値やデータを渡すために重要なメソッドで、クラスの各メソッドがinitializeメソッドで準備された値を利用していく。この準備がないと、それぞれのメソッドは値を扱うことができない。
def initialize(name, score)
@name = name
@score = score
end
余談だが、この作業を初期化という。アプリ開発を始めた頃、環境設定で初期化という言葉を目にするが最初は、
初期化 = データを全て消す
だったので理解に苦労したが、簡単にいうと
初期化 = 準備をする
と今はざっくりと覚えている。
インスタンスメソッドとクラスメソッド
次は機能設計部分を作るための、インスタンスメソッドとクラスメソッドの定義方法と違いについてまとめていく。
違いについては以下のポイント。
- インスタンスメソッドはオブジェクト(個別のデータ)に対して動作
- クラスメソッドはそのクラス自体に対して処理
📝 見分け方のポイント
| 項目 | インスタンスメソッド | クラスメソッド |
|---|---|---|
| 定義 | def method_name |
def self.method_name |
| 呼び出し | インスタンス.メソッド名 |
クラス名.メソッド名 |
| 使う場面 | 個別のデータに対する操作 | 全体に関する操作や情報 |
| 例 | taro.introduce |
Student.count_students |
私はパンが大好きで、特にチョコクロワッサンが大好きなので、クラスメソッドとインスタンスメソッドをパン屋に例えて説明してみる。
インスタンスメソッド
インスタンスメソッドは、各インスタンス(個別のデータ)に対して操作を行いたい時に使用する。
例えば、パン屋というクラスを利用して、チョコクロワッサン専門店と、ベーグル専門店それぞれ扱う商品が違うお店のインスタンスを作成したい。商品説明を使い回しができるように、name、priceを引数にしたdescribeメソッドを作成する。
class Bread
def initialize(name, price)
@name = name
@price = price
end
def describe
puts "この商品は#{@name}で、価格は#{@price}円です"
end
end
croissant = Bread.new('チョコクロワッサン', 300)
bagel = Bread.new('チョコベーグル', 340)
croissant.describe
こうすることで、インスタンスをBread.new()メソッドの引数を変えるだけで、複数の違った商品の説明を持ったインスタンスを作成することができる。
クラスメソッド
クラスメソッドはBreadというクラス自体に対して定義をする。例えば、お店が今日何個作成したかを表示するメソッドをクラスメソッドとして作成するときは、メソッド名の前に self. をつけることで定義することができる。
ここでは、クラス全体で共有する情報を管理するためにクラス変数(@@変数名)を使用している。クラス変数は、そのクラスから作成された全てのインスタンスで共有される変数である。
class Bread
@@total_bread_made = 0 # クラス変数:全インスタンスで共有
def initialize(name, price)
@name = name
@price = price
@@total_bread_made += 1 # インスタンスが作られるたびにカウント
end
def describe
puts "この商品は#{@name}で、価格は#{@price}円です"
end
def self.total_made # クラスメソッド
puts "今日は合計#{@@total_bread_made}個のパンを作りました"
end
end
# 使用例
croissant = Bread.new('チョコクロワッサン', 300)
bagel = Bread.new('チョコベーグル', 340)
croissant.describe
bagel.describe
Bread.total_made # => 今日は合計2個のパンを作りました
インスタンスメソッドとクラスメソッドの定義の方法について解説をしたが、私自身もどんなケースではインスタンスメソッドを利用して、クラスメソッドを使うときはこのケースといったことがまだ完全には理解ができていない。
これは今後学習を進めて、アプリ開発を行いながら理解を深めていく必要がある点である。
最後にインスタンスメソッドとクラスメソッドのそれぞれの呼び出し方について違いを軽くまとめて終わる。
ここが学習中に理解が曖昧で課題を行うときに苦戦したポイントであるので、再理解も兼ねてまとめておく。
インスタンスメソッド、クラスメソッドの使い方
インスタンスメソッドの呼び出し
インスタンスメソッドは、newメソッドを使いクラスからインスタンスを作成して、作成されたインスタンスからインスタンス名.メソッド名という形で呼び出す。
croissant = Bread.new('チョコクロワッサン', 300)
bagel = Bread.new('チョコベーグル', 340)
croissant.describe
上記の場合は、以下の流れになる。
-
Bread.new('チョコクロワッサン', 300)でインスタンスを作成 - インスタンスを使えるように変数に代入
-
croissant.describeで使う
いわゆるインスタンスを取得する作業とは、作成したインスタンスを変数に格納して使えるようにする作業のことである。
クラスメソッドの呼び出し
クラスメソッドの場合は、クラス名.メソッド名で呼び出す。
Bread.total_made # クラスに対して直接呼び出す
概念図
まとめ
- クラスは設計図、インスタンスは設計図から作られた製品
- initializeメソッドは初期化(準備)を行う特別なメソッド
- インスタンスメソッドは個別のデータに対する操作
- クラスメソッドはクラス全体に関する操作
これらの概念は最初は難しく感じるかもしれないが、実際にコードを書きながら少しずつ理解していくことが大切だと感じている。
