back

構造化からオブジェクトへ! (5/5)

■コンストラクタとインスタンス変数

インスタンスを作成するときには、newというメソッドを呼び出します。が、考えてみれば、さっき作ったHeloクラスには、newなんてメソッドはありませんでしたね? それなのになぜnewっていうのは使えたのか? これは、オブジェクトについてもう少し理解をしないと説明しにくいのですが、「すべてのクラスには、クラスとして利用するための必要最小限の機能が最初から備わっているんだ」と考えて下さい。

さて、このnewでインスタンスを作ることはわかりましたが、このnewは、インスタンスを作成する際、「コンストラクタ」と呼ばれる特別なメソッドを呼び出してインスタンスの初期化処理を行うようになっています。コンストラクタは、以下のように定義します。
def initialize
    ……初期化処理……
end
これで、newする際に実行される初期化処理が用意できます。もし、このときに何らかの値が必要な場合には引数を設定することも可能です。

では、実際に簡単な初期化処理を用意してみましょう。先ほどのサンプルを修正し、newする際に名前を設定できるようにしてみます。
class Helo
    def initialize(name="noname")
        @name = name
    end
    def say
        puts("Hello, " + @name + "!!")
    end
end

obj = Helo.new("花子")
obj.say
ここでは、「def initialize(name="noname")」というようにしてコンストラクタを定義していますね。これにより、名前の値をnewする際に渡せるようになります。よく見ると、initialize(name)ではなく、initialize(name="noname")というように、変数に"noname"という値を代入しているような書き方をしていますが、これは引数の初期値を指定するものです。つまり、メソッドを呼び出したときにこの引数の値が用意されていなかった場合には、初期値の"noname"が代りに使われる、というわけです。

(この初期値の指定を忘れた場合、引数を付けずに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




 

記事のリストに戻る



PC Site G+ mail