name(名前)やage(年齢)のデータを加える
Dogクラスにデータとしてname(名前)とage(年齢)を持たせましょう(リスト4)。
「def」がクラスにメソッドを定義するキーワードになります。「def」から「end」までがメソッドの定義です。「initialize」はメソッド名です。この名前をつけたメソッドは、クラスを初期化をするための特別なメソッドになります。
次に名前を答えるメソッドを追加します(リスト5)。
また、今まで定義したDogクラスを使うには「インスタンス化」する必要があります。インスタンス化されたクラスはメモリ上に確保され、処理を実行できるようになります。
図のようにクラスを使ってデータとメソッドをまとめた型を作り、インスタンス化して実行するのがRubyプログラムの基本になります。インスタンスにはそれぞれ別のデータを渡すことができるため、Dogクラスから太郎インスタンスや花子インスタンスが生成できるのです。
initializeメソッドで使った「@name」のように「@」を使った変数はインスタンスごとに保持するデータとなります。これをインスタンス変数と呼びます。
リスト4:nameとageのメソッドの定義
irb(main):010:0> class Dog
irb(main):011:1> def initialize(name, age)
irb(main):012:2> @name = name
irb(main):013:2> @age = age
irb(main):014:2> end
irb(main):015:1> end
=> nil
リスト5:名前を答えるメソッドの追加
irb(main):020:0> class Dog
irb(main):021:1> def name
irb(main):022:2> @name
irb(main):023:2> end
irb(main):024:1> end
=> nil
リスト6:newメソッド
irb(main):030:0> taro = Dog.new("taro", 5)
=> #<Dog:0x2987964 @age=5, @name="taro">
リスト7:インスタンスに対してメソッドを呼びたい時
irb(main):040:0> taro.name
=> "taro"
図2:クラスとインスタンス
さて、今まで定義したDogクラスに、「太郎」や「花子」といった具体的な名前を格納したいと思います。そのためには、Dogクラスのインスタンスが必要です。クラスとインスタンスの関係は、「定義」と「実体」です。例えば、「犬」という概念がクラスに対応し、隣の家のポチという具体的な存在がインスタンスということになります。
では実際にインスタンスを作成してみましょう。Rubyではインスタンス生成のためにデフォルトで用意されている「new」メソッドを使います(リスト6)。
Dogクラスからtaroインスタンスが生成され、taro変数へ格納しました。これでtaroインスタンスへのアクセスにはtaro変数が使えるようになります。ではtaroインスタンスに名前を問い合わせてみましょう。先ほど実装したnameメソッドを呼び出します。インスタンスに対してメソッドを呼びたい時は「.」を使います(リスト7)。
taroインスタンスが名前を答えてくれましたね。Rubyでは「taro.name」の「.」の左側、つまりtaroインスタンスを「レシーバ」と呼びます。
実習2
いろいろな値を与えてDogインスタンスをたくさん生成してみましょう。Dogクラスに年齢を答えるageメソッドを追加してみましょう。そのとき、すでに生成したインスタンスは変化するか確認してみましょう。また変数に格納しないインスタンスがどうなるか観察してみましょう。同じ変数に新たなインスタンスを代入してもよいでしょう。
クラスまとめ
Rubyのクラスやインスタンスといった用語やその働きを実際に動かしながら解説してきました。
これらはオブジェクト指向プログラミングの考え方が基本となっています。オブジェクト指向プログラミングとは、大雑把にいってプログラムをオブジェクトを作ることで実現していく手法です。オブジェクトとは、データと振る舞いがセットになったもので、クラスによって定義され、インスタンスとしてメモリ上を流通します。
Rubyはシンプルな文法でオブジェクト指向をサポートしており、オブジェクトの振る舞いやデータをクラスに定義してプログラミングをします。Rubyプログラミングと共にオブジェクト指向プログラミングに慣れ親しんでいきましょう。 次のページ