#プログラミング初心者の敵 クラスとインスタンス
プログラミングを学んで一年半経ちますが、今までよくわからずここまで来ていました。
とにかく初心者からしたら全くわからない!w
いろんな本を見ると、車とかロボットとかたい焼きとか使ってますが、ごめんなさいよくわからないです。
ただ、自分がクラスとかインスタンスがよくわからない状態から、どうやって今ちょろっと理解しているのか、自分の頭の中をメモります。
ちなみに自分はRPGが好きなので、その例えでとりあえず腑に落ちています。今回もその例えで書きます。
こういう例えもあるんだなくらいで読んでいただき、ご理解の一助になれば幸いです。
違っているところがありましたら、どんどんください。
すぐに直します!!
#クラスは職業、インスタンスはその職業特有の能力を手に入れた実際の人
みなさんドラクエやFFはやったことありますか?
今は少ないですが、昔はゲーム内で職業というものが用意されていて、自分のパーティーにいる人を好きな職業に就かせるみたいなシステムがありました。
例えば、仲間になった時は戦士だったけど、後でジョブチェンジして魔法使いにしたり、もっと強くなったら竜騎士にしたり。。。
職業が変わると、覚える技や、呪文魔法が変わります。
戦士だった時は回復魔法は使えなかったけど、魔法使いになったらそれが使えるようになったりするんです。
何が言いたいかというと、
戦士という職業は一つしかありませんが、実際に戦士になっている人はゲームの世界にはたくさんいますよね?
例えば、自分のパーティー全て、戦士にした時。
パーティーが4人としたら戦士になっている人は、4人いますが戦士という職業は1つしかありません。
クラスは戦士という職業が持つステータス値、インスタンスはそのステータス値を獲得した人間一人ひとりです。
#じゃあコードで書いてみよう
自分はruby勉強中なので、rubyで書きます。
class Knight
def greeting
puts "hello world"
end
end
これはクラスです。つまり、戦士になるとこういうことができるようになりますっていう一覧です。
この場合はgreetingメソッドを使えるようになる。という感じです。
技の一つだと考えてくれればいいですかね。
では次に、そのステータスを持った実際の戦士を作ります。
Hassan = Knight.new
Yangasu = Knight.new
Arena =Knight.new
このようにすると、戦士(Knightclass)の力を受け継いだ3人の戦士が出来上がります。
つまり彼らは、greetingメソッドという技を使えます。
この実際の戦士(Hassan,Yangasu,Arena)がインスタンスです。
Hassan.greeting #=> "hello world"
Yangasu.greeting #=> "hello world"
Arena.greeting #=> "hello world"
#インスタンス変数とローカル変数
今回勉強していて衝撃だったのは、インスタンス変数はインスタンスを入れるための変数ではないということです。
Railsから入ってしまうと、どうしても@がつく変数はインスタンスを入れなければならないという固定観念を持ってしまいますが、そんなことはありません。
ではインスタンス変数とはなんなのか。これは他のメソッドでも利用できる変数ですよ〜という意味です。
逆に、ローカル変数は特定のオブジェクトやメソッド内のみでしか使えない変数です。
これもまたコードで。
class Witch
def initialize(skill)
@skill = skill #この@skillがインスタンス変数
end
def call
p "#{@skill}の呪文が使えます"
end
end
witch = Witch.new("炎系") #このwitchがローカル変数
witch.call #実行結果 "炎系の呪文が使えます"
上では新しく魔法使いのクラスとインスタンスを作ってみました。
Witchがクラスで、そのインスタンスがwitchですね。
initializeはインスタンスが作成されたタイミング、つまりWitch.newされた時に実行されるメソッドです。
ここで注目いただきたいのは@skillというインスタンス変数とwitchというローカル変数ですね。
Witchのインスタンスが入っているのは、witchであり、@witchではないのです。
つまり、絶対にインスタンス変数に入れなければならないという決まりはありません。
しかし、@skillはインスタンス変数です。別にインスタンスが入っているわけではないですが。。。。
これはintializeメソッドで作成した@skillをcallメソッドでも利用したいからです。
そうしなければ炎系という言葉を表示できません。