【Ruby】Lesson5-05|privateメソッドを理解しよう

一つ前のページではクラス変数とクラスメソッドについて学習しました。
今回は privateメソッド について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:オブジェクト指向編
・Lesson5-1:クラスの基本を理解しよう
・Lesson5-2:イニシャライザを理解しよう
・Lesson5-3:アクセスメソッドを理解しよう
・Lesson5-4:クラス変数とクラスメソッドを理解しよう
・Lesson5-5:privateメソッドを理解しよう ◁今回はココ
・Lesson5-6:正規表現を理解しよう
・Lesson5-7:クラスの継承を理解しよう
・Lesson5-8:オーバーライドを理解しよう
・Lesson5-9:モジュールを使ってみよう
・Lesson5-10:ミックスインを使ってみよう
・Lesson5-11:ファイル操作を理解しよう
・確認問題5-☆1:モンスター捕獲ゲームを作ろう
・確認問題5-☆2:モンスターとの戦闘ゲームを作ろう
・確認問題5-☆3:マルバツゲームを作ろう
privateメソッドによるカプセル化の定義と注意点

Rubyでは、privateメソッド を使用して「クラスの中だけで使えるメソッド」を定義することができます。
これはクラスの外から見せたくない部分を隠すための仕組みであり、そうすることを カプセル化 するといいます。
外部からアクセスできないようにすることで、クラスの内部のしくみを自由に変えても、他の場所に影響が出にくくなります。
コードの手直しや管理がしやすくなり、思わぬエラーも減らせます。
privateメソッドの意味と使用例|カプセル化を理解しよう
privateメソッドを定義するにはクラス内で private キーワード を使用します。
このキーワードの後に記述したメソッドは、クラス外部から呼び出すことができなくなります。
具体例を見てみましょう。
class User
def initialize(name, age) # イニシャライザ
@name = name
@age = age
end
def display_info # 通常のメソッド
puts "Name: #{@name}"
puts "Age: #{masked_age}" # privateメソッドを呼び出して結果を出力
end
private # privateメソッド。ここより下は外部からアクセス不可。
def masked_age # 外部から呼び出せないメソッドの定義
@age.to_s.gsub(/\d/, '*') # 年齢を伏せ字にする例
end
end
user = User.new("Alice", 30) # インスタンス生成
user.display_info
user.masked_age # => エラー: private method `masked_age' called for #<User:...>この例ではmasked_age メソッドが private キーワードよりも後に定義されており、外部から直接呼び出すことはできません。
ただしクラス内からは呼び出すことが可能です。
カプセル化する意味と注意点
コード内にprivateメソッドを入れてカプセル化する意味は、大きく2つあります。
- 内部ロジックの分離
クラスの内部でのみ使う処理はprivateメソッドとして定義し、外部に公開する必要がある処理と分けることで、コードの意図が明確になる。 - 必要最小限の公開
外部に公開するメソッドは最小限にし、それ以外はカプセル化することで、予期せぬエラーの発生を防ぐことができる。
またカプセル化をする際には、以下の点に注意してください。
- 同じクラスの内部でのみ共有可能
同じクラス内でのみアクセス可能で、子クラスからの呼び出しもできない。これはRubyの独特な仕様のひとつ。 - メンテナンス性にも影響する
必要な箇所にだけアクセスを許可することで、コードが複雑になるのを防げる。
ただし過度に使うとメンテナンス性を損なう可能性があるため、適切に活用する必要がある。
まとめ|適切なカプセル化を使いこなそう
privateメソッドはRubyのオブジェクト指向プログラミングで重要な役割を果たします。
クラスの外部からアクセスできないメソッドを定義することで、コードの安全性と保守性を高めることができます。
適切に使用することで、より信頼性の高いプログラムを作成できるようになるでしょう。
練習問題|privateメソッドでアクセス制御の基本を学ぼう

