はじめに

オブジェクト指向をご存じですか?
この連載の冒頭で、Rubyは「オブジェクト指向」の言語だということをお伝えしました。
オブジェクト指向は、プログラムの構築するためのひとつの考え方です。
Rubyではすべてのものがオブジェクトなので、今まで扱ってきたものもすべてオブジェクトです。
それでは、オブジェクトとは一体何なのでしょうか?
この記事では、Ruby初心者の方向けに、オブジェクト指向とRubyでのクラスの作り方などについてお伝えしていきます。
重要な概念なので、しっかりおさえておきましょう。

オブジェクトとはなにか?

オブジェクト指向では、「オブジェクト・クラス・インスタンス」の3つの概念が中心となります。
Rubyでは、クラスから生成されたものがオブジェクトであり、そのクラスのインスタンスとなります。
つまり、Rubyではすべてのものがなんらかのクラスから生み出されているということです。

クラスとインスタンスの関係

クラスはインスタンス(オブジェクト)のテンプレート(雛形)のようなもので、ひとつのクラスから複数のインスタンスを作れます。
クローンを作るようなものです。
後ほどコードでも説明しますが、それぞれのインスタンスは独立していることを覚えておいて下さい。

これまで使ってきたものもすべてクラス

これまでの連載で、数値や文字列など、さまざまなものを扱ってきました。
冒頭でもお伝えした通り、これらもすべてオブジェクトだったのです。
それは、次のコードで確認することができます。
例:

puts 123.class
puts "abc".class

すべてのオブジェクトには「classメソッド」が定義されており、それを呼び出すことでどのクラスのオブジェクトなのか知ることができます。
ちなみに、”classメソッド”が返す値もオブジェクト(Classクラスのインスタンス)です。

クラスを作ってみよう

それでは、さっそく自分でクラスを作ってみましょう。
ここでは、正四角形を表すクラスを考えてみます。たとえば、次のような形です。
例:

class Square
    def initialize(length)
        @length = length
    end
    def area
        @length * @length
    end
    def printAA
        if @length > 1
            puts "+" * @length
            @length.times do |n|
                puts "+" + " " * (@length - 2) + "+"
            end
            puts "+" * @length
        else
            puts "□"
        end
    end
end

クラスは、「インスタンス変数」と「インスタンスメソッド」を持つことができます。
インスタンス変数とは、インスタンス専用の変数で、インスタンスごとに独立しています。
この例では、”@length”がインスタンス変数です。
また、インスタンスメソッドは、インスタンスオブジェクトから呼び出せる操作を表します。
この例では、”area”と”printAA”の2つのメソッドが定義されています。
もうひとつ”initialize”というメソッドが定義されていますが、これはオブジェクトが生成されるときに呼び出される特殊なメソッドです。
さっそく、このクラスを使ってみましょう。
例:

s = Square.new(4)
puts "Area: #{s.area}"
s.printAA

クラスからオブジェクトを生成するには、定義したクラスの「newメソッド」を使います。
”newメソッド”なんて定義していないじゃないかと思うかもしれませんが、これはClassクラスで定義されているメソッドなのです。
すべてのクラスが(先ほど定義したSquareも含めて)Classクラスのオブジェクトであることを思い出して下さい。
ここでは、”newメソッド”の引数として数値を渡しています。
これはそのまま”initializeメソッド”に渡され、”@length変数”に保存されることになります。
“newメソッド”で生成したオブジェクトは、変数に割り当てて使います(ここでは変数s)。
後は、その変数に対して定義したメソッドを呼び出してやるだけです。
Rubyでは最後の行の評価値(値)が自動的にメソッドの返り値になるため、”areaメソッド”は正しく面積を返します。
厳密に言えば、”printAAメソッド”も「nil(空値)」を返しています。
また、次のようにクラスから複数のインスタンスを作ることもできます。
例:

s1 = Square.new(6)
s2 = Square.new(8)
puts "Area: #{s1.area}"
puts "Area: #{s2.area}"

それぞれのオブジェクトのインスタンス変数が独立しているのがお分かりになるでしょう。

まとめ

オブジェクト指向について理解できましたか?
オブジェクト指向は、クラスとインスタンスが中心です。
関連するメソッドや変数をクラスにまとめることで、独立した複数のインスタンスとして扱えるようになります。
クラスをうまく構築できるようになるまでには習熟が必要です。
じっくり取り組んでみましょう。