ザツジルシ

あることないこと書きます。

【Ruby】クラスとインスタンスの概念を理解したてホヤホヤの僕が説明する(ことに意味がある)

こんばんは。

皆さん、キーボードカタカタしてますか?僕は昨日はブログカタカタしただけで終わってしまいました。

今日は特に書くつもりはなかったのですが、「そうだ!クラスのことについて書こう!」と急に思い付いたので、カタカタしています。

オブジェクト指向プログラミング言語を勉強をしていて、最初にぶち当たる壁がクラス、インスタンスの概念の理解ではないでしょうか?僕はそうでした。どの説明サイトの説明を読んでもなんだか実態が掴めなくて、心の中がモヤモヤしてる感じ。一度理解してしまうとあっけないのですが、なかなか難しいものです。

そこでふと思ったのですが、プログラミング言語の説明サイトを書いている人っておそらくプログラミング歴何十年みたいな玄人さんじゃないですか。となると、その人がクラスやインスタンスの概念を理解したのもこれまたうーんと前。つまり、まだその概念が理解出来ていない人がどこでどうツマヅイているかというのはとうの昔に忘れてしまっているのではないでしょうか。だから、説明も初心者にはついていけないものになってしまっている。

ということは、クラスとインスタンスの概念を理解しており(多分)、理解できなかった時の気持ちもまだ忘れていない僕というのは、実は数少ないクラスとインスタンスの概念の説明にうってつけの存在なのではないかと思ったのです。それが、この記事を書こうと思ったきっかけです。

この記事を読んで、クラス、インスタンスの概念が理解できれば幸いです。また、この記事では用語の説明やRubyの基礎は極力省き、概念の説明だけに集中したいと思います。

 

  • クラスはクラスに例えると分かりやすい

では早速説明に入ります。ここではRubyのコードで説明していきます。他の言語でも同じ概念だと思いますが、なんせ僕も初心者なので知りません。ご了承ください。

さて、クラスについてですが、説明サイトでは様々なものに例えられていますよね。設計図だとか、たい焼きの金型だとか。。ただ、僕はどれもしっくり来ませんでした。例えに力が入りすぎて、実際のプログラミングではどうなるのかがいまいち分からなかったからです。この記事でも例えは使いますが、そうならないように気をつけます。

僕はクラスは名前がクラスなのですから、学校のクラスに例えるのが分かりやすいと思います。ではまず、クラスを作ってみましょう。クラスの名前は「Ringo」クラスにします。

 

<コード>

class Ringo

 

end

クラスを作成する時は上のようなコードを書きます。これでRingoクラスができました。ただ、まだ中にはなにも書かれていません。さて、学校のクラスでは生徒に色々なことを教えますよね。オブジェクト指向におけるクラスでも色々なことを教えることが出来ます。以降では分かりやすく、この『色々なこと』を「技」と呼びましょう。

ではまず、このRingoクラスでは、「おはよう!」という文字を表示させる技を教えさせてみましょう。技の名前はaisatsuにします。

<コード>

class Ringo

   def aisatsu

    puts "おはよう!"

  end

end

上のようになります。赤い文字の部分が技aisatsuを定義付けている部分です。さて、クラスもできた。教えることも決まった。あとは何が必要でしょうか。。。そう、生徒ですね。クラスで授業をやっても、それを学ぶ生徒が居なければ意味がありません。では、Ringoクラスの生徒を作ります。生徒の名前はTaroにしましょう。生徒の作り方は、[生徒名=クラス名.newで]出来ます。つまり、

 

<コード>

class Ringo

   def aisatsu

    puts "おはよう!"

  end

end

Taro = Ringo.new

上のように書きます。はい、これでRingoクラスの生徒、Taroが誕生しました。TaroはRingoクラスの生徒なので、Ringoクラスで教えられた技は全て習得しています。では、Taroに技aisatsuをやってもらいましょう。技のさせ方は[生徒名.技名]です。つまり、

 

<コード>

class Ringo

   def aisatsu

    puts "おはよう!"

  end

end

Taro = Ringo.new

Taro.aisatsu

<実行結果>

おはよう!

 

となります。どうでしょうか?付いてこられているでしょうか?

もう少し説明をします。そのために、ここでもう1個別のクラスを作ります。Appleというクラスを作ります。Appleクラスではグローバルな社会を生き抜くため、英語を勉強させましょう。そのため、同じ技名のaisatsuを教えるのですが、表示させるのは「おはよう!」ではなく「Good Morning!」にします。そして、Johnという生徒をAppleクラスの生徒にします。さて、そのJohnにaisatsuをさせたらどうなると思いますか?実行してみましょう。

 

<コード>

class Ringo

   def aisatsu

    puts "おはよう!"

  end

end

class Apple

   def aisatsu

    puts "Good Morning!"

  end

end

 

Taro = Ringo.new

Taro.aisatsu

John = Apple.new

John.aisatsu

<実行結果>

おはよう!

Good Morning!

 

はい。皆さん予想通りでしたでしょうか?答えはGood Morning!です。TaroにもJohnにも同じaisatsuという技をさせたのですが、TaroはRingoクラスの生徒だからRingoクラスで学んだこと、JohnはAppleクラスの生徒だからAppleクラスで学んだことを実行します。なので、同じ技名でもTaroとJohnで実行結果が違うのです。

掴めてきましたか?ダメ押しでもう一個行きましょう。

Ringoクラスに【だけ】もう1つ技を覚えさせましょう。「ばいばい!」と表示させる技です。技の名前はsayonaraにします。さて、このsayonaraをRingoクラスの生徒ではないJohnにもさせてみたらどうなるのでしょうか?やってみましょう。

 

<コード>

class Ringo

   def aisatsu

    puts "おはよう!"

  end

   def sayonara

    puts "ばいばい!"

  end

end

class Apple

   def aisatsu

    puts "Good Morning!"

  end

end

 

Taro = Ringo.new

Taro.aisatsu

John = Apple.new

John.aisatsu

Taro.sayonara

John.sayonara

<実行結果>

おはよう!

Good Morning!

ばいばい!

エラー文

 

はい。予想できたでしょうか。TaroはRingoクラスの生徒なので、sayonaraという技は習得済み。よってきちんと「ばいばい!」と表示できるのですが、JohnはAppleクラスの生徒。Appleクラスではsayonaraなんて技教わっていません。なので、Johnにsayonaraをさせようとすれば当然エラーが起きてしまうというわけです。

 

 

お疲れ様でした。いかがでしたでしょうか?僕なりにできるだけ噛み砕いて書いたつもりなのですが、僕も言ってもクラスを理解したのは1,2ヶ月前。理解していない頃の気持ちが少し薄れつつあります。なので、もしかしたら置いてけぼりにしてしまっている部分があるかもしれません。ただ、他のサイトにはないアプローチで説明してみたので、今まで分からなかった人のモヤモヤが取れれば、嬉しいです。

 

それでは、プログラミング学習がんばりましょう!!

よろしければ、下のIT技術ブログボタンをクリックお願いします。

にほんブログ村 IT技術ブログへ
にほんブログ村