「スッキリわかるJava入門」という本を読みました。
JavaでAndroidアプリの開発がしたいと思って、Javaの勉強を始めましたが、なんだかよく分からなかったからです。ネットで調べながら勉強していましたが、何かわからないことがあれば、そのつど調べるのはかなり時間がかかる作業でした。他のブログなどのページを読んでも、調べたいことがそのまま書いてあるとは限らないし、書いてあっても分からないことがまた出てきて、無限ループ状態に・・・ これは体系的に、いちから勉強した方が速いと思いこの本を手に取りました。
Java、特にオブジェクト指向のプログラム初心者(自分のことだけど)が難しいと感じるところで、私がスッキリしたことを紹介していきます!
1.メソッド
メソッドの意味
メソッドの意味を調べると、このように載っています。
プログラミング言語上のメソッドは、個人的には「命令」だと思っています。オーダーですね。レストランに行って注文する、オーダーのイメージです。または、「動詞」と捉えると、より理解しやすいときがあります。
本書では、「複数の文をまとめ、それを1つの処理として名前を付けたもので、部品の最小単位」と説明してあります。初心者(私もですが)にはイメージしにくいかもしれませんが、プログラムが大規模化してくると、mainメソッド内に全てのプログラムを書いていくと、あとで修正する時にプログラムを把握しにくくなります。あとでわかりやすいように、メソッドというまとまりに分けておきましょうということです。
レストランのオーダーに例えると
お客さん(main)は、お店のコックさんに「ハンバーグ!」「オムライス!」とオーダー(メソッド)を出します。このとき、お客さん(main)は料理名(メソッド名)を言うだけです。ですが、コックさんはその店のハンバーグやオムライスをちゃんと作ることができます。それは、ハンバーグやオムライスのレシピがちゃんとお店にはあるからです。
このレシピ(料理の作り方)が、メソッドの定義です。もし、オムライスだけ味を変えたいと思ったら、オムライスのレシピだけ変えればいいですね。これがメソッドのいいところです。つまり、プログラムの該当するメソッドの定義だけ探して、変更すればいいので、とても作業がしやすいです。何人かで開発していたら、「そこのメソッド変更しといて!」と連携しやすいですね。
さらにいいのは、お客さん(main)はいつも通り「ハンバーグ!」「オムライス!」とオーダーする(メソッド名を呼ぶ)だけで、いつも通りのハンバーグと、新しくなったオムライスを出してもらうことができるのです。つまりmainは、全く変更する必要がないのです。
この話を本書では、上司と部下で例えていました。とてもわかりやすいですよね!
他にも本書では
- メソッドの定義の仕方
- メソッドの呼び出し方
- メソッドへの引数の渡し方
- 戻り値の受け取り方
2.オーバーロード
オーバーロードの意味
オーバーロードの意味を調べるとこのように載っています。
通常よりも多く何かを載せるという意味ですね。
Javaでは
Javaでのオーバーロードは、1つのメソッドに対して(Javaがわかれば)複数の定義をしてもいいですよ、ということになります。通常は1つのメソッドに対して定義は1つですよね。だから、オーバーロードといいます。
プログラムを書いているときに、ちょっと違うだけのメソッドでもメソッド名を変えなきゃいけないとなると面倒ですよね。「ハンバーグ1」「ハンバーグ2」とか・・・。管理もしにくいです。 だから、Javaが区別できれば同名のメソッドを定義してもいいですよ、となりました。
その区別できる条件が
- 引数の個数が違う
- 引数の型が違う
このような話が、本書では上のような絵を使って説明してあったので、私にもよくわかりました。
3.クラスとインスタンス
本書では、「オブジェクト指向の本質は、現実世界の登場人物とそのふるまいをコンピュータ内部の仮想世界で再現すること」と書いています。この説明が、イメージを掴むためにとてもわかりやすくて、「クラスとインスタンス」でも現実世界を例えにして説明しています。
オブジェクトは、簡単にいうとパーツです。プログラマは、このオブジェクトを活用するために、
- クラスでオブジェクトを定義する。
- オブジェクトを生成する。
ということをします。わざわざ①と②を分けなくても、直接オブジェクトを定義して生成した方がシンプルでいいと思うかもしれません。
現実世界で例えると
現実世界で考えるとどうなるでしょう。受付係をたくさん配置するときに、一人一人に個別に業務内容を説明するでしょうか。おそらく、共通のマニュアルが1つあって、それに沿ってそれぞれが業務に当たると思います。仮想世界も同じです。クラスで1回定義しておけば、同じオブジェクトをたくさん生成できるので便利ですよね。
このように、現実世界を例にしながらプログラムを捉えていくとイメージしやすいです。本書では、このように現実世界を例にしたり、RPGゲームを例にしたりしてとても理解しやすい工夫がなされています。
オブジェクトとインスタンスも例えると
javaのようにオブジェクト指向プログラミング言語では、オブジェクトという言葉がたくさん出てきます。オブジェクトは簡単にいうと、部品なので、単にオブジェクトというとどのオブジェクトなのかわからない場合があります。
そうならないように、オブジェクトをクラスとインスタンスに区別します。(クラスもインスタンスも広い意味では、どちらもオブジェクトです。)
ここが初心者にはわかりにくいところだと思いますが、ここまでの話がわかった方なら簡単です(どっちやねん!)。
さっきの現実世界でいうと、下のようになります。
- 業務が書いてあるマニュアル → クラス
- 実際に業務をする受付係 → インスタンス
仮想世界では?
- 定義を書いたもの(マニュアル) → クラス
- 定義から生成され実際に計算などの処理をするもの(受付係) → インスタンス
簡単ですね! 本書内では上のように概念的な話だけではなく、クラスの定義の仕方など実際のjavaの書き方を具体的に書かれているので初心者でもスラスラ読めると思います。
4.コンストラクタ
コンストラクタの意味
コンストラクタを調べるとこのように載っています。
何かを作る人、ということですね。
Javaでは
では、Javaでは何をつくる人のことをコンストラクタと呼ぶのか。
それは、さっき出てきたインスタンスです。インスタンスを作るのがコンストラクタです。実は、受付係をクラスで定義してインスタンスを生成しても、生成した直後のインスタンスには変数の中身には何も入っていない状態なんです。 (厳密にいうと、例えばint型には0が、String型にはnullが入っています。)
これでは、せっかくインスタンスを生成しても、使い物にならないので、mainで変数を設定することになってしまいます。mainでいちいちインスタンスを定義しなくて良くするためにクラスで定義したのに、これでは意味がありません。そこで、クラスの方で変数などを定義して、ついでにクラス内で変数の初期値も設定してしまおうという考え方です。このインスタンスの初期値を設定するのがコンストラクタです。
現実世界で例えると
現実世界でも「受付係ははじめに挨拶をする」と定義しても、挨拶の言葉が「 」と空っぽでは業務になりませんよね。現実世界の例えを使うとこうなります。
- 受付係の挨拶変数の定義 → クラス
- 定義された受付係が生み出されたもの → インスタンス
- 挨拶変数の中に「いらっしゃいませ」と中身を入れる → コンストラクタ
受付係の挨拶変数を定義するのがクラスで、定義された受付係が生み出されたのがインスタンス、挨拶変数の中に「いらっしゃいませ」と中身を入れるのがコンストラクタということです。
ここまでクラス内で書いておくと、mainではインスタンスを生み出すだけ! mainがスッキリわかりやすくなりますね。何か修正する必要ができたときも、受付係クラス内だけ見ればいいので、修正もしやすいです。
本書では、RPGゲームを例にもっと詳しいところまで書いてあります。(このRPGの例えがわかりやすい!)具体的なプログラムの書き方や、注意することも書いてあるので、実際にプログラムも書けるようになります。
5.継承
継承というと、引き継ぐという意味ですね。言葉の意味だけだとよくわかるんですが、プログラムの話になるとよくわからないという方は結構いるのではないでしょうか。
RPGで例えると
本書では、継承をRPGゲームを例にしてとてもわかりやすく説明しています。下の図を見てください。
勇者キャラクターを定義するHeroクラスがあったとします。この勇者は、攻撃(attackメソッド)したり、逃げ(runメソッド)たりすることができます。新たにスーパー勇者キャラクターをつくることになったとします。スーパー勇者は、勇者ができることは全部できる上で、さらに飛ん(flyメソッド)だり、着地(landメソッド)したりできます。
この場合、スーパー勇者キャラクターを定義するSuperHeroクラスはどのようにつくればいいでしょうか。一番簡単なのは、Heroクラスと共通部分は、コピペして、flyメソッドやlandメソッドだけ書き加えるやり方ですね。でもこれだと、Heroクラスとの共通部分は、HeroクラスにもSuperHerroクラスにも書いてあるので、共通部分を修正する場合作業が2倍になります。さらにクラスが増えたりすると、共通部分を把握するだけでも大変になります。
そこで継承です
クラスを継承すると、追加部分(この場合flyメソッドとlandメソッド)のプログラムを書くだけでOKになります。つまり、継承すると共通部分はJavaが自動的に引き継いでくれるというわけです。追加だけで新しいクラスの完成するなんてステキですね!
本書では、具体的な継承の書き方や、追加だけでなく、上書き変更(オーバーライド)の書き方や禁止事項が書かれています。
6.まとめ
これまで書いてきたように、本書では、現実世界と仮想世界、RPGゲームの具体例などでプログラミングの初心者、特にオブジェクト指向のプログラム初心者にもイメージしやすい工夫がたくさんあります。ホントにスッキリするので、1.~5.のようなことがよくわからない!という人はぜひ読んでみてください。(^^)/
また、読んで思ったのは、javaというプログラム言語は複数で大規模開発していく際の工夫や仕組みがたくさんあるんだあ、ということです。きっと他のプログラム言語もそうなんでしょうけど。 いろんな人の知恵で使いやすい言語になっていくこと、いろんな人が使いやすくするためにはどうすればいいかを考えることの大切さを学んだ気がしました。
続編「スッキリわかるJava入門 実践編」というのもあります。
現在読んでいますので、読み終わったらまたブログに書いてみたいと思います。
最後まで読んでいただきありがとうございました!!
コメント