1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby:クラスメソッドとインスタンスメソッド、クラス変数とインスタンス変数の違い

Last updated at Posted at 2021-01-05

※2022年から技術系の記事は個人ブログに投稿しております。ぜひこちらもご覧ください→yamaday0u Blog

クラスメソッドとインスタンスメソッドの違い

まずRubyのクラスメソッドとインスタンスメソッドの違いを見ていきます。

クラスメソッドとは

クラスメソッドを定義したクラス自身が使用できます。クラスで共通の情報を使った処理に使用します。インスタンスがなくても呼び出すことができます。

クラスメソッドを定義する際は、self.メソッド名と記述します。以下のようにクラス名Fruitsから呼ぶことができます。また、インスタンスを生成するnewメソッドは、代表的なクラスメソッドです。

fruits.ruby
calss Fruits
  def self.call #selfはクラス自身を指す
    puts "クラスメソッドを呼び出しました"
  end
end

Fruits.new #newメソッドもクラスメソッドの1つ。
Fruits.call

ターミナルで上記のrubyファイルを実行すると次のような結果になります。

ターミナル
ruby fruits.rb

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

Fruits.callの実行結果が表示されます。
Fruits.newは空のインスタンスが生成されるだけなので実行結果には表示されません。

###インスタンスメソッドとは
インスタンスが使用できるメソッドで、クラス内に定義します。
「インスタンスメソッドを定義したクラス」から生成されるインスタンスが使用できます。

fruits.ruby
calss Fruits
  def call
     puts "インスタンスメソッドを呼び出しました"
  end
end

fruits = Fruits.new
fruits.call
#.でつなげて下記のように呼び出すこともできます。
Fruits.new.call
ターミナル
ruby fruits.rb

インスタンスメソッドを呼び出しました

initializeメソッド

initializeメソッドは、newメソッドによってインスタンスを生成したと同時に実行される処理を定義できるインスタンスメソッドです。
実は、クラスに記述しなくてもinitializeメソッドは自動で実行されており、この場合は何も処理がされません。

fruits.rb
class Fruits
  def initialize
    puts "インスタンスが生成されました"
  end
end

Fruits.new

ターミナルで上記のrubyファイルを実行すると次のような結果になります。

ターミナル
ruby fruits.rb

インスタンスが生成されました

Fruits.newでインスタンスを生成した後にinitializeメソッドに定義した処理が実行されたことがわかります。

クラス変数とインスタンス変数の違い

次にクラス変数とインスタンス変数の違いを見ていきます。

クラス変数とは

そのクラス内で定義される変数で、@@変数名と記述して定義します。クラス変数は、クラスとして共通の変数を定義したいときに使うのに適しています。

fruits.rb
class Fruits

  @@fruit = "オレンジ" #initializeメソッド内で使用するために、インスタンス生成前に定義

  def initialize
    puts "私は#{@@fruit}が好きです"
  end

end

Fruits.new

実行結果

ターミナル
ruby fruits.rb

私はオレンジが好きです

クラスメソッドの特徴として、一度定義すればクラス内のどこでも使用することができます。

fruits.rb
class Fruits

  @@price = 0 

  def initialize(fruit, price)
    @fruit = fruit
    @@price += price
  end

  def self.sum
    puts "合計金額は#{@@price}円です" 
  end

end

Fruits.new("オレンジ", 200)
Fruits.new("リンゴ", 300)
Fruits.new("ぶどう", 500)

Fruits.sum
ターミナル
ruby fruits.rb

合計金額は1000円です

オレンジ、リンゴ、ぶどうのインスタンスを生成するたびにクラス変数@@price に各フルーツの価格が合算され、sum メソッドで合計金額を出力しました。

インスタンス変数とは

個別のインスタンスに定義できる変数で、@変数名と記述して定義します。インスタンス変数は定義したインスタンスメソッドとは別のインスタンスメソッドの中でも使用することができます。

fruits.rb
class Fruits

  def initialize(fruit)
    @fruit = fruit
    puts "私は#{@fruit}が好きです"
  end

  def dislike
    puts "私は#{@fruit}が苦手です"
  end
end

Fruits.new("オレンジ")
Fruits.new("リンゴ")
fruit = Fruits.new("ぶどう")
fruit.dislike
ターミナル
ruby fruits.rb

私はオレンジが好きです
私はリンゴが好きです
私はぶどうが好きです
私はぶどうが苦手です

initializeメソッドで、生成したインスタンスごとにインスタンス変数@fruitの値が代入され、putsで出力しています。

また、initializeメソッド で定義したインスタンス変数@fruitdislikeメソッドでも使用できているのが確認できます。

#参考資料
Rubyのクラス変数の使い方を現役エンジニアが解説【初心者向け】(TechAcademyマガジン)

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?