Rubyでclassを使いこなす
オブジェクト指向の多くで採用される概念に、classというものがあります。
今回は、オブジェクト指向言語のひとつとして分類されるRubyにおけるclassの使い方を、実際のコードと共に解説していきます。
classとは
【オブジェクト指向】と呼ばれるプログラミング言語についての概念があります。
オブジェクト指向とは【プログラムを現実のモノのように構成する】指向のことです。このオブジェクト指向の言語として作られたプログラミング言語には、多くの場合【クラス】という機能が備わっています。
プログラミング言語全般におけるclass
多くのオブジェクト指向プログラミング言語に備わる【クラス(class)】という概念について紹介します。
クラス(class)とは、端的に言えば【モノの設計書】です。先ほど【オブジェクト指向とは、プログラミングを現実のモノのように構成する】ものだと解説しましたが、クラスとはこの【モノのように構造する】際の、【モノ】そのものの【設計書】にあたります。
言葉としては、以下のような意味の対応表になります。
- オブジェクト = モノ
- クラス = モノ(オブジェクト)の設計書
【クラス】は【モノ(オブジェクト)の設計書】であるため、多くのプログラミング言語において【モノ(オブジェクト)】を作成する際に必要なものとして定義されることが多いです。
Rubyにおけるclass
Rubyは【全ての値はオブジェクトである】という性質をもつ言語です。
そのため【あるオブジェクトを作成するためのクラス】もまた、【オブジェクト】として扱うことが出来るという特性を持っています。
例えば、以下のようなコードでクラスをオブジェクトとして扱い、【そのクラスが所持するメソッド一覧】を取得することが出来ます。
Class.methods # クラスが所持するメソッドの一覧(symbol配列形式)
classの作り方
【オブジェクトの設計書】である【クラス(class)】を作成するにはどのようなコードを書けばいいのでしょうか。
まず、必要なのはクラスの定義です。Rubyでは以下のような文法でクラスを定義していきます。
class FooClass # 任意のクラス名をつける
# クラスの中身をここに定義する
end
これでクラスを定義することが出来ます。このとき定義するクラス名は【アルファベットの大文字で始まる】よう記述します。
この【クラス名は先頭大文字で命名する】規則は、多くのオブジェクト指向プログラミングで共通する事項ですので、覚えておくとよいでしょう。
次にクラスの中身を定義する方法です。
クラスの中身には様々な要素がありますが、もっとも基本的な要素として【インスタンス変数】と【インスタンスメソッド】があります。またオブジェクト(クラスのインスタンス)を作成する際の初期化処理として【initialize】が存在します。
インスタンス変数を作成する
インスタンス変数を作成するのは簡単です。むしろ、【プログラマがインスタンス変数を作成する】という手順自体が、Rubyのクラスにおいては必要ありません。
クラス内で作成する初期化処理(initialize)やインスタンスメソッドが、特定の記法で使用したいインスタンス変数名を記述すると、そのインスタンス変数が自動的に作成されるのです。
そのため、使用したいインスタンス変数がある場合は、initializeやインスタンスメソッド内で次の記法により使用するインスタンス変数を指定してください。
@hoo #【インスタンス変数hoo】を意味する
initializeで初期化処理を作成する
オブジェクト(クラスのインスタンス)を作成する際の初期化処理は次のように書きます。
class FooClass
def initialize # 以下初期化処理
@hoo = 9 # インスタンス変数hooを数値【9】で初期化する
end
end
def initialize
からはじめの end
までの一連のひと塊が【初期化処理(initialize)】になります。
上記コードでは【インスタンス変数hooを数値の9で初期化する】という処理をinitializeとして定義しています。
これで、上記FooClassのインスタンスを作成した場合には、FooClassのインスタンス変数hooに9が設定されている状態になります。
インスタンスメソッドを作成する
インスタンスメソッドは以下のように書きます。
class FooClass
def printHoo # 以下printHooメソッド
p “変数hooの値は#{@hoo}です” # メソッドの内容は任意
end
end
書き方としてはinitializeのときとほぼ同様です。defのあとにメソッド名を指定し、以降でメソッドの処理内容を定義する、という流れはinitializeと変わりません。異なるのは名前のみということになります。
上記コードでは変数hooの中身を出力するようメソッドを実装しました。
classのインスタンスを作成する
ここまででクラスのインスタンス変数とインスタンスメソッドを定義しましたが、これらはまだ【クラスを定義した】だけの状態です。実際にクラスを使う際は、クラスのインスタンスを作成し、そのインスタンスを利用することが大半です。インスタンス変数やインスタンスメソッドは、作成したインスタンスから呼び出すことが出来るのです。
その【クラスのインスタンス(オブジェクト)】の作成はどのように行うのでしょうか。
newでclassのインスタンスを作成する
クラスのインスタンスを作成するためには【new】を使う必要があります。
newは多くのオブジェクト指向のプログラミング言語において、クラスのインスタンスを作成するために使われる構文です。rubyにおいては、この【new】という構文は【メソッド】として提供されています。
newメソッドを用いてクラスのインスタンスを作成するには次のようにコードを書きます。
class Foo # クラス定義
def initialize # 初期化処理
@num1 = 10
@num2 = 3
end
def calc # インスタンスメソッド
p “num1とnum2を足すと#{@num1 + @num2}になります”
end
fooObject = Foo.new # Fooクラスのインスタンスを作成
上記コードの最後の一行で行われているのが【クラスのインスタンスの作成】です。Fooクラスのインスタンスをnewメソッドで作成し、変数fooObjectに代入しています。
作成したclassのインスタンスから、インスタンスメソッドを実行する
先ほど作成したfooObjectを用いて解説します。
作成した【fooObjectクラスのインスタンス(オブジェクト)】からクラス内で定義したインスタンスメソッド(calcメソッド)を呼び出すには、次のように書きます。
fooObject.calc
これだけで、作成したオブジェクト(fooObject)からインスタンスメソッドcalcを呼び出すことが出来ます。作成したオブジェクト + ドット + インスタンスメソッド名でインスタンスメソッドを呼び出すことが出来るということです。
まとめ
今回はRubyにおけるクラスの基本を解説しました。
クラスについて習熟すると、Rubyをオブジェクト指向のプログラミング言語としてうまく活用することが出来るようになります。Rubyを扱うエンジニアを目指すのであればクラスについて理解していることは必須事項です。
ぜひ積極的にクラスを利用したプログラムを書き、オブジェクト指向の開発を自分のものにしましょう。
この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。興味のある方はぜひご参加ください。