09 クラスを理解する(前編)

【第9回】クラスを理解する(前編)

今回は、Java学習の中でも特に重要な「クラス」について、その概要を説明します。

前提:前回までの内容を一通り読み、変数、型などの言葉が大体理解できること

「クラス」は、オブジェクト指向プログラミングの要となる要素の一つです。「クラス」を理解することが、Javaでオブジェクト指向プログラミングをする第一歩を踏み出すことになります。

今回の目的は、「クラス」の概要と、Javaで「クラス」を定義する方法をおおまかに理解することです。「ふ~ん、クラスってそういうものなんだ」と思えれば、OKです。

今まで学んできた知識は、全て「クラス」を用いたプログラムに活かすことができるはずです。これまでの理解を整理しつつ、新しい世界に飛び込んで行きましょう!

1.オブジェクトとは?

いきなりですが、「オブジェクト指向」という言葉が出てきていますね。
ここでいう「オブジェクト指向」、そして「オブジェクト」とは一体何のことなのでしょうか?
それを理解するには、まずプログラミングの「視点」を考えてみると良いでしょう。

これまでは、一つ一つの変数やメソッドを細かく見ていきました。プログラミングとはこれらを組み立てて、目的(計算や、文書作成など)を達成するソフトウェアを作る事です。
でも、一つ一つの変数やメソッドから、ソフトウェアに至るまでの道のりを考えると、いきなり話が飛びすぎていて、何から手をつけてよいのか迷うかもしれませんね。

例えば、一言にPCを作ると言っても、画面を開く処理、文字に色をつける処理、出来上がった文書を保存したり印刷する処理などがありますよね。そういった一つ一つの処理も小さなプログラムの集まりです。これらを組み立てて、はじめてPCとしての目的を達成できるようになるのです。

かなり大雑把に説明しましたが、このようにソフトウェアの中身を少しずつ細かいまとまりにしていくためには「視点」が必要です。
数年前までは、一つ一つの処理に注目してプログラムをまとめていく考え方(これを構造化プログラミングと言います)が主流でした。 構造化プログラミングでは処理の流れを「関数」または「プロシージャ」といったまとまりにしていきます。こうする
ことで、同じ処理は一つの関数を呼び出して何度も実行できるようになり簡潔な記述が可能になります。

しかし、大規模なソフトウェアに適用していくと、データ構造の複雑化とともにプログラムのメンテナンスも難しくなっていきます。その結果、もう一歩大きな視点で考える必要が出てきました。

そこで、オブジェクト指向が登場します。オブジェクト指向とは、ソフトウェアを「オブジェクト」という視点で考え、オブジェクト同士のやり取りをプログラムで表現して組み立てていく「視点」なのです。

もう少し掘り下げてみましょう。
オブジェクトとは、英語で簡単に言うと「もの」という意味になりますよね。オブジェクト指向プログラミングの世界でも、オブジェクトは同じように「もの」として考えます。

オブジェクトは具体的なものを考えます。例えば、コンピュータと一言で言っても、私がこの文章を書いているコンピュータと、今、みなさんがこの文章を見ているコンピュータは、違うものです。それぞれに、個体を識別する為の何らかの情報(例えば、ケースの色や形など)を持っています。

同じ「コンピュータ」でも、違う「もの」

オブジェクト指向の世界でプログラミングとは、このコンピュータをあなたや私が操作したり、コンピュータ同士がデータをやり取りする事に喩えることができます。つまり、プログラムがオブジェクトを操作したり、オブジェクト同士が通信することを考えるのが、オブジェクト指向の「視点」なのです。

~ ここまでのまとめ ~

・オブジェクト指向は、ソフトウェアをオブジェクトを中心に考える「視点」である。
・オブジェクトは、ソフトウェアの中の「もの」と考えられる。

2.クラスとは?

それでは、オブジェクトは実際にプログラムの中でどのように表現し、動かしていくのでしょうか。
ここで、いよいよ今回の目的である「クラス」について触れていくことになります。

「クラス」は、「オブジェクト」の情報を一般化した「定義」です。

ここでも、先ほどのコンピュータを例に挙げて考えてみます。先ほど、私のコンピュータとあなたのコンピュータは違う、と書きました。でも、コンピュータは、色や形が違っても「コンピュータ」ですよね。
なので、「コンピュータ」という一般化したものを「クラス」として定義しましょう。例えば、黒いコンピュータ、白いコンピュータという個別の情報から、「コンピュータには色という要素がある」という定義にする、といった具合です。

その上で、「コンピュータ」クラスを「私のコンピュータ」オブジェクトに具体化して、「黒」という色や「タワー型」という形を与えて使うことにするのです。

コンピュータクラスに形を与えます。

これが、「クラス」と「オブジェクト」の関係です。
なお、Javaの世界では具体化したオブジェクトを「インスタンス」と呼びます。
しばしば「オブジェクト」は「インスタンス」と同義に扱われることがあります。以降のJava講座では、「インスタンス」と書いていきます。「私のコンピュータ」は、Javaの世界では「インスタンス」になります。

~ ちょっと一息 ~

実は、Javaではプログラムを全て「クラス」で表現します。これまでの講座で書いてきたプログラムも、例外なく「クラス」です。
また、前回説明したAPIリファレンスを見てみると、Javaの標準のAPIも「クラス」で提供されていることが分かります。(printlnメソッドが定義されているSystemを見てみると、「クラス
System」となっていますよね)

「クラス」には性質を定義しますが、性質は主に2種類あります。それが、「フィールド」と「メソッド」です。
「フィールド」は、「クラス」自身の情報(=属性)を表すものです。「メソッド」は、「クラス」の動作を表すもので、「インスタンス」を操作する方法を提供するものです。

コンピュータの例では、色や形といった属性が「フィールド」であり、「電源を入れる」「インターネットに接続する」といった操作を「メソッド」として定義します。

~ ここまでのまとめ ~
・「クラス」は、オブジェクトの情報を一般化した「定義」である。
・「クラス」を具体化したもの(=オブジェクト)を「インスタンス」と呼ぶ。
・「クラス」に定義する性質には「フィールド」と「メソッド」がある。
・「フィールド」は「クラス」自身の属性である。
・「メソッド」は「インスタンス」を操作する方法を提供する。

それでは、実際の「クラス」を見ながら、それぞれについて詳しく見ていくことにしましょう。
→ 次へ(第9回後編:クラスを理解する(後編))