オブジェクト〜クラス〜インスタンスについての覚書

#目的
オブジェクト〜クラス〜インスタンスについての個人的な覚書


##オブジェクトについて

オブジェクトとは日本語で「モノ・実体」を表す。
プログラミング上は「複数のデータと複数のメソッドをまとめたものと言える」
例えばContainerオブジェクトは下記のようなデータとメソッドを持つ。

![スクリーンショット 2017-04-30 00.42.43.png](https://qiita-image-store.s3.amazonaws.com/0/174860/1a28341b-aaa5-6ce1-0be9-f621f1ed00d9.png)

##オブジェクト指向におけるクラスについて

オブジェクト指向では「クラス」というオブジェクトの**設計図**を作成し
設計図(クラス)を元に実体(オブジェクト)を生成する。
クラス(設計図)にはそのオブジェクト(実体)が持つ「データ」とメソッドを定義する

##インスタンスについて

- クラスを元に生成される実体を「インスタンス」と呼ぶ。
- インスタンスはnewメソッドを用いて「クラス名.new」で生成する。
- 「インスタンス」と「オブジェクスト」は同じ意味で使われる。

```ruby:ruby
container1 = Container.new
container2 = Container.new
container3 = Container.new

```

![スクリーンショット 2017-04-30 01.04.16.png](https://qiita-image-store.s3.amazonaws.com/0/174860/bce4665a-9615-f812-bbd6-15483e63bb4d.png)

###インスタンスメソッド

クラス(設計図)の中で定義することによってそのクラスのインスタンス固有のメソッドを
作ることができる。
これを**インスタンスメソッド**という。

「インスタンス.インスタンスメソッド」でそのメソッドを呼び出すことができる。

```ruby:ruby
class Container

def dry_container
  puts "I am standard dry container"
end

def reefer_container
  puts "I am reefer container. I can control. temperature"
end

end

container_1 = Container.new #container_1のインスタンスを生成
container_2 = Container.new #container_2のインスタンスを生成

container_1.dry_container #container_1のインスタンスメソッドの呼び出し
container_2.reefer_container#container_2のインスタンスメソッドの呼び出し

#結果
# I am standard dry container
# I am reefer container. I can control　temperature.

```

###　initializeメソッド

- initializeという特別なメソッドを定義するとnewメソッドでインスタンスを生成するときに同時にこのメソッドが呼ばれる。
- newメソッドには引数を入れることができる。

###インスタンス変数

- @で始まる変数をインスタンス変数と呼ぶ
- **そのインスタンスの持つ固有の「データ」**を表す

```ruby:ruby

class Container

  def initialize(origin,material,manufactured_year)
    @country_of_origin = origin
    @material = material
    @manufactured_year = manufactured_year
  end


  def dry_container
    puts "私はドライコンテナです。生産地は#{@country_of_origin}で材質は#{@material}で#{@manufactured_year}に生産されました"
  end

  def reefer_container
    puts "私はリーファーコンテナです。生産地は#{@country_of_origin}で材質は#{@material}で#{@manufactured_year}に生産されました"
  end

end

container_1 = Container.new("Japan","steel",2017)
container_2 = Container.new("China","aluminium" ,2000)

container_1.dry_container
container_2.reefer_container


#結果：
#私はドライコンテナです。生産地はJapanで材質はsteelで2017に生産されました
#私はリーファーコンテナです。生産地はChinaで材質はaluminiumで2000に生産されました

```

###ゲッター(インスタンス変数の値の取得)

- インスタンス変数はクラス内にあるのでクラス外で呼び出すには以下のように"nameメソッド"を定義する必要がある。
- インスタンス変数を取得するためのメソッドを「ゲッター」と呼ぶ


```ruby:ruby
class Container

  def initialize (name)
    @name = name
  end

  def name　#ゲッターの定義
    @name

  end

end


dry_container = Container.new("ドライコンテナ")
puts dry_container.name

#結果：ドライコンテナ

```

####attr_readerを使ってインスタンス変数を呼び出す

- 　attr_readerを用いると簡単にゲッターを定義できる

```ruby

class Container

attr_reader :name #ゲッターの定義

  def initialize (name)
    @name = name
  end


end


dry_container = Container.new("ドライコンテナ")
puts dry_container.name

#結果：ドライコンテナ

```
###セッター(インスタンス変数の値を変更)

- @nameなどの値を変更する場合。クラス内からでしかできない
- クラス外からインスタンス変数の値を変更するには下記のように値をセットする

```ruby:ruby
class Container


  def initialize(name)
    @name = name
  end

  def name=(value) #セッターの定義
      @name = value
  end

  def introduction
    puts "私の名前は#{@name}です"
  end

end

dry_container = Container.new("ドライコンテナさん")
dry_container.name = "ドライコンテナくん"
dry_container.introduction

#結果：私の名前はドライコンテナくんです

```

####attr_readerを使ってインスタンス変数の値を変更する

```ruby:ruby

class Container

attr_writer :name

  def initialize(name)
    @name = name
  end


  def introduction
    puts "私の名前は#{@name}です"
  end

end

dry_container = Container.new("ドライコンテナさん")
dry_container.name = "ドライコンテナくん"
dry_container.introduction

#結果：　私の名前はドライコンテナくんです

```

####ゲッターとセッターを同時に定義する

```ruby:ruby
class Container

attr_accessor :name #ゲッター、セッターの定義

  def initialize(name)
    @name = name
  end


end

dry_container = Container.new("ドライコンテナさん")
puts "私の名前は#{dry_container.name}だったの"
dry_container.name = "ドライコンテナくん"
puts "でもね、今は#{dry_container.name}と呼ばれるようになったんだ"

#結果：
#私の名前はドライコンテナさんだったの
#でもね、今はドライコンテナくんと呼ばれるようになったんだ


```
###publicメソッド,privateメソッド

- クラスの外から呼び出せるメソッド：　**publicメソッド**
- クラスの外から呼び出せないメソッド：　**privateメソッド**
- 何も指定しない場合はpublicメソッドとなる
- privateとと宣言した以降のメソッドはprivateメソッドとなり、クラス内からでしか呼び出せない

###クラスメソッド、クラス変数

インスタンス.インスタンスメソッドで呼び出すインスタンスメソッドに対し、
「クラス名.クラスメソッド」で呼び出すメソッドのことを「クラスメソッド」と呼ぶ。
インスタンス変数と関係のないメソッドを作りたいときなどに定義する

```ruby:ruby
class Container

  def Container.data
    "これはContainerクラスのクラスメソッドです"
  end

end

Container.new
puts Container.data

#結果：これはContainerクラスのクラスメソッドです

```

###selfについて

####self(クラス)

- selfは特別な式で呼び出される場所によっt意味が変わる
- class定義の直下で使用するとそのクラス名を指し示す

```ruby:ruby
class Container

  def self.data
    "これはContainerクラスのクラスメソッドです"
  end

end

Container.new
puts Container.data

#結果：これはContainerクラスのクラスメソッドです

```

####クラス(インスタンス)

- selfはインスタンスメソッド内で使用するとそのメソッドを呼び出しているインスタンスのことを指し示す
- 他のインスタンスメソッドを呼び出したい時にselfを使う

```ruby:ruby

class Container

attr_accessor :name

  def initialize(name)
    @name = name
  end

  def put_name
    puts "私の名前は#{self.name}です"
  end

end

dry_container = Container.new ("ドライコンテナ")
dry_container.put_name

#結果：私の名前はドライコンテナです

```

####selfの省略

- インスタンスを表すselfは省略することができる

```ruby:ruby

class Container

attr_accessor :name

  def initialize(name)
    @name = name
  end

  def put_name
    puts "私の名前は#{name}です"
  end

end

dry_container = Container.new ("ドライコンテナ")
dry_container.put_name

#結果：私の名前はドライコンテナです

```