メソッドとクラスメソッドとインスタンスメソッドが曖昧だった


Rubyでプログラムを記述している際に疑問に思うことが多々あります。
今回はメソッド、クラスメソッド、インスタンスメソッドがあいまいになったのでまとめていきます。

メソッド

クラスメソッドにしてもインスタンスメソッドにしても、メソッドという名称がついているのだからどちらもメソッドです。
では、そもそもメソッドとは何なのでしょうか?

一般には、方法、手法といった意味。オブジェクト指向プログラミングにおいて、クラスにはメソッドとフィールドがあり、メソッドには、処理内容を記述する。
引用元:コトバンク

足し算
def addition (a,b,c,d,e)
    puts a + b + c + d + e
end

上のadditionメソッドに5つの数字を与えると全部足して表示してくれる。というメソッドです。
メソッドとは、なにかしらの処理をまとめ、その一連の処理に名前をつけたもの。を指します。

クラスメソッド?インスタンスメソッド?

クラスメソッドとは、クラスオブジェクトから実行可能なメソッド
インスタンスメソッドとは、クラスのインスタンス(実体)に対して紐づけられるメソッド
引用元:コトバンク

なるほど。さっぱりわかりません。とりあえず先ほどのadditionをCalculation(計算)クラスの中に入れて実行してみます。

計算クラス(エラー)
class Calculation
    def addition(a, b, c, d, e)
        puts a + b + c + d + e
    end
end

addition(1,2,3,4,5)

実行結果はundefined method `addition' for Add:Class (NoMethodError)というエラーコードが出ました。
そんなメソッド存在しない。というエラーのようです。

クラスの中にあるメソッドを使用する

Calculationクラスに含まれているメソッドを外から勝手に使用することはできないみたいです。そこで登場するのがクラスメソッドです。
クラスメソッドの定義はメソッド名の前にself.を加え、呼び出すときにはクラス名.メソッド名で呼び出します。早速やってみましょう。

計算クラス
class Calculation
    def self.addition(a, b, c, d, e)
        puts a + b + c + d + e
    end
end

Calculation.addition(1,2,3,4,5)

15が出力されました。どうやら成功したようです。

インスタンスメソッドは?

結論から言うとクラスの中にメソッドを作成するとそれがインスタンスメソッドになります。

宣言
class クラス名

  def メソッド名(変数1, 変数2, ...)
    処理
  end

end

インスタンスメソッドは、クラスのインスタンスに機能として搭載されているものです。
先ほどの計算クラス(エラー)となってしまったコードは、インスタンスを作り、作ったインスタンスに対してメソッドを呼び出せばエラーを吐きません。

計算クラス(インスタンス)
class Calculation
    def addition(a, b, c, d, e)
        puts a + b + c + d + e
    end
end
calculation = Calculation.new()
calculation.addition(1,2,3,4,5)

これで15と表示されるようになった。

まとめ

  • メソッドとは、それを実行すると何かしらの処理を行ってくれる
  • インスタンスメソッドもクラスメソッドもメソッド
  • クラスメソッドはself.メソッド名で作成。使用するにはクラス名.メソッド名で
  • インスタンスメソッドはクラスにメソッドを作成するとそれがインスタンスメソッドとなる。特に追加で記述する必要はない
  • インスタンスメソッドを使用するにはインスタンスを作成(.new)しなければならない

イメージ図

実践編

クラスメソッド、インスタンスメソッド。いつ使うのか。