【Ruby】オブジェクトについて、クラスとインスタンスの関係についてざっくりまとめる

#この記事で書いていること
・オブジェクトってなに？
・クラスとインスタンスの関係

オブジェクトについて、クラスとインスタンスの関係について勉強したので自分でまとめてみました。いざ説明しようとすると、なかなかうまい言葉が思い浮かばず苦労しました…。分かりにくい説明ですが、理解の手助けになれれば幸いです。

#オブジェクトってなに？
Rubyで扱える値は全てオブジェクトです。

全てのオブジェクトは、なんらかの**クラス**（設計図）の**インスタンス**（実体化）です。
そしてクラスは、**他のクラスを継承**することができます。継承される既存クラスのことを**親クラス**といいます。

全てのクラスの親クラスは**Objectクラス**になります。
クラスの親クラスはClassクラスです。Classクラスの親クラスはModuleクラス、Moduleクラスの親クラスがObjectクラスといった形になっています。

<img width="972" alt="スクリーンショット 2019-10-01 7.47.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373922/09d046e3-b655-740d-631f-0b2b0cf429e4.png">


詳しくは以下のページへ！
・[Rubyリファレンス：標準クラス・モジュール](https://ref.xaio.jp/ruby/classes)

#クラスとインスタンスの関係
・**インスタンス**＝クラスをもとに生成されるオブジェクト。インスタンスは**実体**という意味で、**クラスを実体化したもの**、ということになります。
・**クラス**ではインスタンスを作る際の**属性や操作を定義**します。**インスタンスの設計図**とよく聞きますね。

インスタンスを生成するには必ずクラスを指定する必要があり、指定したクラスから生成されたインスタンスは、**クラスで定義した属性**を持ち、**クラスで定義した操作**を行うことができます。
属性は、インスタンスによって値を変えることができます。

<img width="536" alt="スクリーンショット 2019-09-30 17.31.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373922/de705061-ae21-3e0b-200c-59e61f1e278f.png">

##スマホをクラスとインスタンスで作ってみる
では、クラスとインスタンスの関係を使ってスマホを２つ作ってみましょう！
スマホクラスを作り、そこからインスタンスを２つ作ります。

スマホクラスは、全てのスマホに共通する属性、操作が定義されます。
属性
・メーカー
・色
・容量

属性は１つ１つのスマホによってそれぞれです。

操作
・電話をする
・メールをする
・写真を撮る

スマホができる操作です。
実際のスマホはもっと定義できる属性と操作がありますが、今回はこの３つに絞って考えます。

スマホクラスから作られたインスタンスは、**メーカー**、**色**、**容量**の属性を持ち、**電話をする**、**メールをする**、**写真を撮る**という操作を行うことができます。
スマホクラスを作ってしまえば、スマホ（実体）をいくつでも簡単に作れますね！

<img width="974" alt="スクリーンショット 2019-09-30 17.32.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373922/66d3097c-e69c-293a-7870-80f3aa70480e.png">


##Rubyでスマホをクラスとインスタンスで作ってみる
実際にRubyでスマホクラスを作り、インスタンスを生成してみましょう！

はじめに、スマホクラスを作ります。
属性と操作を定義してみましょう。
属性は**インスタンス変数（＠）**、操作は**def~end**で定義をします。

```object.rb
class Smartphone
  # 属性の定義

  #インスタンス変数を読み書きするためのアクセサメソッド。
  attr_accessor :manufacture, :color, :storage

  # inithalizeメソッド…インスタンスが生成される時に自動的で呼び出されるメソッド
  # 必ず実行したい処理（初期化など）を、メソッドを呼び出すことなく実行することができる
  def initialize(manufacture, color, storage)
    # インスタンス生成時に与えられた値（属性の内容）をインスタンス変数に保存
    @manufacture = manufacture
    @color = color
    @storage = storage
  end

  # 操作（メソッド）の定義
  def tel(name)
    puts "#{name}に電話をかける"
  end

  def email(name)
    puts "#{name}にメールを送る"
  end
  
  def picture
    puts "写真を撮る"
  end
end
```

これでスマホクラスができました。
では。ここからインスタンスを２つ生成しましょう。
インスタンスは**クラス名.new**で作ることができます。

```object.rb
class Smartphone
  # 属性の定義
  attr_accessor :manufacture, :color, :storage
 
  def initialize(manufacture, color, storage)
    @manufacture = manufacture
    @color = color
    @storage = storage
  end

  # 操作の定義
  def tel(name)
    puts "#{name}に電話をかける"
  end

  def email(name)
    puts "#{name}にメールを送る"
  end
  
  def picture
    puts "写真を撮る"
  end
end

# 追加ーーーーーーーーーーーーーーーーー
# クラスからインスタンスを生成
smaho_1 = Smartphone.new("Apple", "black", 128)
smaho_2 = Smartphone.new("Google", "white", 64)
```
これで２つのスマホを作ることができました。それぞれスマホ１とスマホ２の属性を見てみましょう。

```object.rb
class Smartphone
  # 属性の定義
  attr_accessor :manufacture, :color, :storage
 
  def initialize(manufacture, color, storage)
    @manufacture = manufacture
    @color = color
    @storage = storage
  end

  # 操作の定義
  def tel(name)
    puts "#{name}に電話をかける"
  end

  def email(name)
    puts "#{name}にメールを送る"
  end
  
  def picture
    puts "写真を撮る"
  end
end

# クラスからインスタンスを生成
smaho_1 = Smartphone.new("Apple", "black", 128)
smaho_2 = Smartphone.new("Google", "white", 64)

# 追加ーーーーーーーーーーーーーーーーー
# スマホ１の属性
puts "-スマホ１-"
puts smaho_1.manufacture
puts smaho_1.color
puts smaho_1.storage

# スマホ２の属性
puts "-スマホ２-"
puts smaho_2.manufacture
puts smaho_2.color
puts smaho_2.storage

```
ターミナルでrubyファイルを実行し、属性を見てみます

```:ターミナル
$ruby object.rb
-スマホ１-
Apple
black
128
-スマホ２-
Google
white
64
```
スマホ１、スマホ２で別々の属性が設定できているのが分かります。

インスタンスは所属するクラスで定義した操作を行うことができます。
では、スマホ１で電話、スマホ２でメールを送る処理をしてもらいましょう。

```object.rb
class Smartphone
  # 属性の定義
  attr_accessor :manufacture, :color, :storage
 
  def initialize(manufacture, color, storage)
    @manufacture = manufacture
    @color = color
    @storage = storage
  end

  # 操作の定義
  def tel(name)
    puts "#{name}に電話をかける"
  end

  def email(name)
    puts "#{name}にメールを送る"
  end
  
  def picture
    puts "写真を撮る"
  end
end

# クラスからインスタンスを生成
smaho_1 = Smartphone.new("Apple", "black", 128)
smaho_2 = Smartphone.new("Google", "white", 64)

# スマホ１の属性
puts "-スマホ１-"
puts smaho_1.manufacture
puts smaho_1.color
puts smaho_1.storage

# スマホ２の属性
puts "-スマホ２-"
puts smaho_2.manufacture
puts smaho_2.color
puts smaho_2.storage

# 追加ーーーーーーーーーーーーーーーーー
# クラスで定義した操作をする
puts "-操作-"
smaho_1.tel("お母さん")
smaho_2.email("お父さん")

```
ターミナルで実行します

```:ターミナル
$ruby object.rb
-スマホ１-
Apple
black
128
-スマホ２-
Google
white
64
-操作-
お母さんに電話をかける
お父さんにメールを送る
```
ちゃんと電話とメールをしてくれました！
スマホ１とスマホ２はスマホクラスから生成されたインスタンスなので、どちらも**電話をする**、**メールをする**、**写真を撮る**という操作を行うことができるのです。

#学んだことまとめ
・オブジェクトは**Rubyで扱える全ての値**を指す。オブジェクト自体はなんらかのクラスのインスタンスであり、大元のクラスはObjectクラスである。

・クラスは**インスタンスの設計図**で、そのクラスが持つ属性と操作を定義する。
・属性は**インスタンス変数(@)**、操作は**def~end(メソッド)**で定義する。

・インスタンスは**クラスから生成**される。
・属性の値はインスタンスごとで設定できる。
・インスタンスは**親クラスのメソッド（操作）**を使用できる。

#参考
・[Rubyを始めたけど今ひとつRubyのオブジェクト指向というものが掴めないという人、ここに来て見て触って！](https://melborne.github.io/2013/02/07/understand-ruby-object/)
・[rubyにおけるオブジェクト指向とはなにか(๑•̀ㅂ•́)و✧【基礎】](https://qiita.com/kansiho/items/13b5e9a32ddfc9bea01c)
・[オブジェクトの概念 Ruby](https://qiita.com/fukumone/items/76e4f04a5188f4abb061)
・[Ruby 2.6.0 リファレンスマニュアル > オブジェクト](https://docs.ruby-lang.org/ja/latest/doc/spec=2fobject.html)
・[オブジェクト指向超入門](http://www.rsch.tuis.ac.jp/~ohmi/software-intro/objectoriented.html)
・[Rubyリファレンス：標準クラス・モジュール](https://ref.xaio.jp/ruby/classes)