Ruby , Ruby on Railsの根っこを理解するための基礎知識②　〜クラスとインスタンス〜

#【クラスとインスタンス】
###クラスとは
共通で定義される部分をまとめる大元の型みたいなもの
###インスタンスとは
クラスの型を使って作られた派生した型みたいなもの
※“”で囲うと文字列を入力ができるメソッドや、[]で囲う事でArrayメソッドが利用ができるのは、予めStringクラスやArrayクラスという用意されたクラスがあるからであり、クラス自体を自分で定義する事も可能
####＜クラスを自分で定義する方法＞

```ruby:
class クラス名
  処理
end
```

※クラス名の頭文字は必ず大文字
####＜インスタンスを作成する方法＞
変数名 = クラス名.new
※「.new」で、変数に代入
####＜クラスメソッドを定義する方法＞

```ruby:
class クラス名
  def self.メソッド名
  end
end
```

※classメソッドは定義するメソッド名の前にself.をつける
※使い方は、クラス名.メソッド名
####＜クラスメソッドの使用例＞

```ruby:
class Animal
  def self.greet
    p "こんにちは!Animalです！"
  end
end
```

とクラスとクラスメソッドを定義すると、「Animal.greet」と書く事で、「"こんにちは!Animalです！”」が出力される
※クラスメソッドは、クラスしか呼び出せないため、「animal = Animal.new」とインスタンスを作成して「animl.greet」では「"こんにちは!Animalです！”」を書き出す事は出来ない
####＜インスタンスメソッドを定義する方法＞

```ruby:
class クラス名
  def メソッド名
  end
end
```

※クラスメソッドと違い「self.」をつけないだけ
※使い方は、インスタンス名.メソッド名
####＜インスタンスメソッドの使用例＞

```ruby:
class Animal
  def greet
    p "こんにちは!Animalのインスタンスです！"
  end
end
```

と定義する事で、「animal = Animal.new」とインスタンスを呼び出せば、「animal.greet」と書く事で、「"こんにちは!Animalのインスタンスです！”」と書き出す事が出来る

##【initialize】
コンストラクタと呼ばれ、インスタンスが作成された(newメソッドが実行された)タイミングで呼ばれるメソッドのこと
※クラスからインスタンスを作成するときに共通の処理を行いたい場面で使用
####＜使用例＞

```ruby:
class Animal
  def initialize
    p "インスタンスが作られました"
  end
end
```

と定義しておく事で「animal = Animal.new」とインスタンスが作成された時点で「"インスタンスが作られました”」と書き出される

#【クラス変数とインスタンス変数】
クラス内に定義する変数のこと
####クラス変数とは
クラスで使用できる変数のことで、クラスと、そのクラスからできたインスタンスから、呼び出すことができる変数
####＜クラス変数の定義と代入＞

```ruby:
class クラス名
　　@@クラス変数名 = 代入したいデータ
end
```

####インスタンス変数とは
インスタンスごとに独立し、インスタンスからのみアクセスすることができ、クラスからアクセスすることはできない変数
####＜インスタンス変数の定義と代入＞

```ruby:
class クラス名

  def インスタンス変数名=(代入したいデータ名)
    @インスタンス変数名 = 代入したいデータ名
  end

  def インスタンス変数名
    @インスタンス変数名
  end

end
```

と定義し、「インスタンス名 = クラス名.new」でインスタンスを作成後、「インスタンス名.インスタンス変数名 = 代入したいデータ」で代入が可能
※インスタンス変数はクラス内からしか呼び出せないため、上記の通りセッターとゲッターと呼ばれるメソッドをそれぞれ定義している
####セッターとは
インスタンス変数の値をセットするためのメソッドで「def インスタンス変数名=」と定義するのが一般的
####ゲッターとは
インスタンス変数の値を取得するためのメソッドで「def インスタンス変数名」と定義するのが一般的
※流れ的には、インスタンスを作成し、インスタンス変数にデータを代入し、代入された変数をゲッターでクラスが取得し、セッターでセットし、インスタンス名.インスタンス変数名で呼び出されている
####＜attr_accessor＞
上記のゲッターとセッターは、この「attr_accessor」を使用する事で、一括で指定することもできる

```ruby:
class クラス名
  attr_accessor :インスタンス変数名
end
```

と定義し、「インスタンス名 = クラス名.new」でインスタンス作成後、「インスタンス名.インスタンス変数名 = 代入したいデータ」
###＜クラス変数の使用例＞

```ruby:
class Animal
  @@counter = 0

  def initialize
    @@counter += 1
  end

  def self.get_counter
    return @@counter
  end

end
```

と定義する事で、

```ruby:
Animal.new
p Animal.get_counter
```

と書かれた際に、カウントされた数字が出力される
※「+= 1」は、クラス変数に1加算すると言う定義
※「return」は、メソッドの途中で抜け出し、その行の戻り値を返したい時に定義するメソッドで、省略も可能だが、複数行ある場合は、最後の戻り値が返される
####＜インスタンス変数の使用例＞

```ruby:
class Animal

  def name=(value)
    @name = value
  end

  def name
    @name
  end

end
```

と定義する事で、「animal = Animal.new」とインスタンスを作成した後、「animal.name = “サル”」と代入する事で、「p animal.name」と書けば「”サル”」と書き出される
####＜インスタンス変数で、attr_accessorを使用した場合＞

```ruby:
class Animal
  attr_accessor :name
end
```

と定義する事で、「animal = Animal.new」とインスタンスを作成した後、「animal.name = “サル”」と代入する事で、「p animal.name」と書けば「”サル”」と書き出される

#【継承】
既存のクラスを元に新しいクラスを作成すること
####＜定義の仕方＞

```ruby:
class クラス名 < 継承したいクラス名
```

####＜使用例＞

```ruby:
class Animal
  def self.greet
    p "こんにちは!Animalです！"
  end
end
```

と定義し、

```ruby:
class Dog < Animal
end
```

と継承し「Dog.greet」を書けば、「"こんにちは!Animalです！”」と書き出される
※継承後にクラス独自のメソッドも同じように定義可能