【第10回】Ruby初心者向け!Rubyのクラスの使い方
他のプログラミング言語でも、「クラス」という単語を聞いたことがある人は多いと思います。
Rubyも同じく、クラスはとても重要な項目になりしっかり抑えておく必要があります。
クラスとは?
そもそもプログラミング言語におけるクラスとはどういったものなのでしょうか?
クラスを説明する時によく「設計図」が引き合いに出されますが、設計図をイメージしながら読み解いていくと理解が早いと思います。
車の設計図として定義するCarクラスを例に説明します。
車のクラス(設計図)を作る場合に、車として最低限機能するにはどういったものを機能として盛り込むでしょうか?
・走る
・ブレーキ
・クラクション
簡単にまとめるこんな感じだと思います。
ここで、この設計図を元に車を作成するわけですが、作成した車 つまり実体化した車はクラスでいうインスタンスと呼ばれます。
車として最低限の機能を備えた車を何台も実体化できるような感じです。
ポルシェ、フェラーリなどがCarクラスが実体化したインスタンス。
その元となった設計図がCarクラスと言い換えることもできます。
そもそもクラスを使うことにどんな意味が?
そもそもクラスを使うことで何か恩恵を受けることができるのでしょうか?
プログラミング初心者が書く短いコードでは、クラスの実力は存分に発揮されませんが、大規模なコードになればなるほどクラスはその実力を発揮します。
・コードをひと塊りで管理できるので、保守や機能の追加が容易
・すでにあるクラスを使い回すことができる
このような形でクラスを使うことの恩恵を受けることができます。
Rubyでクラスを定義してみる
それでは実際にRubyでクラスを定義してみましょう。
class クラス名(先頭は大文字) end
これが最小単位のクラスのひな型です。クラス名の先頭の文字は必ず大文字である必要があります。
これはクラス名が変数名でもあるため、先頭文字は必ず大文字というルールです。
例にPersonクラスを定義してみましょう。
class Person
end
簡単ですね。このクラスの中身はまだ空ですが、1つのクラスを定義することができました。
クラスの中身を加えていく
ここまでPersonクラスという最小単位のクラスを定義しました。
ここからは中身を加えていきます。
Person(人)クラスを定義したので、それぞれが実体化した時に特徴を持たせます。
人の特徴なので、名前と職業という値、そして自己紹介をするメソッドを追加していきましょう。
class Person
def initialize(name, job)
@name = name
@job = job
end
def hi
puts "私の名前は#{@name}です。職業は#{@job}です"
end
end
mike = Person.new("マイク","弁護士")
mike.hi => 私の名前はマイクです。職業は弁護士です。 #出力結果
分解して解説していきます。
まず、下記の部分ではどういったことが行われているのでしょうか?
def initialize(name, job)
@myname = name
@myjob = job end
initializeメソッドはクラスに最初から備わっているメソッドの1つです。
その役割はオブジェクト作成時に必ず実行される処理を定義することができます。
ここでは、オブジェクト作成時に、変数nameとjobに「マイク」という名前と「弁護士」という職業の情報を引数として@myname,@myjobにそれぞれ代入しています。
ここで勘の鋭い方は「なぜ@を付けるの?@を外したmynameじゃダメなの?」と感じた人もいるのではないでしょうか?
@変数名はインスタンス変数と呼ばれるもので、クラス内の全メソッドで共通して使用することができます。
対して@を付けない、mynameのような変数はローカル変数と呼ばれます。
ローカル変数とはその変数が定義された場所でのみ利用できる変数です。文字通り、「ローカル」な変数です。
少し混乱してきましたね。それではここで、実際に@なしにプログラムを変更してみます。
class Person
def initialize(name,job)
myname = name myjob = job
end
def hi puts "私の名前は#{myname}です。職業は#{myjob}です"
end
end
mike = Person.new("マイク","弁護士")
mike.hi =>error!
ローカル変数はその下で定義されている、hiメソッドで使用できませんでした。
使える範囲がローカル変数ではダメなわけですね。
そして、
def hi
puts "私の名前は#{@myname}です。職業は#{@myjob}です"
end
と定義されている部分、つまりクラス内で定義されたメソッドはインスタンスメソッドと呼びます。
インスタンスメソッドはそのクラスのオブジェクトに対してのみ呼び出すことができるメソッドです。
前に紹介したメソッドはいつでも呼び出せますが、インスタンスメソッドはクラスのオブジェクトからしか呼び出せないので、クラスのオブジェクトを作成する必要があります。
クラスのオブジェクトを作成する
それではクラスのオブジェクトを作成するにはどのようにすればよいのでしょうか?
クラスのオブジェクトを作成する場合には、クラスがもともと持っているnewメソッドを使うことで作成することができます。
この時に、引数をinitializeメソッドに渡すこともできます。
mike = Person.new("マイク","弁護士")
ここでは、Personクラスのオブジェクトを作成しmikeという変数の中に代入しています。
文字列「マイク」「弁護士」という値も引数として渡しています。
これでPersonクラスのオブジェクトが作成できたので、それに対してクラスで定義したインスタンスメソッドを使用することができます。
mike.hi => 私の名前はマイクです。職業は弁護士です。#出力結果
まとめ
今回、Rubyのクラスについて紹介しました。
他にもクラスメソッドなどもありますが、多く使われるのはインスタンスメソッドとなります。
・インスタンスメソッドはオブジェクトを作成しないと使えない
・インスタンスメソッドで変数を使うには、スコープの範囲に注意する
これらの注意事項をしっかり抑えておきましょう。
▼関連記事
【第1回】Ruby初心者向け!ターミナルで動くコードを書いてみる