どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

Ruby入門 part8

本日はRuby入門の「クラスとモジュール」の前半をやっていきます😊

1.クラスの概念

1-1. クラスとは

オブジェクト指向のプログラミングでは、プログラムを処理するために、まず何かをする物(オブジェクト)の設計図を作成します。
その設計図から物(オブジェクト)を作成し、処理をさせるという流れです👀
「クラス」とは、物(オブジェクト)を作成する元になる設計図のことです。ただし「設計する」という言葉ではなく「定義する」と言います💡
クラスは以下のように定義します。

class クラス名

end

クラス名は、大文字のアルファベットから始まります。

1-2. クラスメソッド

全てのクラスにはクラスメソッドが用意されているそうです!
メソッドについてはこちらの記事参照です🔖

例えば、クラスからオブジェクトを作成するためのnewメソッドがあります。
newメソッドはこれまでの記事にも何度も出てきましたね〜。
Ruby入門の始めのほうに出てきたString.new()とか!
参考記事:Ruby入門 part1

newメソッドは、クラス名の後にドット「.」を付けてnewと書きます。
また、作成されたオブジェクトを格納するための変数名を指定します。
文字の説明だけでは分かりにくいので、実際にやってみます!

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181124155735p:plain
Petクラスのオブジェクトを2つ作成できました🎉
newメソッドのように、クラスに対して実行するメソッドはクラスメソッドと呼ばれます。

1-3. インスタンスメソッド、インスタンス変数

クラスから作成したオブジェクトに何か実行させるには、クラス内にメソッド(実行する一連の処理)を書いていく必要があります。
クラス内に記述されたメソッドをインスタンスメソッドと言います。
インスタンスメソッドは、そのクラスから作成されたオブジェクトしか呼び出すことが出来ません。
今まで学習してきた通常のメソッドは、プログラム中からいつでも呼び出せますよ〜👌
インスタンスメソッドはこんな感じで書かれます。

class クラス名

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

end

引数が無いメソッドなら、無ければ( )ごと省略できます😊

オブジェクトの中で値を保存しておくためには、インスタンス変数という変数を使います。 インスタンス変数の名前は@で始まります。
ローカル変数の値はメソッドを抜けると消えてしまうのに対して、インスタンス変数はクラス内の全メソッド共通で使用することが出来ます✨
最初にどこかのメソッドでインスタンス変数が作成されたら、他のメソッドで値を取り出したり格納したりすることが出来るようになります💪

また、インスタンス変数はクラスから作成されるオブジェクト毎に固有のものとなります。
イメージが難しいので、実際にやってみます!
といっても先程とほとんど同じプログラムですが笑
インスタンス変数がオブジェクト毎に固有の値を持っているのが理解できると思います。

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181124165717p:plain

また、インスタンスメソッドのうち、最初のサンプルプログラムに出てきたinitializeは、オブジェクト作成時に必ず実行したい処理を、メソッドを呼び出すことなく実行することが出来ます。
「メソッドを呼び出すことなく」の部分がよく分からない場合は、最初のサンプルと2つめのサンプルを見比べてみてくださいね〜!👌

1-4. アクセスメソッド

先程の説明にもあったとおり、インスタンス変数はクラスの中だけで参照できます。逆に言うと、通常はクラスの外からはインスタンス変数を参照できません。
そこで、クラスの外から簡易的にインスタンス変数の参照や更新をするメソッドを作るアクセスメソッドというものが用意されています。

用意されているアクセスメソッドは次の3つです。

定義式 機能
attr_reader :変数名 参照が可能
attr_writer :変数名 更新が可能
attr_accessor :変数名 参照と更新が可能

試しに先程のプログラムの例にアクセスメソッドを記載して、インスタンス変数の値を変更してみます!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181124185325p:plain

1-5. クラス変数

オブジェクト毎に固有の値を持っているインスタンス変数に対して、クラスから作成された全てのオブジェクトで共有されるクラス変数というものがあります。
クラス変数は、あるオブジェクトでクラス変数の値を更新した場合、別のオブジェクトでクラス変数を参照すると、更新された後の値を取得します。
クラス変数の変数名は@@で始まります。
  gist.github.com
ここでは、countというクラス変数を作って、getCountというメソッドの返り値がcountになるようにしました!
initializeメソッドはオブジェクトが作成される度に実行されるため、オブジェクトが作成される度にクラス変数countの値が増加していくことになります。
結果は以下のとおりです。
f:id:mistyrinth:20181124212014p:plain

1-6. 定数

クラス内で定義した定数は、クラスの外で参照するには以下のように記述します。

クラス名::定数名

2.クラスの継承

2-1. クラスを継承する

既に作成したクラスを拡張して、新しいクラスを作成することが可能です。これを「クラスの継承」といいます。
これにより、以前作成したクラスに似たものをいちいちゼロから書かなくても良くなります🙂
書き方は以下のとおりです。

class クラス名 < 継承したいクラス名

end

この時、作成するクラスを「サブクラス」または「子クラス」といい、継承するクラスを「スーパークラス」または「親クラス」と言います。
クラスを継承すると、親クラスで定義されているメソッドを子クラスでも使用できます。
また、親クラスで定義されたメソッドについては、子クラスで同じ名前のメソッドを新しく定義しなおすことができます。これを「メソッドのオーバーライド」と呼びます。

実際にやってみます!
gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181124231547p:plain

メソッドのオーバーライドの際、親クラスのメソッドを呼び出したいときは、superメソッドを使って呼び出すことができます。
メソッドの中にsuperと書くことで、親クラスに定義されている同名メソッドを呼び出せます!
試しに書いてみると、以下のようになります。

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181124233214p:plain

なお、引数付きで親クラスのメソッドと呼び出す場合は、super(引数)という書き方になります。

本日は以上です!\(^^)/