はじめに
こんにちは、現在アメリカの大学に行って語学を学びながらソフトウェアエンジニアになるために独学で勉強しているものです。
本日はRubyを勉強しているとよく出てくるオブジェクトとインスタンスについて整理していきます。
というのも現在たのしいRubyという書籍でRubyを勉強しているのですが、これらの単語が出てきて「あれ、これはどういう意味だ?」とごっちゃになっているために整理をするべく記事にしました。
オブジェクトとは
これは以前のオブジェクト指向のところでも触れましたが、Rubyは「すべてがオブジェクト」であることが特徴です。
数値、文字列、配列、クラス自体も含め、すべてがオブジェクトとして扱われます。
オブジェクトとは、データ(状態)とそのデータに対する操作(メソッド)をまとめた存在です。
Rubyのオブジェクトは、それに応じたクラスのインスタンス(実体)です。例えば、1はInteger
クラスのインスタンス※であり、"hello"はString
クラスのインスタンスです。
num = 1 # num は Integer クラスのオブジェクト
str = "hello" # str は String クラスのオブジェクト
インスタンスとは
ここではオブジェクトの違いに触れながら説明していきます
インスタンスとは特定のクラスから生成された具体的なオブジェクトを指します。
言い換えれば、「インスタンス」は「クラスを元にして作られたオブジェクト」なので、クラスから生成された瞬間に「インスタンス」と呼ばれることが多いです。
class Animal
end
# これはクラス Animal のインスタンス
dog = Animal.new
dog
はクラスAnimal
のインスタンスです。同時に、dog
はRubyのオブジェクトでもあります。
このように、dog
は「Animal
というクラスから生成されたインスタンス」であり、Ruby全体では「オブジェクト」として扱われます。
ここまで聞いて、インスタンスは特にクラスをもとにして作られたオブジェクトを指しておりここでいうdog
をインスタンスと呼びます。
一方で※で書いてある「1はInteger
クラスのインスタンス」という言い方に少し引っ掛かります
というのも、num = 1
のように変数として定義しているだけでdog
のようにAnimal.new
と宣言してインスタンスを作成しているわけではありません。
なぜ数値がクラスから生成されたインスタンスなのか?
通常、animal = Animal.new
のように明示的にnew
メソッドを使ってクラスからインスタンスを生成しますが、Rubyでは数値などの基本的なデータ型(整数や文字列、配列など)は、言語仕様上すでに自動的にそのクラスのインスタンスとして生成されています。
これはプログラミング言語がユーザーに簡便さを提供するための機能です。
puts 1.class #=> Integer
このコードは、1がInteger
クラスのインスタンスであることを確認できるものです。
上記のAnimal
クラスの例でいえば、p dog.class
とクラス名を調べることができます。
1はdog
と同じ振る舞いをしているため、インスタンスであることが確認できるということです
つまり、1という数値は明示的にInteger.new
のようにして生成されたわけではないですが、Rubyの内部では1がInteger
クラスに属するインスタンスとして扱われています。
ここまでをまとめると、Rubyのすべてのものはオブジェクトであり、その中でもクラスから生成できたオブジェクトをインスタンスと呼びます。
数値などの基本的なデータ型(整数や文字列、配列など)は言語の使用上インスタンスとして存在しています
これでもわからないという方向けにほかの例を考えてみましょう
オブジェクトは「何か具体的な物そのもの」、インスタンスは「その物がどの設計図(クラス)から生まれたかを示す特定の状態」と考えることができます。
例えば、スマホ全般を「オブジェクト」と呼ぶことができ、特定の製造メーカーやモデル(クラス)に基づいて作られた具体的なスマホ(iPhone)が「インスタンス」となります。
まとめ
今回の記事では、Rubyにおける「オブジェクト」と「インスタンス」の違いについて整理しました。
- オブジェクト
Rubyでは、すべてがオブジェクトとして扱われます。数値や文字列、配列だけでなく、クラス自体もオブジェクトです。オブジェクトとは、データとそれに対する操作を持つ存在であり、クラスのインスタンスでもあります。 - インスタンス
特定のクラスから生成されたオブジェクトを指します。クラスはオブジェクトの設計図のようなもので、そこから生成された具体的なオブジェクトをインスタンスと呼びます。例として、Animal.newで作成されたdogはAnimalクラスのインスタンスです。
Rubyでは、数値など基本的なデータ型も自動的にクラスから生成されたインスタンスとして扱われます。
これにより、プログラミングが簡単に行える仕組みとなっており、数値の1もIntegerクラスのインスタンスです。
このように、Rubyではオブジェクトとインスタンスが密接に関わっており、クラスから生成される具体的なオブジェクトがインスタンスと呼ばれる点が重要です。