privateメソッドをしっかりと身に着けるため、練習問題に挑戦しましょう。
privateメソッドを使った計算機クラスの作成課題
計算機クラスを作成し、数値の加算・減算を行うプログラムを作成しましょう。
また計算機には「秘密の計算式」を実行する機能を持たせますが、この機能は他のメソッドからのみアクセス可能とし、直接使用できないように設定してください。
以下の要件に従ってコードを完成させてください。
- クラス定義
Calculatorというクラスを作成すること。
- インスタンス変数
- インスタンス変数
@resultを初期化メソッドで0に設定すること。
- インスタンス変数
- 公開メソッド
- 計算結果を表示するメソッド
show_resultを定義すること。 - 計算結果をリセットするメソッド
resetを定義すること。 - 数値を加算する
add(number)メソッドを定義すること。 - 数値を減算する
subtract(number)メソッドを定義すること。
- 計算結果を表示するメソッド
- privateメソッド
secret_formula(number)というメソッドを定義し、計算結果にnumber * 2を加える計算を行うこと。
このメソッドは外部から直接呼び出せないようにすること。
例えば、コード下部で以下のように指示した場合、
calculator.add(5) # 5 を加える calculator.subtract(2) # 2 を引く calculator.show_result # 現在の計算結果を表示
ただし、以下のような実行結果となること。
5 を加えました。 2 を引きました。 現在の計算結果は 3 です。
【ヒント】自力で解くのが難しい人へ
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:クラスCalculatorの定義
□ initializeメソッドを定義し、インスタンス変数@resultを0で初期化
□ show_resultメソッドを定義し、現在の計算結果を表示
□ resetメソッドを定義し、計算結果を0にリセット
□ addメソッドを定義し、指定された数値を計算結果に加算
□ subtractメソッドを定義し、指定された数値を計算結果から減算
□ private指定で以下のメソッドを外部からアクセスできないようにする
□ □ secret_formulaメソッドを定義し、計算結果に指定された数値の2倍を加算2:Calculatorクラスのインスタンスを作成し、calculator変数に代入
3:calculatorインスタンスのaddメソッドを呼び出し、5を加算
4:calculatorインスタンスのsubtractメソッドを呼び出し、2を減算
5:calculatorインスタンスのshow_resultメソッドを呼び出し、現在の計算結果を表示
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
class Calculator # 初期化メソッド: 初期値として計算結果(result)を設定 def initialize @result = 0 # インスタンス変数 result は計算結果を保存する end # 計算結果を取得するためのメソッド(ゲッターメソッド) def show_result puts "現在の計算結果は #{@result} です。" end # 計算結果をリセットするメソッド def reset @result = 0 puts "計算結果をリセットしました。" end # 足し算を行うメソッド def add(number) @result += number puts "#{number} を加えました。" end # 引き算を行うメソッド def subtract(number) @result -= number puts "#{number} を引きました。" end =begin 【穴埋め問題1】 ここに`private`指定と秘密の計算式を実行するメソッド`secret_formula`を定義してください。 `private`の下にメソッドを定義し、このメソッドでは計算結果に引数として渡された数値の2倍を加える処理を記述してください。 =end end # クラスのインスタンスを作成 calculator = Calculator.new # 公開メソッドを使った操作 calculator.add(5) # 5 を加える calculator.subtract(2) # 2 を引く calculator.show_result # 現在の計算結果を表示 # calculator.secret_formula(3) # privateメソッドは外部から呼び出せないためエラーになる
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
この問題の解答例と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
# クラスを定義する class Calculator # 初期化メソッド: 初期値として計算結果(result)を設定 def initialize @result = 0 # インスタンス変数 result は計算結果を保存する end # 計算結果を取得するためのメソッド(ゲッターメソッド) def show_result puts "現在の計算結果は #{@result} です。" end # 計算結果をリセットするメソッド def reset @result = 0 puts "計算結果をリセットしました。" end # 足し算を行うメソッド def add(number) @result += number puts "#{number} を加えました。" end # 引き算を行うメソッド def subtract(number) @result -= number puts "#{number} を引きました。" end private # ここから下はprivateメソッドになります # 内部的な計算ロジック(外部から呼び出せない) def secret_formula(number) @result += number * 2 puts "秘密の計算式を使いました!" end end # クラスのインスタンスを作成 calculator = Calculator.new # 公開メソッドを使った操作 calculator.add(5) # 5 を加える calculator.subtract(2) # 2 を引く calculator.show_result # 現在の計算結果を表示 # calculator.secret_formula(3) # privateメソッドは外部から呼び出せないためエラーになる
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
クラスの定義
class Calculator
class Calculatorは新しいクラスCalculatorを定義しています。初期化メソッド
def initialize @result = 0 endinitializeはオブジェクトが作成されるときに自動的に呼び出される特別なメソッドです。@resultはインスタンス変数で、計算結果を保存します。初期値は0に設定しています。
計算結果の表示とリセット
def show_result puts "現在の計算結果は #{@result} です。" end def reset @result = 0 puts "計算結果をリセットしました。" endshow_resultは計算結果を表示します。putsは文字列を出力するメソッドです。resetは@resultを再び0に戻し、「計算結果をリセットしました」と出力します。
足し算と引き算
def add(number) @result += number puts "#{number} を加えました。" end def subtract(number) @result -= number puts "#{number} を引きました。" endaddは引数numberを計算結果@resultに加えます。subtractは引数numberを計算結果@resultから引きます。
privateメソッドの定義private def secret_formula(number) @result += number * 2 puts "秘密の計算式を使いました!" endprivateはこの下に記述するメソッドをクラス内部からのみ呼び出せるように制限するキーワードです。外部からアクセスできないため、間違って使用されるのを防ぎます。secret_formulaは「秘密の計算式」を表すメソッドで、numberを2倍して@resultに加えます。putsで「秘密の計算式を使いました!」と出力します。
クラスのインスタンス化とメソッドの使用
calculator = Calculator.new calculator.add(5) calculator.subtract(2) calculator.show_result
Calculator.newでCalculatorクラスのインスタンス(オブジェクト)を作成します。このインスタンスをcalculatorという変数に代入します。add、subtract、show_resultメソッドを順に呼び出し、計算機の操作を行っています。
privateメソッドの動作確認# calculator.secret_formula(3)
- コメントアウトされているこの行で
secret_formulaを呼び出そうとしていますが、privateメソッドのためエラーが発生します。 - これにより
privateメソッドが正しく動作していることを確認できます。
まとめ
このコードではRubyのクラスの使い方や、計算機能を持つオブジェクトの設計方法を学びました。
特にprivateメソッドは外部に公開したくないメソッドを隠す仕組みで、セキュリティや設計上の安全性を向上させます。
ぜひこのコードを改造して、自分だけの機能を持つ計算機を作成してみましょう!プログラミングの楽しさを感じながら学んでください。
FAQ|Rubyのprivateメソッドに関する基本と実践の疑問を解消
- Q1. Rubyのprivateメソッドは同じクラス内の他のインスタンスからも呼び出せますか?
-
いいえ、privateメソッドはレシーバを省略した場合のみ同じクラス内で呼び出すことができます。他のインスタンスをレシーバとして明示した呼び出しはエラーになります。
- Q2. Rubyのprotectedとprivateの違いは何ですか?
-
protectedは同じクラスまたはサブクラスのインスタンス間でのアクセスを許可しますが、privateはレシーバを伴う呼び出しを完全に禁止します。より強いカプセル化を実現したい場合はprivateを使います。
- Q3. privateメソッドに引数を渡すことは可能ですか?
-
はい、通常のメソッドと同じように引数を渡すことが可能です。ただし呼び出し時にはレシーバを省略しなければならないため、文法上の注意が必要です。


