構造化からオブジェクトへ! (5/5)
作成:2012-08-19 10:47
更新:2012-08-19 10:47
更新:2012-08-19 10:47
■コンストラクタとインスタンス変数
インスタンスを作成するときには、newというメソッドを呼び出します。が、考えてみれば、さっき作ったHeloクラスには、newなんてメソッドはありませんでしたね? それなのになぜnewっていうのは使えたのか? これは、オブジェクトについてもう少し理解をしないと説明しにくいのですが、「すべてのクラスには、クラスとして利用するための必要最小限の機能が最初から備わっているんだ」と考えて下さい。
さて、このnewでインスタンスを作ることはわかりましたが、このnewは、インスタンスを作成する際、「コンストラクタ」と呼ばれる特別なメソッドを呼び出してインスタンスの初期化処理を行うようになっています。コンストラクタは、以下のように定義します。
では、実際に簡単な初期化処理を用意してみましょう。先ほどのサンプルを修正し、newする際に名前を設定できるようにしてみます。
(この初期値の指定を忘れた場合、引数を付けずにobj = Helo.newなどとやるとエラーが発生します。注意しましょう)
インスタンス変数というのは、インスタンスに値が保管される特別な変数です。普通の変数は、例えばメソッドの中で使用されたものは、そのメソッドの実行を終えてメソッドから抜けると消えてしまいます。が、インスタンス変数は、そのインスタンスが存在している限り、ずっとインスタンス内に値を保管し続けます。
上のサンプルでは、initializeメソッドの中で@name = nameというようにして@nameに値を設定しました。そしてsayメソッドを呼び出すと、ちゃんと@nameの値が出力されました。initializeメソッドを抜けても、@name変数がずっと保管されていることがわかります。
――とりあえず、「クラスとインスタンス」というのがどんなものか、漠然としたイメージぐらいはつかめてきたと思います。が、オブジェクト指向というのは、まだまだ奥深いものです。次回も更にオブジェクト指向について説明を続けていくことにしましょう。
さて、このnewでインスタンスを作ることはわかりましたが、このnewは、インスタンスを作成する際、「コンストラクタ」と呼ばれる特別なメソッドを呼び出してインスタンスの初期化処理を行うようになっています。コンストラクタは、以下のように定義します。
def initializeこれで、newする際に実行される初期化処理が用意できます。もし、このときに何らかの値が必要な場合には引数を設定することも可能です。
……初期化処理……
end
では、実際に簡単な初期化処理を用意してみましょう。先ほどのサンプルを修正し、newする際に名前を設定できるようにしてみます。
class Heloここでは、「def initialize(name="noname")」というようにしてコンストラクタを定義していますね。これにより、名前の値をnewする際に渡せるようになります。よく見ると、initialize(name)ではなく、initialize(name="noname")というように、変数に"noname"という値を代入しているような書き方をしていますが、これは引数の初期値を指定するものです。つまり、メソッドを呼び出したときにこの引数の値が用意されていなかった場合には、初期値の"noname"が代りに使われる、というわけです。
def initialize(name="noname")
@name = name
end
def say
puts("Hello, " + @name + "!!")
end
end
obj = Helo.new("花子")
obj.say
(この初期値の指定を忘れた場合、引数を付けずにobj = Helo.newなどとやるとエラーが発生します。注意しましょう)
●インスタンス変数
このサンプルでは、もう1つ、とても重要なものが登場します。それは、引数の値を保管する変数です。よく見ると、こんな具合に書かれていますね。@name = name普通に「name」という変数名ではなく、頭に@記号がつけられています。これは「インスタンス変数」と呼ばれる、特別な役割を持つ変数なのです。
インスタンス変数というのは、インスタンスに値が保管される特別な変数です。普通の変数は、例えばメソッドの中で使用されたものは、そのメソッドの実行を終えてメソッドから抜けると消えてしまいます。が、インスタンス変数は、そのインスタンスが存在している限り、ずっとインスタンス内に値を保管し続けます。
上のサンプルでは、initializeメソッドの中で@name = nameというようにして@nameに値を設定しました。そしてsayメソッドを呼び出すと、ちゃんと@nameの値が出力されました。initializeメソッドを抜けても、@name変数がずっと保管されていることがわかります。
――とりあえず、「クラスとインスタンス」というのがどんなものか、漠然としたイメージぐらいはつかめてきたと思います。が、オブジェクト指向というのは、まだまだ奥深いものです。次回も更にオブジェクト指向について説明を続けていくことにしましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※サンプルコード class Helo def initialize(name="noname") @name = name end def say puts("Hello, " + @name + "!!") end end obj = Helo.new("花子") obj.say
※関連コンテンツ