不確定な世界

科学の話題を中心に、勉強したことや考えたことを残していきたいと思います

「スッキリわかるJava入門 第2版」;中山清喬・国本大悟著 読書感想

本日紹介するのは、中山清喬・国本大悟著、「スッキリわかるJava入門 第2版」。
私は学校ではC言語を習い、仕事では主にPythonを使っている。今までJavaを学ぶ機会はなかったのだが、存在はもちろん知っていたし興味もあったので、軽く入門してみようと元旦から読み始めた。

main関数(正確にはmainメソッド)もクラスの中に書かなくてはいけないことに最初は面食らったが、まあプログラミング言語なんてどれも同じようなもので、for文だのif文だの配列だの、一通り書けるようになるのに時間はそれほどかからなかった。いちいち学習過程を書いたりはしないが、本書を読んで最も良かった点を一つ選ぶとすると、オブジェクト指向(特に多様性)について理解が深まったことだ。

Pythonを学ぶときに一応オブジェクト指向の勉強はした。もちろん多様性もその中に含まれていたが、正直「異なるクラスでも同名のメソッドを定義しておくと同じように使えて便利」というようなイメージしかもっていなかった。本書の表現を使うと、多様性の本質は「ザックリ捉える」ことなのだが、Pythonは元々型の扱いがザックリしているため、この「ザックリ」のメリットが理解しにくいのが原因だったのだろう。
Javaでは型を厳密に扱うため、例えば勇者*1がモンスターに攻撃するときには、attack(Slime s)やattack(Goblin g)のようにモンスターの種類ごとにメソッドを用意する必要がある。ここで、スライムやゴブリンのインスタンススーパークラスであるモンスター型の変数に格納することで、「スライムもゴブリンもザックリ言えばモンスター」とみなすことができ、モンスターに攻撃するメソッドattack(monster m)を1つだけ用意すればよくなる。
さらに、ザックリとモンスターと扱うことで、スライムやゴブリンをリストや配列に一緒に格納して、for文で同一のメソッドを連続して呼ぶようなこともできる。ここで重要なのが、抽象メソッドの仕組みにより、子クラスでのメソッドのオーバーライドを強制できることと、スーパークラス型の変数に格納されていても、実際に呼び出されるのは子クラスのメソッドである点だ。これにより、ザックリとモンスターと扱って同じように命令を出しても、各モンスターはスライムならスライム、ゴブリンならゴブリンのやり方で行動する。これこそが多様性なのだ。
このような説明は、私にとっては目から鱗だった。Pythonでは関数の仮引数に型を指定する必要はないし、リストにはあらゆるオブジェクトが格納できてしまう。だから多様性のメリットや思想に気付かなかったわけだ。この部分だけでも、本書を読んだ甲斐があった。こういう点で、本書はJavaの文法を勉強したい人だけでなく、オブジェクト指向という概念について勉強したい人にもおすすめできる。単なる文法解説ではなく、「現実を模倣する」というオブジェクト指向の思想を前面に押し出して解説しているため、文法部分を読み飛ばしたとしても得るものはあるだろう。

それにしても、自然言語にも言えることだが、異なる言語を学ぶということは異なる文化や思想を学ぶことだ。今回Javaを学ぶことで、Pythonを使っていては気づきにくいオブジェクト指向本来の思想に触れることができた。いつもついだらけてしまう正月休みだが、本書のおかげで今年は有意義に過ごせたと思う。

さて、本書には続編(実践編)がある。さらに踏み込んだ文法はもちろん、開発現場での仕事の仕方のようなことまで学べるようだ。私はJavaに関しては仕事で使うわけではないので今すぐ読む予定はないが、本書を読み終わって、さらに現場で本当に使える知識を身に着けたい方は続けて読んでみるといいだろう。


*1:本書ではサンプルプログラムとしてRPGを題材にしている箇所が多い。