他の言語にあるセッターやゲッターというものはRubyには存在しない
あれはただの値を返すメソッドで、attr* はメソッド定義を肩代わりする略記に過ぎない

module AttrReader
 def attr_reader(arr)
  arr.each do |method_name|
   eval("def #{method_name}
        return @#{method_name}
       end")
  end
 end
end

class C
 include AttrReader
 attr_reader([:x])
end

と

class C
 attr_reader :x
end

はリクツ上おおむね同じ動作をする
attr* を使う動作上のメリットというのは何もない
メソッド定義書くのがちょっと短縮されるというだけだったりする