Rubyのクラスとインスタンス(初期化、変数、メソッドについて)

# クラスとインスタンスとは
***クラス***とは設計書みたいなものです。
***インスタンス***とは設計書を下に作られたものです。

ex)
具体的に説明すると
クラスを野球のグローブだとします。
インスタンスが赤いグローブ、黒いグローブ、黄色いグローブ
とします。
これはグローブという設計図(クラス)から
いろいろな色のグローブ(インスタンス)を作るということです。

# クラスについて
今回は野球のグローブをクラスとして扱っていきます。

```rb
class Glove

  end

  #Gloveクラスのインスタンス作成
  Glove.new
```
ちなみに***クラス名の最初の文字は大文字(CamelCase)***です。

メソッドを入れると

```rb

  class Glove  #クラスを定義
    def player
      pitcher = "ピッチャー"
      puts pitcher
    end
  end

  #Gloveクラスのインスタンス作成
  glove = Glove.new
  glove.player
```
で実行すると

```
 ピッチャー
```
と出力されます。

# インスタンス変数とローカル変数
⚫︎インスタンス変数とは＠をつけてクラス内のインスタンスで使いまわせる変数です。
⚫︎ローカル変数とは何もつけず、使用範囲が狭い変数です。


まずインスタンス変数を使います。

```rb
class Glove  #クラスを定義
    def player(pitcher)
      @pitcher = pitcher  #インスタンス変数@pitcherを宣言
      puts @pitcher　　　　　
    end

    def pitcher
      @pitcher  #違うインスタンスメソッドで呼び出す。
    end
  end

  #Gloveクラスのインスタンス作成
  glove1 = Glove.new
  glove2 = Glove.new

#この2つは別々のもの
   glove1.player("ピッチャー")
   glove2.player("投手")

   #@pitcherのインスタンス変数で使い回せている
  puts glove1.pitcher
  puts glove2.pitcher
```

で実行すると

```
ピッチャー
投手
```
と出力


次にローカル変数を使います。

```rb
class Glove  #クラスを定義
    def player(pitcher)
      pitcher = pitcher  #インスタンス変数@pitcherを宣言
      puts pitcher　　　　　
    end

    def pitcher
      pitcher  #違うインスタンスメソッドで呼び出す。
    end
  end

  #Gloveクラスのインスタンス作成
  glove1 = Glove.new
  glove2 = Glove.new

#この2つは別々のもの
   glove1.player("ピッチャー")
   glove2.player("投手")

   #@pitcherのインスタンス変数で使い回せている
  puts glove1.pitcher
  puts glove2.pitcher
```

で実行すると

```
undefined local variable or method `pitcher　　' for #<Glove:0x00007f8826149ac8> (NameError)
Did you mean?  pitcher

```
のようなエラーが出ます。
これはpitcherメソッドのローカル変数pitcherが呼び出されていないというエラーが出ています。

# 初期処理initialize
Rubyの***クラスが新しく作られたときに自動的に呼び出される関数***です。
これはクラスが新しく生まれたときに自動的に行われる初期設定のようなものです。

ex)
新しいロボットを作るとき、そのロボットがどんな特別な能力を持つかを設定します。
それと同じように、Rubyのクラスも新しく作られるときに、そのクラスが持つ特別な性質や機能を設定することができます。

initializeメソッドは、クラスが新しく作られるときに自動的に呼び出され、そのクラスの初期設定を行います。これにより、例えばユーザーが新しく登録されたときに、そのユーザーの名前やメールアドレスなどの初期値を設定することができます。

使い方は

```rb

class Glove
    def initialize()
        
    end
end

```

コードを書いていくと


```rb

class Glove
  def initialize(pitcher)
      puts "投手"
      @pitcher = pitcher
  end

  def position
      puts "私のポジションは#{@pitcher}です。"
  end
end

pitcher = Glove.new("ピッチャー")

puts pitcher.position

```
で実行すると

```
投手
私のポジションはピッチャーです。
```
と出力されます。

## superとは
***initializeでよく使われるメソッド***です。
***子クラスが親クラスから何かを受け継ぐときに、その親クラスの同じ名前のメソッドを呼び出すため***に使われます。

ex)
何か料理を作るとき、そのお料理のレシピを師匠から教わるとします。
その時、自分が師匠から教わったレシピを使って料理を作るとき、師匠のレシピを使ったりします。

これと同じように、***initializeメソッドの中でsuperを使うと、親クラスのinitializeメソッドが呼び出され、親クラスの初期設定が子クラスにも適用***されます。
これにより、子クラスが新しく作られたときに、親クラスと同じ初期設定が行われるようになります。



# インスタンスメソッドとクラスメソッド
### 非エンジニア向けの説明

1.```インスタンスメソッド```
インスタンスメソッドは、***ある「個別のもの」に対して行う動作や処理***のことです。
例えば、ある人（オブジェクト）に関する情報を取得するときに使います。
一冊の本（オブジェクト）を手に取り、その本のページをめくる行為がインスタンスメソッドに相当します。
それは一つの具体的な本に対する操作です。

```book.rb
class Book
  def page_count
    # 本のページ数を返す
  end
end

book = Book.new
pages = book.page_count
```

2.```クラスメソッド```

クラスメソッドは、***ある「種類全体」に関する処理や操作***をします。
具体的なインスタンスに紐づかない動作です。
例えば、ある種類のものを一括で検索するときに使います。
例えば、図書館全体の本（クラス）を対象に、特定のジャンルの本を探す行為がクラスメソッドに相当します。
それは特定の本ではなく、全体に関する操作です。

```book.rb
class Book
  def self.find_by_genre(genre)
    # 特定のジャンルの本を検索して返す
  end
end

books = Book.find_by_genre("Mystery")
```
⚫︎***補足***
```self.```は***クラスメソッドで使われます***。


要するに、***インスタンスメソッドは一つの具体的なものに対する操作（本のページめくり）、クラスメソッドはある種類全体に対する操作（図書館の特定のジャンルの本を検索）といったイメージ***です。

### エンジニア向けの説明
1.```インスタンスメソッド```
***特定のインスタンス（オブジェクト）に対して呼び出されるメソッド***です。
通常、インスタンスメソッドはオブジェクトの状態にアクセスするためのものであり、
インスタンス変数にアクセスできます。
例えば、Railsのモデルクラス内で、データベースから取得したレコードに対する処理を行うメソッドは、
インスタンスメソッドとして実装されることがあります。

```rb
class Person < ApplicationRecord
  def full_name
    "#{first_name} #{last_name}"
  end
end

person = Person.new(first_name: "John", last_name: "Doe")
puts person.full_name # "John Doe"
```


2.```クラスメソッド```
クラスメソッドは、***クラス自体に対して呼び出されるメソッド***で、
その***クラス全体に関連する処理を行うために使われます***。
普通は、インスタンス変数にアクセスすることはありませんが、
Railsでは、***クラスメソッドはモデル全体に関連する操作や検索などの処理に使われる***ことがあります。

```rb
class Person < ApplicationRecord
  def self.by_last_name(last_name)
    where(last_name: last_name)
  end
end

people = Person.by_last_name("Doe")
```
上記の例では、by_last_name メソッドはクラスメソッドとして実装され、Personクラス全体に対して特定の姓（last_name）で検索を行います。


***インスタンスメソッドは特定のオブジェクトに対する操作に使用***され、
***クラスメソッドはクラス全体に対する操作に使用***されます。


# 参考資料

https://qiita.com/moshi1121/items/c74d350bab32113d4f3d

ChatGPT

https://pikawaka.com/ruby/instance

https://pikawaka.com/ruby/class