記事内にはプロモーションが含まれています

【Ruby】attr_accessorとは?ゲッター・セッターを省略してコードを短くする方法

【Ruby】attr_accessorとは?ゲッター・セッターを省略してコードを短くする方法 Ruby

Rubyでクラスを定義する際、インスタンス変数(@name など)を外部から読み書きするために、わざわざメソッドを定義していませんか?

Javaなどの言語から入った方は「ゲッター」や「セッター」を手動で書くのが当たり前だと思っているかもしれませんが、Rubyにはそれらをたった1行で自動定義してくれる強力なメソッドが存在します。

それが attr_accessor(アトリビュート・アクセサ) です。

attr_reader とは何が違うの?」
「クラス変数にも使えるの?」

といった疑問を持つ方のために、この記事では attr_accessor の基本的な使い方から、読み取り専用・書き込み専用の使い分け、さらには実務で役立つクラスレベルでの活用テクニックまで、現在のRuby開発のスタンダードに合わせて解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • OS:Windows 11 / macOS Sequoia
  • IDE:Visual Studio / VS Code / IntelliJ IDEA
  • その他:Chrome DevTools / 各言語最新安定版

※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。

attr_accessorを使う最大のメリット

Rubyでは、原則としてインスタンス変数(@で始まる変数)にクラスの外部から直接アクセスすることはできません。

外部から値を参照したり変更したりするためには、そのためのメソッド(アクセサメソッド)を用意する必要があります。

しかし、変数が増えるたびにメソッドを定義するのは非常に手間がかかり、コードも長くなってしまいます。

attr_accessor を使えば、この「メソッド定義の手間」をゼロにすることができます。

手動で定義した場合とattr_accessorを使った場合の比較

まずは、attr_accessor を使わずに書いたコードと、使ったコードを見比べてみましょう。

1. 手動でゲッターとセッターを定義した場合

class User
  def initialize(name)
    @name = name
  end

  # ゲッター(値を読み取るメソッド)
  def name
    @name
  end

  # セッター(値を書き込むメソッド)
  def name=(new_name)
    @name = new_name
  end
end

user = User.new("Tanaka")
puts user.name  # => Tanaka
user.name = "Suzuki"
puts user.name  # => Suzuki

2. attr_accessorを使った場合

class User
  # これだけでゲッターとセッターが自動定義される
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

user = User.new("Tanaka")
puts user.name  # => Tanaka
user.name = "Suzuki"
puts user.name  # => Suzuki

手動で定義した場合は8行ほど必要だったゲッターとセッターの記述が、attr_accessor :name というたった1行に置き換わりました。

:name というシンボルを渡すことで、Rubyが内部的に @name というインスタンス変数に対する読み書きメソッドを自動生成してくれています。

変数が多くなればなるほど、この機能の恩恵は大きくなります。

attr_accessor / reader / writer の違いと使い分け

Rubyには attr_accessor 以外にも、用途に合わせて attr_readerattr_writer というメソッドが用意されています。

セキュリティや設計の観点から、これらを適切に使い分けることが重要です。

3つのアクセサメソッドの違い一覧

メソッド名 生成されるメソッド 役割
attr_accessor 読み取り(name) + 書き込み(name=) 読み書き両方を許可する
attr_reader 読み取り(name) のみ 読み取り専用(Read Only)にする
attr_writer 書き込み(name=) のみ 書き込み専用(Write Only)にする

使い分けのサンプルコード

class Product
  # 名前は読み書き自由
  attr_accessor :name
  # 価格は読み取り専用(初期化後は変更不可にしたい場合など)
  attr_reader :price
  # パスワードは書き込み専用(外部からは見えないようにしたい場合)
  attr_writer :password

  def initialize(name, price)
    @name = name
    @price = price
  end

  def check_password
    # 内部では @password を参照できる
    puts "パスワードは設定されています" if @password
  end
end

item = Product.new("PC", 100000)

# attr_accessor
item.name = "Gaming PC" # OK
puts item.name          # OK

# attr_reader
puts item.price         # OK
# item.price = 500      # エラー! (NoMethodError)

# attr_writer
item.password = "secret" # OK
# puts item.password     # エラー! (NoMethodError)

attr_reader で定義された :price に対して代入を行おうとすると、price= というメソッドが存在しないためエラーになります。

これにより、「勝手に価格を変更されたくない」といった設計意図をコードで表現できます。

基本的には、まずは attr_reader で定義し、必要になった場合のみ attr_accessor に変更するというのが、バグを防ぐための良い習慣です。

クラス変数やクラスレベルでの利用方法

「インスタンス変数(@name)ではなく、クラス変数(@@count)のアクセサは作れないの?」 という疑問を持つ方もいるかもしれません。

残念ながら、attr_accessor はインスタンス変数専用の機能であり、クラス変数に対しては直接使えません。

しかし、「クラスインスタンス変数」に対して使うことで、擬似的にクラスレベルのアクセサを作成することは可能です。

クラスレベルでattr_accessorを使うテクニック

class AppConfig
  # class << self の中で定義することで、クラスメソッドとして機能する
  class << self
    attr_accessor :version, :env
  end
end

# インスタンス化せずにアクセスできる
AppConfig.version = "1.0.0"
AppConfig.env = "production"

puts "Version: #{AppConfig.version}"
puts "Environment: #{AppConfig.env}"

実行結果

Version: 1.0.0
Environment: production

class << self; end という特異クラス定義のブロック内で attr_accessor を使用すると、それはクラスオブジェクト自身(AppConfig)のインスタンス変数(クラスインスタンス変数)に対するアクセサになります。

これにより、アプリケーション全体の設定値などを AppConfig.version のように静的に管理したい場合に役立ちます。

initializeメソッドとの関係と省略

attr_accessor を使うと、初期化メソッド initialize の書き方もシンプルにできる場合があります。

特にRuby 3.2以降では、キーワード引数と組み合わせた省略記法が便利です。

キーワード引数を使ったモダンな初期化

class User
  attr_accessor :name, :age

  # キーワード引数を受け取る
  def initialize(name:, age:)
    @name = name
    @age = age
  end
end

user = User.new(name: "Sato", age: 30)
puts user.age

Railsなどのフレームワークでは、initialize を明示的に書かずに、new した後に attr_accessor で定義されたプロパティに値をセットするパターンもよく見られます。

Rubyのスキルを活かして年収を上げる方法

以上、Rubyのattr_accessorとは何かについてや、使い方などについて解説してきました。

なお、Rubyのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなRubyの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)