Rubyのクラスの概念について

Rubyの学習をはじめたばかりのときにつまずくポイントとして「クラス」というものがあります。
この記事ではRubyにおける「クラス」とは何か「インスタンス」とは何かを初心者の方にもわかりやすいように解説していきたいと思います。
#この記事の概要

・Rubyにおける「クラス、インスタンス」の概念の説明
・「インスタンス変数、インスタンスメソッド」の説明
・「クラス変数、クラスメソッド」の説明

#前提知識　「Rubyの全てのデータはオブジェクトとして扱う」
Rubyは全てのデータをオブジェクトとして扱います。そのデータ自体がメソッドを持っています。

#「クラス」の概念
Rubyにおけるクラスとは「オブジェクトの種類を表すもの」、「一種のデータ型」であるとされます。

オブジェクトの種類を表すもの？？と疑問に思った方もいらっしゃると思うので解説してきます。前提知識で述べたようにRubyでは全てのデータをオブジェクトとして扱います。

そのオブジェクトごとに対象となるデータとメソッドが変わってきます。
例えば文字列オブジェクトなら文字列を扱い、数値オブジェクトなら数値を扱います。
そしてオブジェクトはなんらかのクラスに必ず属しています。
そのオブジェクトが属しているクラスごとに使えるメソッドが変わります。

クラスが定義されていることによって共通点を持ったデータを保存しやすくなったり、扱えるメソッドをまとめておくことができます。

Rubyではクラスはもとから定義されているものもあります。どのようなものが定義されているかはこちらのドキュメントをご覧ください　https://docs.ruby-lang.org/ja/latest/library/_builtin.html

またこれらの他にクラスは自分で定義することもできます。クラスの定義は以下のようになります。

```ruby:User.rb
 class Human
 
 end
```
この中に保存するデータとメソッドを定義していきます。

#インスタンスとは？？

先ほど、クラスは「オブジェクトの設計図」と述べましたが、この設計図をもとにつくられるオブジェクトをインスタンスと言います。同じクラスからつくられたインスタンスは同じデータ項目をもち、同じメソッドを使えます。しかし、インスタンス一個一個のそれぞれの中に保存されているデータの中身はインスタンスごとに変わります。

ここでクラスとインスタンスについて現実世界を例に考えてみましょう

会社をクラス、社員をインスタンスとして例えます。
 それぞれの会社（クラス）にはそれぞれのルールがあります。そのルールにしたがって社員（インスタンス）は行動（メソッド）を起こします。その会社（クラス）ごとにルールは異なるので属する会社（クラス）によって社員（インスタンス）の行動（メソッド）も限定されてくるのです。
そして、社員（インスタンス）は一人一人名前や性別が違います。これが先ほど説明したインスタンスの持っているデータはインスタンスごとに異なるというものです。

インスタンスの作成は以下のように行います。

```ruby
class Company

end

member1 = Company.new #Companyクラスからインスタンスを作成し、変数member1に代入


 
```

クラス名に対してnewメソッドを使うことによってインスタンスが作成されます。

次にこのmember1に名前や性別、歳などの情報を持たせましょう。情報を持たせるために「インスタンス変数」を使います。「インスタンス変数」とはインスタンスごとに独立して持つ変数です。インスタンス変数は先頭に@マークをつけて使います。
インスタンス変数はクラス内でしたら全てのメソッドで使用することができます。同じ名前のインスタンス変数でも対象となっているオブジェクトごとに中に入っているデータ（名前、性別、歳）は異なります。

情報を持たせるための記述は以下のようになります。

```ruby
class Company

 def initialize(name,sex,age)
　　#インスタンス作成時に引数で渡された名前と性別、歳をインスタンス変数に代入
   @name = name
   @sex = sex
   @age = age
  end

  def foge
   puts "私は#{@name}です。性別は#{@sex}です。歳は#{@age}です"
  end

end

member1 = Company.new("daichi","男",20) #Companyクラスからインスタンスを作成し、変数member1に代入。
#引数にインスタンスの名前、性別、歳などの情報（インスタンス個別の情報）を渡します。

member1.foge
#=>私はdaichiです。性別は男です。歳は20です。



```

