Ruby

【Ruby基礎】クラスメソッドとインスタンスメソッドの違いについて簡単にまとめてみた

Ruby

 

今回は、クラスに定義できる2種類のメソッド「クラスメソッド」と「インスタンスメソッド」について解説したいと思います。Rubyを学習し始めてつまずきやすいポイントの1つだと思うので、丁寧に進めていきましょう。

「self.」が入ってきてややこしくなる所だね。

クラスメソッドとは

クラスが使用できるメソッドです。クラスメソッドを定義したクラス自身が使用でき、クラスで共通の情報を持った処理に使用します。

定義方法と呼び出し

class クラス名
  def self.メソッド名
    # 実行したい処理
  end
end

クラス名.メソッド名(引数)

クラスメソッドはメソッド名の前に「self.」を付けます。

代表的なクラスメソッドは、インスタンスを生成する「newメソッド」だね。

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

インスタンスが使用できるメソッドです。インスタンスメソッドを定義したクラスのインスタンスに使用でき、インスタンス毎の個別の情報を使った処理に使用します。

定義方法と呼び出し

class クラス名
  def メソッド名
    # 実行したい処理
  end
end

インスタンス.メソッド名(引数)

 

具体例

先ほどの説明だけではピンとこないと思うので、例題を見ながら確認していきましょう。

下のコードを見てください。「House」というクラスに、「price」というクラスメソッドとインスタンスメソッドがそれぞれ定義されていますね。

class House
  def self.price
    puts "1000万円です(クラスメソッド)"
  end

  def price
    puts "1000万円です(インスタンスメソッド)"
  end
end

 

まずは、クラスメソッドを呼び出してみます。以下のように記述すると、クラスメソッドが呼び出されます。

House.price
# => 1000万円です(クラスメソッド)

 

次にインスタンスメソッドを呼び出してみます。以下のように記述すると、インスタンスメソッドが呼び出されます。

house = House.new
house.price
# => 1000万円です(インスタンスメソッド)

 

「newメソッド」で、「House」のインスタンスである「house」を生成しています。

クラスメソッドとインスタンスメソッドの使い分け

クラスメソッドとインスタンスメソッドの使い分けですが、「クラスメソッドは全体で扱うべき情報を扱う」「インスタンスメソッドは個々で扱うべき情報を扱う」といった感じです。

 

先ほどと同様に例を見ていきましょう。とあるスーパーマーケットの情報を表示するアプリケーションがあると仮定します。

そして、そのスーパーマーケットの評判(rate)をクラスで定義し、それに基いて評判(rate)のインスタンスを生成して管理することにします。

そうすると、以下のように定義することができます。

class Rate
  def self.rate_count
    return 0  # ここでは便宜上0を返すことにします
  end

  def show_rate
    puts "品揃え最高!"
  end
end

puts Rate.rate_count
# => 0

rate = Rate.new
rate.show_rate
# => 品揃え最高!

 

評判の数(rate_count)は全体で扱うべき情報なのでクラスメソッド、評判内容(show_rate)は個々で扱うべき情報なのでインスタンスメソッドと使い分けていることが分かりますね。

まとめ

  • クラスメソッドは、クラスが使用できるメソッド
  • インスタンスメソッドは、インスタンスが使用できるメソッド
  • クラスメソッドは全体で扱うべき情報を扱い、インスタンスメソッドは個々で扱うべき情報を扱う

最後に

クラスメソッドとインスタンスメソッドには前述で説明したような違いがありましたが、正直どちらで書いても実装はできます。

加えて、インスタンスメソッドには色々なデータを加えることができるので、できればインスタンスメソッドで記述することをおすすめします。

 

 

今回は、クラスに定義できる2種類のメソッド「クラスメソッド」と「インスタンスメソッド」について解説しました。1回ではすぐに理解できない箇所だと思うので、他の記事や参考書も読み返しながら、徐々に理解を深めていってください。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です