読者です 読者をやめる 読者になる 読者になる

Fire Engineering

化学の研究者→消防士→ITエンジニア(2016年11月〜)

第2回 クラスとインスタンス 〜Rubyの勉強〜

 前回は、第1回 オブジェクト指向とは 〜Rubyの勉強〜で、オブジェクトやオブジェクト指向について書きました。今回は、オブジェクト指向における共通の概念であるクラスとインスタンスについて説明したいと思います。

クラス、インスタンスとは?

 クラスとはオブジェクトの種類を表したものです。Rubyのオブジェクトは例外なく何らかのクラスに属しています。例えば、前回説明した"Hello, world!"や"programming"などの文字列オブジェクトはStringクラスに属しており、1や3.14といった数値オブジェクトはNumericクラスに属しています。オブジェクトがどのクラスに属しているかは次のようにclassメソッドを使って調べることができます。

str = "Hello world"
p str.class     #=> String

 多くの参考書等では、イメージしやすいように、しばしばクラスをたい焼きの型(もしくは建物の設計図)などと表現します。そして、その型によって作られるたい焼きそのものがインスタンスです。インスタンス(instance)の言葉の意味は「例」です。(ちなみにfor instanceは「例えば」です。)私は、インスタンスを「何かしらを実体化したもの」というようにイメージしています。たい焼きの型を用いて実体化したたい焼きそのものがインスタンスである、といった感じです。

また、多くの参考書等では、インスタンスについて次のようにも説明されます。

すべてのオブジェクトは何らかのクラスのインスタンスである。

ん?てことはオブジェクト=インスタンスオブジェクト指向を学び始めた方が、クラスの概念がわからなくなる多くの原因はまずここにあると思います。実際に、インスタンスという言葉はオブジェクトとほとんど同じ意味でよく使われています。

 ここで、整理してみましょう。オブジェクトとは、Rubyで扱われる文字列、数値、時刻など全てのデータのことです。この時点では、クラスという概念はなくてもオブジェクトというものは存在します。一方、インスタンスとはクラスという概念を具象化(意味:姿を持つ具体的な形として表現すること。)したものです。したがって、「すべてのオブジェクトは何らかのクラスのインスタンスである。」であっても完全にイコールではないわけです。これらの違いから、あるオブジェクトが、あるクラスに属していることを強調したい場合にはインスタンスという言葉の方がよく使われます。

実際に使ってみる

 ここで、以下のコードを読み解いてみましょう。

class Student
  def hello(name)
    puts "こんにちは"+name+"さん。"
  end
end

aisatsu = Student.new
puts aisatsu.hello("hirotsuru")    #=>こんにちはhirotsuruさん。

ポイントを一つ一つ解説していきます。

1.クラスを定義する。

class クラス名
 クラスの内容
end

2.メソッドを定義する。

def メソッド名
 実行したい処理
end

同じクラスのオブジェクト(インスタンス)は同じメソッドを受けつける。

3.インスタンスを作成。

インスタンス = クラス名.new

newメソッドを用いることでインスタンスを作成できる。

 以上で、クラスとインスタンスについての説明は終わりです。次回は、クラスの継承や拡張について説明したいと思います。これらを理解するとオブジェクト指向のメリットである「コードを再利用しやすい」という点についてわかってくると思います。