newメソッドを使ってインスタンスが作成されるとinitializeメソッドが呼ばれます。initializeメソッドでは、インスタンスの初期設定を行います。今回の場合は引数として渡したインスタンスの名前と性別と歳をインスタンス変数に代入するという処理をおこなっています。
次にmember1のインスタンス対してmember1.fogeとすることでfogeというメソッドを呼び出しています。
このfogeとはインススタンスメソッドです。インスタンスメソッドとは、その名の通りインスタンスに対して呼び出されるメソッドです。今回のfogeというインスタンスメソッドは、member1というインスタンスに対して、インスタンス変数作成時に代入された@name,@sex,@ageを使い、簡単な自己紹介の文章を出力しています。(putsは文字列などを出力するメソッド）fogeメソッドのなかで@nameなどのインスタンス変数を使っています。これが先ほど述べたインスタンス変数はクラス内でしたら全てのメソッドで使用することができるということです。

#インスタンスについてもう少し詳しく
次にインスタンス変数の値を変更する方法について解説します。インスタンス変数の値を読み書きするメソッドを「アクセスメソッド」といいます。本来インスタンス変数をクラスの外部から参照したり、外部から変更したりする場合は専用のメソッドを定義しなくてはいけません。しかしアクセスメソッドを使うことでインスタンス変数の値の読み書きが容易になります。
アクセスメソッドにはインスタンス変数の内容を読みこむ専用の「attr_reader」を使います。インスタンス変数の内容を書き込む専用にしたい場合は「attr_writer」を使います。読み書き両方をできるようにするためには「attr_accessor」を使います。attr_accessorの定義はクラスの直下に行います。

```ruby
class Company
 attr_accessor :name,:sex,:age

 def initialize(name,sex,age)
　　#インスタンス作成時に引数で渡された名前と性別、歳をインスタンス変数に代入
   @name = name
   @sex = sex
   @age = age
  end

  def foge
   puts "私は#{@name}です。性別は#{@sex}です。歳は#{@age}です"
  end

end

member1 = Company.new("daichi","男",20) #Companyクラスからインスタンスを作成し、変数member1に代入。
#引数にインスタンスの名前、性別、歳などの情報（インスタンス個別の情報）を渡します。

member1.foge
#=>私はdaichiです。性別は男です。歳は20です。

member1.name = "nana" #member1の名前をnanaに変更
member1.sex = "女" #member1の性別を女に変更
member1.age = 39 #member1の歳を39に変更

member1.foge #もう一度変更したmember1インスタンスに対してfogeというインスタンスメソッドを呼び出す
#=>私はnanaです。性別は女です。歳は39です

```


ご覧の通りmember1のもつ情報をクラスの外から変更することができましたね！！

#クラス変数について
インスタンス変数の他にクラス変数というものがあります。インスタンス毎に格納されるデータが異なるインスタンス変数とは違い、クラス変数はそのクラスの中で共通のデータを持ちます。具体例をみながら覚えていきましょう。さきほどまで使っていたCampanyクラスの中に会社の社員数を表すnumberというクラス変数を定義します。クラス変数には変数の前に@@をつけます。

```ruby

class Company

  @@number = 0 #クラス変数numberの定義

  #以下省略

```
#クラスメソッドについて
次にクラスメソッドについて解説します。さきほど個々のインスタンスに対して呼び出すメソッドをインスタンスメソッドと呼びました。クラスメソッドとはそのクラスに対して呼び出すメソッドのことを言います。
クラスに関連は深いが、個々のインスタンスに含まれるデータを使わない時にクラスメソッドを定義します。
今回はクラス変数を出力するクラスメソッドを定義します。メソッド名はnumber_showにします。

クラスメソッドの定義の仕方は２種類あります。クラスメソッドをいくつか定義したい場合は後者の定義の仕方の方が便利です。

```ruby

  class company
    def self.number_show #クラスメソッドの前にはselfをつける

    end
  end

　Company.number_show #クラスメソッドの呼び出しは「クラス名.メソッド名」


```

```ruby

 class company
   class << self
     def number_show

     end
  end

　Company.number_show
```


さきほどのコードを使ってクラスメソッドの定義と呼び出しをみてみましょう

```ruby
class Company

  @@number = 0 #クラス変数の定義

  attr_accessor :name, :sex, :age

 def initialize(name,sex,age)
   @name = name
   @sex = sex
   @age = age
   @@number = @@number + 1 #インスタンスが作成されるごとにクラス変数numberの数が増える
  end

  def self.number_show #クラスメソッドの定義
    puts @@number
  end

  def foge
   puts "私は#{@name}です。性別は#{@sex}です。歳は#{@age}です"
  end

end

member1 = Company.new("daichi","男",20) #Companyクラスからインスタンスを作成し、変数member1に代入

member2 = Company.new("jyon","男",22)

Company.number_show #クラスメソッドの呼び出し
#=> 2 (@@numberの数）

```

クラスメソッドを呼び出せましたね！！

#まとめ
今回の記事ではRubyにおける「クラス」の概念のさわりの部分を扱いました。この記事が皆さんの理解を深めることにつながれば嬉しいです。
最後まで読んでくださりありがとうございました。