my.code();

my.code();

  • Python
    • 1.環境構築と基本思想
    • 2.基本構文とデータ型
    • 3.リスト、タプル、辞書、セット
    • 4.制御構文と関数
    • 5.モジュールとパッケージ
    • 6.オブジェクト指向プログラミング
    • 7.ファイルの入出力とコンテキストマネージャ
    • 8.例外処理
    • 9.ジェネレータとデコレータ
  • Ruby
    • 1.rubyの世界へようこそ
    • 2.基本構文とデータ型
    • 3.制御構造とメソッド定義
    • 4.すべてがオブジェクト
    • 5.コレクション (Array, Hash, Range)
    • 6.ブロックとイテレータ
    • 7.クラスとオブジェクト
    • 8.モジュールとMix-in
    • 9.Proc, Lambda, クロージャ
    • 10.標準ライブラリの活用
    • 11.テスト文化入門
    • 12.メタプログラミング入門
  • C++
    • 1.C++の世界へようこそ
    • 2.型システムとメモリ
    • 3.関数と参照
    • 4.ポインタと動的メモリ
    • 5.クラスの基礎
    • 6.クラスを使いこなす
    • 7.継承とポリモーフィズム
    • 8.テンプレート
    • 9.STL ①:コンテナ
    • 10.STL ②:アルゴリズムとラムダ式
    • 11.RAIIとスマートポインタ
    • 12.プロジェクトの分割とビルド

第7章: クラスとオブジェクト(基本)

Rubyは純粋なオブジェクト指向言語であり、第4章「すべてがオブジェクト」で学んだように、数値や文字列さえもオブジェクトです。この章では、それらのオブジェクトの「設計図」であるクラスを定義する方法について学びます。

他のオブジェクト指向言語(Java, Python, C#など)の経験があれば、概念は馴染み深いはずです。Ruby特有の構文(@やattr_*など)に注目してください。

💴 クラス定義: class, initialize

Rubyでは、classキーワードを使ってクラスを定義します。クラス名は慣習として大文字で始めます(例: MyClass)。

newメソッドが呼ばれたときに実行される特別なメソッドが initialize です。これは他の言語におけるコンストラクタに相当し、インスタンスの初期化処理を行います。

user.rb
ruby user.rb

🏃‍♂️ インスタンス変数 (@var) とインスタンスメソッド

インスタンス変数

@で始まる変数(例: @name)はインスタンス変数です。

  • そのクラスのインスタンス(オブジェクト)ごとに個別に保持されます。
  • initializeや他のインスタンスメソッド内で定義・参照されます。
  • デフォルトで外部から直接アクセスすることはできません(カプセル化)。

インスタンスメソッド

defで定義されたメソッド(initializeを除く)がインスタンスメソッドです。これらはインスタンスの「振る舞い」を定義し、そのインスタンスのインスタンス変数(@var)にアクセスできます。

user_greet.rb
ruby user_greet.rb

🔐 アクセサ: attr\_reader, attr\_writer, attr\_accessor

前述の通り、@nameのようなインスタンス変数は外部から直接参照・変更できません。

access_error.rb
ruby access_error.rb

外部からアクセスさせるためには、アクセサメソッド(ゲッターとセッター)を定義する必要があります。

手動での定義

JavaやC#のように、ゲッターとセッターを明示的に書くこともできます。

manual_accessor.rb
ruby manual_accessor.rb

`attr_*` による自動定義

Rubyでは、上記のような定型的なアクセサメソッドを自動で定義するための便利な「マクロ」が用意されています。これらはクラス定義のトップレベルで使います。

  • attr_reader :var : ゲッター(読み取り専用)を定義します。
  • attr_writer :var : セッター(書き込み専用)を定義します。
  • attr_accessor :var : ゲッターとセッターの両方を定義します。

引数にはインスタンス変数名の@を除いたシンボル(:から始まる名前)を渡します。

auto_accessor.rb
ruby auto_accessor.rb

🏢 クラス変数 (@@var) とクラスメソッド (self.method\_name)

クラス変数 (@@var)

@@で始まる変数(例: @@count)はクラス変数です。

  • インスタンスごとではなく、クラス全体で共有されます。
  • そのクラスのすべてのインスタンスから参照・変更が可能です。
  • (注意)継承した場合、子クラスとも共有されるため、意図しない動作の原因になることもあり、使用には注意が必要です。

クラスメソッド (self.method\_name)

インスタンスではなく、クラス自体から呼び出すメソッドです。def self.メソッド名 のように self. をつけて定義します。

  • User.new の new も、実はクラスメソッドの一種です。
  • インスタンス変数 (@var) にはアクセスできません(インスタンスが存在しないため)。
  • クラス変数 (@@var) にはアクセスできます。
  • ファクトリメソッド(特定のパターンのインスタンスを生成するメソッド)や、クラス全体に関わる操作(例: 総数のカウント)によく使われます。
counter.rb
ruby counter.rb

👪 継承 (\<) と super

Rubyは単一継承をサポートしています。< 記号を使って親クラス(スーパークラス)を指定します。

子クラス(サブクラス)は、親クラスのメソッドや変数を引き継ぎます。

`super`

子クラスで親クラスと同じ名前のメソッドを定義(オーバーライド)した際、superキーワードを使うと、親クラスの同名メソッドを呼び出すことができます。

これは特に initialize メソッドで、親クラスの初期化処理を呼び出すために必須となります。

vehicle.rb
ruby vehicle.rb

super は引数を省略すると、現在のメソッドが受け取った引数をそのまま親メソッドに渡します。super() のように () をつけると、引数なしで親メソッドを呼び出します。

📝 この章のまとめ

  • クラスは class キーワードで定義し、インスタンスは .new で生成します。
    • initialize はインスタンス生成時に呼ばれるコンストラクタです。
    • インスタンス変数は @ で始まり、インスタンスごとに独立し、デフォルトでプライベートです。
    • attr_reader, attr_writer, attr_accessor は、インスタンス変数へのアクセサ(ゲッター/セッター)を自動定義するマクロです。
    • クラス変数は @@ で始まり、クラスと全インスタンスで共有されます。
    • クラスメソッドは def self.メソッド名 で定義し、クラス自体から呼び出します。
    • 継承は < で行い、super で親クラスの同名メソッドを呼び出します。

練習問題1: `Book` クラスの作成

以下の仕様を持つ Book クラスを作成してください。

  1. initialize で title(タイトル)と author(著者)を受け取る。
  2. title と author は、インスタンス変数(@title, @author)に格納する。
  3. title と author は、どちらも外部から読み取り可能(書き換えは不可)にする。
  4. info というインスタンスメソッドを持ち、"タイトル: [title], 著者: [author]" という形式の文字列を返す。
practice7_1.rb
ruby practice7_1.rb

練習問題2: 継承を使った `EBook` クラスの作成

問題1で作成した Book クラスを継承して、以下の仕様を持つ EBook(電子書籍)クラスを作成してください。

  1. initialize で title, author, file_size(ファイルサイズ, 例: "10MB")を受け取る。
  2. title と author の初期化は、Book クラスの initialize を利用する (super を使う)。
  3. file_size は外部から読み取り可能にする。
  4. info メソッドをオーバーライドし、"タイトル: [title], 著者: [author] (ファイルサイズ: [file_size])" という形式の文字列を返す。
    • ヒント: 親クラスの info メソッドの結果を super で利用すると効率的です。
practice7_2.rb
ruby practice7_2.rb