クラスとインスタンス
Rubyにはあらかじめ決まった値が設定されています。
例えば、文字列や配列、ハッシュ等のことですが、独自に値を作ることができ、そのために必要な概念がクラスとインスタンスです。
値は種類ごとに使用できるメソッドが異なっており、文字列に対しては、このメソッド、数値に対してはこのメソッドといった具合にルールが決められています。
このような共通のルールを作成するのに「クラス」を使用します。
この共通したルールを元にして実体(値、データ)を作成していく、つまりはこの実体がインスタンスと呼ばれるものです。
なぜ、クラスが必要なのか
それは、共通の部分を再利用していくことができるからです。
####クラスとインスタンスの生成
class Takoyaki
end
hokuhoku = Takoyaki.new
Takoyakiというクラスを定義し、Takoyakiの実体(インスタンス名:hokuhoku)をnewメソッドで作成しています。
Takoyakiという設計図の中身は何も有りませんが、これに様々なルールを追加してやることで、実体のhokuhokuに味を加えていくことができるのです。
クラスメソッドとインスタンスメソッド
独自に作成した値(データ)にはそれぞれ、動作(メソッド)を定義することができます。
メソッドにはクラスメソッドとインスタンスメソッドの2種類が存在します。
まず、インスタンスメソッドですが、クラスの中に普通のメソッドのように定義してやります。
class Takoyaki
def takoyaki_create
end
end
hokuhoku = Takoyaki.new
hokuhoku.takoyaki_create
これで、Takoyakiクラスの中に、takoyaki_createというインスタンスメソッドが作成できました。
これで、hokuhoku.takoyaki_createと記載することで、インスタンスメソッドを呼び出すことができるようになります。
インスタンス変数
クラス内のインスタンスメソッドに属性値をもたせるために使う変数名で、変数の前に「@」をつける。
class Takoyaki
def takoyaki_create(num)
@num = num
end
end
hokuhoku = Takoyaki.new
hokuhoku.takoyaki_create(5)
インスタンス変数@numは、クラス内のすべてのインスタンスメソッド内で使用することができます。
つまり、インスタンス変数のスコープ(変数が使用できる範囲)はクラス内のすべてのインスタンスメソッド内ということになります。
#クラスメソッド
インスタンスメソッドが個別の情報を元に行う動作(メソッド)で、インスタンス名から呼び出すことができるメソッドであったのに対して、個別の情報によらず(インスタンス名によらず)に、どこからでも呼び出すことができるのがクラスメソッドです。
class Takoyaki
def self.eat
puts"食べると、ほくほくしちゃう"
end
def takoyaki_create(num)
@num = num
end
end
hokuhoku = Takoyaki.new
hokuhoku.takoyaki_create(5)
Takoyaki.eat
これで、クラスメソッドを定義することができます。
クラスメソッドを定義する際は、クラスメソッド名の前にself.
を記載します。
インスタンスメソッドと違って、メソッドの呼び出し方が異なっており、クラス名で呼び出すようになります。
クラスメソッドは、インスタンスを作成する必要がない(newメソッド不要)ので、そのままクラスから呼び出すことができます。
インスタンスを作成と同時にインスタンスが実行されるメソッド(initializeメソッド)
インスタンスをnewメソッドで生成した後に、インスタンスメソッドを呼び出さずに直ちに実行されるようにするメソッドをinitializeメソッドと言います。
class Takoyaki
def initialize(takoyaki_name, takoyaki_price)
@name = takoyaki_name
@price = takoyaki_price
end
def self.eat
puts"食べると、ほくほくしちゃう"
end
def takoyaki_create(num)
@num = num
end
end
hokuhoku = Takoyaki.new("醤油たこ焼き", 400)
hokuhoku.takoyaki_create(5)
Takoyaki.eat
newメソッドでインスタンスを生成したと同時にinitializeメソッドが実行され、実引数("醤油たこ焼き", 400)がinitializeメソッドの仮引数に代入され、インスタンス名、「hokuhoku」に@name(="醤油たこ焼き")と@price(=400)という属性値が生成されました。
まとめ
- クラスとインスタンスは独自の値(データ)を作成するために必要な概念である。
- クラスを設計することで、共通のルールを使い回すことができるメリットがある。
- 動作(メソッド)の種類としてクラスメソッドとインスタンスメソッドがあり、呼び出し方が異なる。
- インスタンスとは、クラスの実体のことで、newメソッドを使用して生成することができ、クラス内のインスタンスメソッドをインスタンス名から呼び出すことができるようになる。
- インスタンスの生成と同時にインスタンスを実行するメソッドをinitializeメソッドといい、インスタンスの生成とともに、属性値を与えることができる。