Javaをある程度勉強した方なら、おそらくもう見たであろう「オブジェクト指向」。
しかし、入門書を見てもよくわからない、という方も多いのではないでしょうか。それもそのはず、「オブジェクト指向」はプログラミング初心者から中級者への昇格試験のようなものなのです。
それゆえ、とても難しいです。この記事では、オブジェクト指向プログラミングの解説をしていきます。
オブジェクト指向とは?
まずオブジェクト指向とは何なのかを改めて見ていきましょう。
オブジェクト指向とは何なのか、単刀直入に言えば「プログラムを分割するプログラミング」。これだけです。これだけだと語弊があるのですが、例えていうと、「『金属棒から一個一個ネジを作る』より『型を作って溶けた金属を流し込んで作る』方が早い」のような感じです。
オブジェクト指向は、教える人や入門本によっては複雑に説明されていて、こんがらがって分からなくなる人が多いのです。ですから、例のように簡単なものだと思ってくれていれば問題ないです。
オブジェクト指向はなぜ挫折しやすいのか?
オブジェクト指向で挫折する人が多いのは、前述のように複雑な説明でこんがらがって分からなくなる、というのも原因です。しかし、最も多い原因は「今までやってきたやり方でオブジェクト指向をしようとする」ことです。
オブジェクト指向でないプログラミングというのは、いわば「積み木」です。
- 「四角の積み木と三角の積み木を組み合わせて家を作る」
- 「Aという命令とBという命令を組み合わせてCをさせる」
とても似ていますよね。積み木の概念は幼児でも理解できる訳ですから、こういう組み合わせるだけのプログラミングは人間が無意識に行う考え方で行っているのです。
この考え方を数学で例えれば、計算問題にあたります。
「Aという規則とBという公式を使ってCという計算をする」
確かに「積み木」ですね。
ではオブジェクト指向はどうかというと、これは全く異なります。最終的には「積み木」をすることになりますが、途中で行うことは積み木とは全く異なります。この「積み木でない部分」を積み木の考え方でやってしまうから訳がわからなくなる。これがオブジェクト指向で挫折する最大の原因でしょう。
オブジェクト指向は単純な組み合わせに加え、「捉え方」を学ぶ必要があります。そしてプログラム全体を見て、必要な命令や操作を選択する必要があります。
この考え方を数学で例えると、文章問題にあたります。
「文章の内容を捉えて、使うべき考え方や公式を選択する」
上記で説明した、オブジェクト指向の考え方と一致しますね。
今文章問題と聞いてビクッとしたあなた。オブジェクト指向は数学の文章題ほど難しくありません。そして、私がしっかり解説いたしますのでご安心ください。
オブジェクト指向はそれぞれの機能単体だと何に使うかよくわからないものが多い上に、それぞれの機能が複雑に絡み合っているので、一回で理解することは困難です。ですから、この記事を見てオブジェクト指向の勉強を本格的にしてみよう、という方は、入門書のオブジェクト指向についての解説の全体を浅く、何度も学習することをおすすめします。繰り返すたびに、前わからなかったことがわかるようになっていくはずです。
具体的な攻略法
1.まずは教えられた通りにプログラミングしてみる
ではそろそろ解説に入っていきましょう。
攻略法その1。
まずは、教えられた通りにプログラミングしてみることです。頭で理解するよりも、やってみたほうが早いです。
プログラミングして、実行して、説明通りになっていることを確認してからどれがどういう動作をしているのかを順を追って見ていくのが良いでしょう。
ただし、ここでは100を理解しようとしないでください。
「この文がこんな感じの命令をして、この変数に代入してるからこうなってるっぽい?」程度で十分です。これができたら次に進みましょう。
2.金型で考えてみる
ここからは少し専門的な話になります。
Javaのオブジェクト指向では、オブジェクトに「属性」と「動作」を定義する必要があります。ここでいう「属性」とは、オブジェクトが持つ「性質」のことです。例えると、あるファイル(オブジェクト)の名前やサイズ、拡張子が「属性」に当たります。
そして、定義したオブジェクトをプログラムの中で動作させるという手順になります。
Javaではオブジェクトに属性や動作を定義したものを「クラス」と言います。そしてクラスをもとに生み出したオブジェクトのことを「インスタンス」と言います。
この聴き慣れない単語と唐突な概念解説で困惑する人が非常に多いので、わかりやすく、ネジの金型で考えましょう。
ここではクラスが金型にあたります。クラスにインスタンスの属性や動作を定義するのは金型はネジを作れるようにかたどる、と例えられるでしょう。
そして、クラスから作り出されたインスタンスは、金型から作られたネジと言えますね。
オブジェクト指向の基本的な考え方はこのように考えておけば問題ありません。今後、さらに複雑な機能や命令がいろいろ出てくると思いますが、結局はこの考え方に収束します。
何事も大事なのは基礎です。この考え方を忘れないようにしましょう。
3.関数のように考えてみる
考え方で言えばこちらの方が正しいので数式に抵抗がなければ覚えておくと良いでしょう。
関数といえばf(x)ですが、例えばこんな式があったとしましょう。
f(x, y, z) = 10x + 6y + 3z
f(x, y, z)というのは、それが関数であると示すためだけのものですから、これは空のクラスと言えるでしょう。空のクラスは、それがインスタンスの属性などを定義するものであるという意味でしかありません。
そして、10x + 6y + 3z の部分はその関数がどのような式であるかが書かれてあるのですから、クラスに定義されたインスタンスの属性や動作になりますね。
では、最後に適当な数字をx、y、zに代入してみると、当然ながら解が出てきますね。無論これはクラスから作り出されたインスタンスにあたります。
それぞれの変数は、クラスに定義されたそれぞれの属性や動作、代入した値は引数と考えることができますね。
「オブジェクト」という概念
ここまで勉強して不思議に思ったことがあるのではないでしょうか。
オブジェクト指向、なんて名前なのに実際に考える時にはオブジェクトなんて言葉はほとんど出てきませんよね。いったいなぜかというと、実は「オブジェクト」という言葉は非常にあいまいなものだからです。
基本的には、クラスに定義された属性などをもとに作り出されたもののことをオブジェクトと言います。
ところが、しばしばクラスのことをオブジェクトと言うこともあるのです。
事実、オブジェクトに属性などを定義しているのはクラスですから、クラス自体がオブジェクトと言っても違和感はあまりありません。
しかし、この曖昧さが混乱を生みます。解説書や講師によってオブジェクトの捉え方が異なり、特にオブジェクト指向初心者の人にとっては、その「オブジェクト」が果たしてクラスのことなのか、はたまたクラスから作り出した物なのかわかりません。
そこで出てきたのが、この記事で統一していた「インスタンス」という言い方です。
クラスから作り出された物のことをインスタンスと呼び、クラスのことはそのままクラスと呼ぶ。こうすれば、「オブジェクト」と言う言葉に惑わされることはありません。
私が執筆する記事では混乱を避けるためこの書き方で統一します。
まとめ
オブジェクト指向は非常に難しく、挫折もしやすいです。しかし、考え方を変えれば比較的易しく理解することができます。オブジェクト指向は一度習得すればプログラマーとしての格が段違いに上がりますので、絶対に習得しましょう。
java