出典:魁!!男塾
こんにちは、Nanayakuです。
今回は、Rubyのクラス・インスタンスについて解説していきます。
目次
クラス・インスタンス
Rubyのプログラミングを構築する上で、クラス・インスタンスと言う概念を理解しておかなければなりません。
クラスは「雛形 / 設計図」で、インスタンスは「設計図を元にして作られた物」だとよく例えられます。
車で例えると、クラスが車の設計図で、インスタンスが車になります。
クラスとは
クラスとは、雛形を作るためのものです。
軽自動車やトラックなど色々な車がありますが、タイヤが4つあり、エンジンがついているなど、共通している部分をまとめるのがクラスの役割です。
インスタンスとは
インスタンスとは、クラスを元に作られたものです。
1から車を作るのは大変ですが、設計図(クラス)があるおかげで短時間に量産する事ができます。
しかし、共通している部分があっても、実際にできた車はタイヤの大きさが違ったり、ハンドルが独特なものなど色々あります。
つまり、インスタンスはできたものによって詳細がことなると言う事です。。
new
クラス・インスタンスを学習すると出てくるnewメソッドについて解説しておきます。
このnewは、クラスからインスタンスを生成するときに使います。
この時、引数を渡すことがあります。
つまり、車の設計図に車名(カムリ)・タイヤ(14インチ)・エンジン(1万馬力)など情報を入れることで、車(カムリ)が完成する感じです。
定義済みのクラス
Rubyには、初めから使えるクラスがあります。
参考
例)
Stringは文字列を表すオブジェクトを生成するクラスです。
文字列を提供するクラス(String)に引数(車)を渡し、new(インスタンス化)で生成されました。
クラスを作る
始めから使用できるクラス以外に、自分でクラスを定義する事ができます。
クラスの定義の仕方は
class クラス名
end
となります。
クラス名は大文字じゃないと定義できません。
慣習として、CarやSportsCarとキャメルケースで書くのが一般的です。
命名規則「キャメルケース」「スネークケース」「ケバブケース」についてまとめてみました
実際にCarクラスを作ると画像のようになります。
↑中身が全くない状態(白紙の設計図)で、制作する処理がないため、実行しても何も起きません。
インスタンスを作る
↑で説明した通り、中身がないので何も生成できませんが、newメソッドで生成してみます。
↑インスタンス化(.new)させたCarクラスを、変数carに代入しています。
実行すると、中身がないとエラーが出ます。
クラスメソッド・インスタンスメソッドとは
クラスメソッドは、クラス自身(設計図)に関する情報の変更や参照にしか使えません。
.newでインスタンス化して使う事は出来ません。
インスタンスメソッドは、個別のクラス(設計図)をインスタンスしたものに関する情報の変更や参考に使用できます。
.newでインスタンス化しなければ使えません。
クラスメソッド・インスタンスメソッドはこちらで詳しく解説
initialize
initializeは、クラスからインスタンスを生成した時に処理を実行するメソッドです。
つまり、クラスに.newが実行されたタイミングで呼び出されます。
コンストラクタとも呼ばれています。
実際に↓Carクラスでinitializeメソッドを実行します。
クラス内の変数を定義
クラス内の変数は定義する事ができ、
- クラス変数
- インスタンス変数
の2種類があります。
クラス変数
クラス変数とは、クラスの中で使用できる変数のことで、
- クラス(Carクラス)内
- クラス(Carクラス)からできたインスタンス
- (Carクラスを)継承したクラス【継承に関しては↓で解説】
で使用できます。
定義
クラス変数は変数の前に「@@」をつけることで定義できます。
returnは戻り値を返すメソッドです。
return文で処理が実行されればメソッド内の処理が終了になります。
しかし、Rubyでは最後の処理で終了するため、ほとんど使用されることはありません。
呼び出し
def initialize
@@tire += 1
end
は.new(インスタンス化)する毎に1足していくことを表しています。
最後の行われた処理が最初に戻ってくるので、クラス変数(@@tire)は+1されたままです。
画像からクラス内で1つの変数(@@)を共有している状態です。
インスタンス変数とは
インスタンス変数とは、各インスタンス毎に独立している変数のことです。
インスタンスからのみ使用でき、クラスからはできません。
定義
インスタンス変数は変数の前に「@」をつけることで定義できます。
呼び出し
①で代入された値を、インスタン変数(@name)に代入すると定義しています。
②でインスタンスメソッド(.name)は@name(インスタンス変数)を表していると定義し、出力(puts)しています。
画像からインスタンス毎に独立した変数だとわかります。
クラス外からインスタンス変数を呼び出すために、セッターとゲッターがあります。
セッター
セッターとは、インスタン変数を値を格納(セット)するためのメソッドです。
画像のように定義します。
つまり、↓ name = と言うメソッドになり、インスタンス変数に値を格納する事ができます。
ゲッター
ゲッターとは、インスタンス変数の値を取り出す(取得)ためのメソッドです。
画像のように定義します。
.nameでインスタンス変数を取り出す事ができます。
取り出すだけなので、出力するにはputsが必要です。
attr_accessor
セッターとゲッターは省略する事ができます。
セッターは
attr_writter :name
ゲッターは
attr_reader :name
の1行に省略できます。(:nameの:はシンボルです)
さらにセッターとゲッターは合体させる事ができます。
それが
attr_accesor :name
です。
この1行だけで、セッターとゲッターの役割を果たしています。
つまり、この1行だけでインスタンス変数を定義する事ができます。
継承
Rubyのクラスには「継承」と言うものがあります。
継承とは、他のクラス(設計図)をベースとして、新しいクラス(設計図)を作成する事です。
ざっくり例えると、TOYOTAの車の設計図をもとにNISSANの車の設計図を作る感じです。
1から作ると時間がかかり、さらにサイドミラーの位置など重複している部分が出てきます。
これらの無駄をなくすために、「継承」があります。
継承の定義は画像の通りで、継承したクラスのメソッドを使う事ができます。
また、継承したクラスは独自のメソッドを定義する事ができます。
参考資料
プロを目指すためのRuby入門(200~220P)
[itemlink post_id="643"]
最後に
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。