ЯoomeR

プログラミング~実装とエラー解決と、時々、AI~

5分で分かるクラスとインスタンス

この記事で分かること

読み流すだけで頭に入る設計をしていますので、立ち止まらずに一気に読んでみましょう。

また、各項目にはコードを記載しているので実際に手を動かしながら確認してみましょう!

(右上のアイコンを押すことで簡単にコピーできます。)

まずは用語を理解しよう

class Yamada

end

tarou = Yamada.new

最初に「どこをクラスと呼ぶか、インスタンスと呼ぶか」を覚えましょう。

「Yamada」というクラスを定義しました。class と記述されているためわかりやすいですね。

一方、「tarou」というのは「Yamadaのインスタンスです。

インスタンスを定義する時は インスタンス名=クラス名.newとします。

これは「Yamadaというクラスに対してnewメソッドを行い、tarouというインスタンスを新たに生成した」、ということです。

次にイメージしてみよう

クラスは名字(家系)・インスタンスは子供のイメージです。

class Yamada

  Yamada家の持つ能力
  
end
  
tarou = Yamada.new
#tarouというインスタンス(子供)が新たに生まれた
jirou = Yamada.new
#jirouというインスタンス(子供)が新たに生まれた

Yamadaクラスから作られたインスタンスはYamadaの特性をすべて引き継いでいます。

人間で言う遺伝のように、tarouもjirouもYamada家の持つ能力を全て使えます。

インスタンスメソッドをさくっと理解

一番最初に理解したいのは「インスタンスメソッド」について。

class Yamada

  def fire
    p '手から炎がでます'
  end
  
end
  
tarou = Yamada.new
jirou = Yamada.new

ここでは「Yamada」というクラスの中に「fire」というインスタンスメソッドがあります。

インスタンスメソッドとは、「Yamada家の持つ能力」のこと。

class Yamada

  def fire
    p '手から炎がでます'
  end
  #これがインスタンスメソッド
  
end
  
tarou = Yamada.new
jirou = Yamada.new

tarou.fire
#tarouに対してfireを適用している
jirou.fire
#jirouもfireを使うことができる

インスタンス(子供)である「tarou」に対して、「fire」を適用しています。

「太郎、fireを使うんだっ!」って感じですね。

このコードを実行すると「手から炎が出ます」が出力されることが確認できるので、やってみましょう。

また、jirouも山田家の子供なのでfireを使うことができます。

ついでにクラスメソッドをさくっと理解

クラスから生まれたインスタンス(山田家から生まれた子どもたち)が使えるのが「インスタンスメソッド」。

対して、クラスメソッドとは「山田家に対してアクションを行うメソッド」のこと。

class Yamada
  #最初は子供は0人
  @@children_count = 0

  def self.children_counter
    #これがクラスメソッド
    p "山田家には子供が#{@@children_count}人います"
  end

  def initialize
    #インスタンスが作られる=子供が生まれるたびに1つカウントが増える
    @@children_count += 1
  end

  def fire
    p '手から炎がでます'
  end
  
end
  
tarou = Yamada.new
#tarouというインスタンス(子供)が生まれる
jirou = Yamada.new
#jirouというインスタンス(子供)が生まれる
Yamada.children_counter
#クラスに対してクラスメソッドを実行している

山田家に何人子供がいるか(何個インスタンスが作られたか)」を知っているのは誰でしょうか?

すでに独立したtarouはjirouが生まれたことを知りません。

インスタンス同士はお互いに関連性を持たないためです。

よって、「山田家に直接聞く」のが正攻法ですね。

クラスメソッドを使用する際は クラス名.クラスメソッド という記述になります。

クラスメソッドの特徴として「メソッド名にselfがつく」があるので、見つけやすいですね。

応用問題

最後に応用編です。

class Yamada

  def fire
    p '手から炎がでます'
  end
  
end

class Tanaka

  def water
    p '水を生み出します'
  end
  
end

  
tarou = Yamada.new
hanako = Tanaka.new

hanako.fire

今回はクラスを2つ作成しました。

炎を操る山田家と、水を操る田中家です。

さて、田中家の子孫であるhanakoはfireを使うことができるでしょうか?

上記のコードを自分のPCで実行してみましょう。

undefined method `fire' for #<Tanaka:0x00007fee5d097da8> (NoMethodError)

このようなエラー文が表示されるはずです。

日本語に訳してみましょう。

fireというメソッドは<田中から作られたインスタンス>には定義されていないよ。(そんなメソッドはないです!)

お気付きの通り、fireは山田家だけの技ですから、hanakoが使おうとするとエラーになってしまいます。

class Yamada

  def fire
    p '手から炎がでます'
  end
  
end

class Tanaka

  def water
    p '水を生み出します'
  end

end

  
tarou = Yamada.new
hanako = Tanaka.new

tarou.fire
hanako.water

こうすればうまく動きますね。

まとめ

  • クラスは名字(家系)である
  • インスタンスはクラスの子供である
  • インスタンスメソッドは「その家の子供が使える技」である
  • クラスメソッドは「家に対してアクションを行う技」である