0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】オブジェクトとインスタンス

Posted at

はじめに

こんにちは、現在アメリカの大学に行って語学を学びながらソフトウェアエンジニアになるために独学で勉強しているものです。
本日はRubyを勉強しているとよく出てくるオブジェクトとインスタンスについて整理していきます。
というのも現在たのしいRubyという書籍でRubyを勉強しているのですが、これらの単語が出てきて「あれ、これはどういう意味だ?」とごっちゃになっているために整理をするべく記事にしました。

オブジェクトとは

これは以前のオブジェクト指向のところでも触れましたが、Rubyは「すべてがオブジェクト」であることが特徴です。
数値、文字列、配列、クラス自体も含め、すべてがオブジェクトとして扱われます。
オブジェクトとは、データ(状態)とそのデータに対する操作(メソッド)をまとめた存在です。
Rubyのオブジェクトは、それに応じたクラスのインスタンス(実体)です。例えば、1はIntegerクラスのインスタンス※であり、"hello"はStringクラスのインスタンスです。

instance1.rb
num = 1        # num は Integer クラスのオブジェクト
str = "hello"  # str は String クラスのオブジェクト

インスタンスとは

ここではオブジェクトの違いに触れながら説明していきます
インスタンスとは特定のクラスから生成された具体的なオブジェクトを指します。
言い換えれば、「インスタンス」は「クラスを元にして作られたオブジェクト」なので、クラスから生成された瞬間に「インスタンス」と呼ばれることが多いです。

animal.rb
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では数値などの基本的なデータ型(整数や文字列、配列など)は、言語仕様上すでに自動的にそのクラスのインスタンスとして生成されています。
これはプログラミング言語がユーザーに簡便さを提供するための機能です。

instance2.rb
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ではオブジェクトとインスタンスが密接に関わっており、クラスから生成される具体的なオブジェクトがインスタンスと呼ばれる点が重要です。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?