Ruby
初心者

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

More than 1 year has passed since last update.

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

メソッド

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

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

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

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

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

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

なるほど。わからない。とりあえず先ほどのadditionをAddクラスの中に入れてみる

足し算クラス(エラー)
class Add
    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)というエラーコードが出た。
そんなメソッド存在しない。というエラーらしい。

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

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

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

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

15が出力された。成功したようだ。

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

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

class クラス名

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

end

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

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

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

まとめ

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