7. クラスとオブジェクト
2013/06/09 シナジーマーケティング(株) 松尾 裕美
7章 クラスとオブジェクト
- 7.1. オブジェクト指向型言語におけるクラス
- 7.2. クラスの定義
- 7.3. インスタンスメソッド
- 7.4. インスタンス変数
- 7.5. オブジェクトの生成、インスタンスメソッドの呼び出し
- 7.6. アクセサメソッド
- 7.7. initializeメソッド
- 7.8. クラス変数、クラスメソッド
7.1 オブジェクト指向型言語におけるクラス
第1章 で、Rubyはオブジェクト指向型言語であるとお話ししました。
Rubyでは整数などの基本的なデータ型も含め、すべてがオブジェクトで表現されます。
純粋なオブジェクト指向型言語といえるでしょう。
他のオブジェクト指向型言語と同様、オブジェクトを生成するためにはクラスが必要です。
この章では、クラス定義の方法とオブジェクトを生成しメソッドの呼び出し等を実施する方法をご説明します。
今回は先にクラスを定義したコードを見ていただきましょう。下記は「人間」を表すHumanというクラスを定義しています。
# coding: windows-31j class Human # 名前をセットする「name=」というメソッド def name=(name) @name = name end # 名前を返す「name」という引数なしメソッド def name return @name end # 年齢をセットする「age=」というメソッド def age=(age) @age = age # インスタンス変数「@age」の宣言 end # 年齢を返す「age」という引数なしメソッド def age return @age end # 名前と年齢を表示するメソッド def print_name_age puts "名前は#{@name}です。年は#{@age}歳です。" end end
7.2 クラスの定義
Rubyのクラス定義は、以下のようにします。
class クラス名 ... end
クラス名には先頭が英大文字の識別子をつけます。(例えば、「Human」や「Cat」など)
慣例として単語の区切りも大文字にします。(例えば、「BookShelf」や「NodeBook」など)1
7.3 インスタンスメソッド
前章と同じ形式のメソッドをクラス内に定義すると、そのメソッドは「インスタンスメソッド」となります。
インスタンスメソッドとはオブジェクトに対して何か操作をするためのメソッドです。
メソッドを呼びだす際には、メソッドが定義されたクラスのオブジェクトを生成して呼び出します。
# 名前と年齢を表示するメソッド def print_name_age puts "名前は#{@name}です。年は#{@age}歳です。" end
7.4 インスタンス変数
クラスから生成されたオブジェクトは、オブジェクトごとに異なる値を持つことができます。
この変数を「インスタンス変数」といいます。
Rubyでは「@」から始まる変数をインスタンス変数とみなします。
ローカル変数と異なり未代入のインスタンス変数(宣言のみ)はnilが代入されています。
Rubyではクラスの外部からはインスタンス変数を直接操作することはできません。
そこで、必要に応じて外部からインスタンス変数にアクセスするためのインスタンスメソッドを作成しておきます。
このインスタンスメソッドのことを「アクセサメソッド」とも言います。
アクセサメソッドはインスタンス変数名をメソッド名とし、インスタンス変数に値をセットするメソッドはメソッド名の最後に「=」をつけます。
# インスタンス変数「@name」に名前をセットする「name=」というメソッド def name=(name) @name = name end # インスタンス変数「@name」に格納されている名前を返す「name」という引数なしメソッド def name return @name end
7.5 オブジェクトの生成、インスタンスメソッドの呼び出し
クラスの定義ができたので、実際にオブジェクトを生成してメソッドを呼びだしてみましょう。
オブジェクトを生成する際は、「new」メソッドを用いて作成します。
変数名 = クラス名.new
また、インスタンスメソッドの呼び出しは、どのオブジェクトに対してメソッドを呼び出すか指定する必要があります。
変数名.メソッド名(引数)
メソッドを呼びだすオブジェクトのことを「レシーバー」とも言います。
上記Humanクラスから、taroオブジェクトを生成し、名前と年齢をセットし表示するのが以下のプログラムです。
30行目と31行目は、Humanクラスのインスタンス変数にアクセスしているように見えますが、それぞれ「name=」「age=」メソッドが呼び出されます。つまり、アクセサメソッドを定義していなければエラーとなるので注意が必要です。
taro = Human.new taro.name = "太郎" # 「name=」メソッドの呼び出し。正確には「taro.name=("太郎")」 taro.age = 30 # 「age=」メソッドの呼び出し taro.print_name_age
■実行結果
> ruby human.rb
名前は太郎です。年は30歳です。
1 Rubyでは、クラスも実はオブジェクトの一種です。Classクラスより生成されるオブジェクトで、クラス名がそのオブジェクトを参照する定数の役割となります。