Rubyのインスタンスメソッドとクラスメソッドの違い - Rubyプログラミング(14)

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

2017年3月19日日曜日

Rubyのインスタンスメソッドとクラスメソッドの違い - Rubyプログラミング(14)


このシリーズを最初から追ってきた方にはRubyのクラスについてまだ何も書いてませんが、今回はRubyのインスタンスメソッドクラスメソッドの違いを紹介します。Rubyが初めてとかクラスって何?という人もとりあえずクラスの構文は無視して、どういう機能かに注目してください。

下記のようなクラスを作成してください。上から1つ目のメソッドはクラスメソッドです。2つ目はインスタンスメソッドです。



Rubyのクラスメソッドの呼び出し方

インスタンスメソッドとクラスメソッドの構文の違いは、クラスメソッドにはselfが使われていて、インスタンスメソッドはselfが付いていないことです。クラスメソッドを呼び出すときは「クラス名.メソッド名」になります。つまり上記のInvoiceクラスの場合は、Invoice.print_outになります。

Rubyのインスタンスメソッドの呼び出し方

クラスメソッドと同じ方法でインスタンスメソッドを呼び出してみるとエラーが起こります。undefined method...と表示されていると思います。このエラーを解消するためには、インスタンスメソッドを呼び出す前に、Invoiceクラスのインスタンスを生成する必要があります。

インスタンス生成にはnewを使用します(ここではあまり深く説明しません)。下記のようなコードを書いてみましょう

i = Invoice.new
i.convert_to_pdf

プログラムを実行してみると、"Converted to PDF"と表示されると思います。このインスタンスメソッドの呼び出し方でクラスメソッドを呼び出そうとするとエラーが起こります。

ここまでで見てきたように、クラスメソッドは「クラス名.メソッド名」、一方でインスタンスメソッドを呼び出すには「インスタンス生成」が必要となります。あまりお勧めしませんが(通常、このようには書かないと思いますが)、下記のように書くとインスタンスメソッドを一行で呼び出すこともできます。

Invoice.new.convert_to_pdf

なぜインスタンスメソッドが必要なのか

呼び出し方だけで見ると、インスタンスメソッドよりもクラスメソッドの方が呼び出しが楽です。なぜインスタンスメソッドが必要なのでしょうか?例えば10個のメソッドを持ったクラスがあったとします。

class Hoge
# ここに10メソッドがある
end

Hoge.method_1
Hoge.method_2
Hoge.method_3
Hoge.method_4
Hoge.method_5
Hoge.method_6
Hoge.method_7
Hoge.method_8
Hoge.method_9
Hoge.method_10

これはプログラムでは良くない例です。本来1個で良いオブジェクトが無駄に15個のオブジェクトが生成されてしまっていて、そのことにより無駄にメモリを使用してしまうからです。一方インスタンスメソッドの場合は1つインスタンスを生成して、そこからメソッドを呼び出しているので無駄がありません。

class Hoge
# ここに10メソッドがある
end

h = Hoge.new
h.method_1
h.method_2
h.method_3
h.method_4
h.method_5
h.method_6
h.method_7
h.method_8
h.method_9
h.method_10

インスタンスメソッドとクラスメソッドの違いを理解することは重要なのでしっかりおさえておきましょう。

◯RubyのProc - Rubyプログラミング(15)はこちら
◯「Rubyプログラミング」シリーズの一覧はこちら




最近の投稿