記事の内容
この記事では、Rubyのクラスの定義方法や使い方について説明していきたいと思います。
目次
クラス(class)とは何か?
クラスとは、データを管理する型であり、設計図でもあります。
そのため、クラス名は抽象的な名前になりがちです。
例えば、車を管理するクラスを作りたいとします。
その場合、クラス名は、「プリウス」「ベンツ」という具体的な名前にはなりません。
クラス名は、「Car」といった抽象的な名前をつけます。
なぜならば、繰り返しにはなりますが、クラスは設計図であり抽象的なものを表すからです。
インスタンス(オブジェクト)とは何か?
クラスは設計図なので、それを実際に動かすためには、クラスを組み立てて実体化させてやる必要があります。
その作業を「インスタンス化する」と言ったり、「オブジェクトを生成する」と呼んだりします。
クラスの定義方法
クラスを定義するためには、「class」「end」という2つのキーワードを使います。
クラス名の先頭は、常に大文字にして下さい。
具体的には、このように定義します。
end
インスタンスの使い方
インスタンスを生成するためには、「new」というキーワードを使います。
一つのクラスに対して、インスタンスは、いくつでも作成することができます。
インスタンスメソッドとインスタンス変数
クラスに「インスタンスメソッド」と「インスタンス変数」を定義する
今までは、クラスの定義方法とインスタンスの使い方について紹介しました。
ここでは、実際にクラスを使う方法を紹介します。
クラスには、インスタンスメソッドと、インスタンス変数という2つのモノを定義することができます。
インスタンスメソッドは、クラスの中に「def」「end」という2つのキーワードを使って定義します。
インスタンス変数は、「@」というキーワードを使って定義します。
インスタンス変数は、クラスの中で共有される変数です。
「@」を付けない変数とのスコープの違いを意識すると、インスタンス変数の意義がわかるはずです。
この2つは、クラスからインスタンスを生成することで、使うことができるようになります。
「インスタンスメソッド」と「インスタンス変数」は、クラスのままでは使うことができません。
「initialize」というキーワードを使って、インスタンスに初期値を与える
「initialize」メソッドは、オブジェクトが生成される時に実行されるメソッドなので、インスタンス変数に初期値を設定することができます。
「initialize」メソッドのように、「オブジェクトが生成される時に実行されるメソッド」をコンストラクタと呼びます。
「initialize」メソッドを使って、先程のコードを綺麗に書いてみます。
「new」キーワードに渡した値が、initializeの引数に入ってきます。
「initialize」メソッドを使うことで、「new」を使ってインスタンスを生成したタイミングで、nameとsizeに値をセットできたことがわかります。
「attr_accessor」というキーワードを使って、値を代入するメソッドを省略する
「attr_accessor」を使うことで、上記のコードにある「name=」「size=」の2つのメソッドを省略できます。
「attr_accessor」をコメントアウトした場合に、インスタンスのnameやsizeに値を代入できないことを確認してみて下さい。
クラスメソッド
クラスには、クラスメソッドというものもあります。
クラスメソッドは、個々のインスタンスに含まれる必要がないデータを扱う時に使います。
例えば、Carクラスで言えば、車を作るメソッドは、インスタンスメソッドに含まれる必要がありません。
なぜならば、carインスタンスは、プリウスやベンツといった個々の車のデータを管理していて、「車を作る」という作業内容をcarインスタンスが持つ必要はないからです。
クラスメソッドは、メソッド名の前に「self.」をつけることで定義することができます。
もう一つのやり方は、「class << self」と「end」の間にメソッドを入れる方法です。
クラスメソッドを使う場合は、「new」キーワードがナシで使うことができます。
クラス変数
クラスの中には、クラス変数を定義することもできます。
クラス変数は「@@」というキーワードで管理します。
先程、車を作る「create」メソッドがありましたが、車の製造台数を管理したい場合に、クラス変数を使います。
なぜならば、車の製造台数といった情報も、個々のインスタンスが持つ必要のない情報だからです。
今回は、車を2台作成した後で、3台目を作成しました。
その際にも、車の製造台数が保持されていることがわかるはずです。
クラスでデータを管理すると便利
「何で、クラスを使う必要があるのか?」「Hashでもデータを管理できるのではないか?」という疑問を持つ方もいるかもしれません。
確かに、上記の規模のデータならば、下記のようにHashでデータを管理することもできそうです。
ただし、Hashはキーを追加したり削除をすることもできるので、脆くて壊れやすいプログラムになりがちです。
そのため、より堅牢で扱いやすいデータ型を作るために、Carクラスを作成するのが一般的です。
まとめ
この記事では、クラスとインスタンスに関することを説明しました。
クラスを理解することで、様々なコードを柔軟に書くことができるようになるはずです。
Good luck for your engineer life!