【Rails】アクセサメソッドについて(attr_reader, attr_writter, attr_accessor)

こんにちは
一週間ぶりの投稿です。
今日はアクセサメソッドについて自分なりにまとめていきたいと思います。色々な記事を見ましたが、こちらの記事がすごく分かりやすかったです。
http://bryankawa.hatenablog.com/entry/2017/01/28/150537


アクセサメソッドとは

Rubyなどのオブジェクト指向プログラミング言語で用意されているメソッド。Rubyを学習しているのでRubyで言いますと、クラス内のインスタンス変数にクラス外からアクセスするために用意されているメソッドのことで、主に下の3つがあります。
・attr_reader
・attr_writter
・attr_accessor
オブジェクト指向においてインスタンス内の変数は内部の状態を表すもので、外から直に参照すべきではないという考え方に基づきます。

アクセサメソッドはなぜ必要か

アクセサメソッドの必要性を例を用いて説明していきます。
例①

class Gear

end

gear = Gear.new
puts gear.cog     # => undefined method 'cog'

例①ではcogメソッドを実行しようとしていますが、クラス内にcogメソッドを定義していないので、当然 No Method Errorとなります。


例②

class Gear
  def cog
    @cog
  end
end

gear = Gear.new
gear.cog     # => nil
gear.cog = "10"     # => undefined method "cog="

例②では無事cogメソッドを実行することができました。が@cogの値を書き込むことはできていません。


例③

class Gear
  def cog
    @cog
  end
  
  def cog=(str)
    @cog = str
  end

end

gear = Gear.new
gear.cog = "10" 
puts gear.cog     # => 10

例③ではクラス外部からインスタンス変数に書き込み及び読み込みができています。
毎回こんなに書くのがめんどくさいので、下のように省略して書くことができます。

class Gear
  attr_reader :cog  # ゲッターと呼ばれる
  attr_writter :cog  # セッターと呼ばれる
end

gear = Gear.new
gear.cog = "10" 
puts gear.cog     # => 10

また、さらに下記のように省略することもできます。

class Gear
  attr_accessor :cog
end

gear = Gear.new
gear.cog = "10"
puts gear.cog     # => 10

アクセサメソッドの必要性について何となくでも分かっていただけたでしょうか。クラス外部からインスタンス変数の読み書きをしたい場合に必要だということですね。

今回は以上になります。
非常に基礎的なところではありますが、すごく勉強になりました。
ここまで読んでくださり、ありがとうございました。分かりにくいやアドバイス等ありましたらコメントくださると幸いです。では!