連載
» 2006年07月21日 00時00分 公開

いまからでも遅くないJava(2):オブジェクト指向、本当に分かってる? (1/2)

[佐藤賢一郎,@IT]

 前回「Javaの世界、イメージできる?」では、Javaの学習をスタートするための助走という意味合いで、Javaの世界とJavaプログラミングの開発手順を紹介しました。今回はプログラミング技法の側面を掘り下げて、Javaプログラミングの中核である「オブジェクト指向」を見ていきましょう。

 Javaの基本的な技術が身に付いたところで必ず乗り越えなければならない「Javaの壁」があるとすれば、それがオブジェクト指向です(本稿では基本的な言語仕様に関する詳細は紹介しませんので、ぜひ十分に独習をしていただきたいと思います)。

 オブジェクト指向は非常に奥が深い概念ですので、一朝一夕に理解できるものではありません。ここでは、Javaプログラミング学習におけるオブジェクト指向の理解を促進することを目標として、ベースになる知識を押さえていきます。

オブジェクト指向とは

前回のプログラムを振り返る

 オブジェクト指向の解説に入る前に、前回実行したプログラムの意味を確認しておきたいと思います。

 簡単にプログラムの構成を解説します。

 2行目の「class User1」を「クラス宣言」といいます。「クラス」はJavaプログラムの1つのまとまりを示す単位で、ここでは「User1(利用者1)というプログラムを定義している」と考えていただければ結構です。

 その処理内容は { から } の間の「ブロック」で記述します。コンパイル時にはこのブロックが1つのクラスファイルになります。

class User1{
User1というプログラムの処理内容 }
 
クラスのブロック
 

 4行目の「public static void main(String[] args)」は「mainメソッドの宣言」です。「メソッド」とはJavaの処理命令の1つのまとまりを示す単位で、特に「main」というメソッドは「処理を開始する」役割を果たします。

 キーワード(publicなど)の詳細は省略しますが、この1文が「処理を開始するためのメソッドだ」と覚えてしまってください。

 mainメソッドが実際に処理する具体的な内容は、クラスと同様に { から } の間のブロックで記述され、実行時にはこのブロック内の処理が順次実行されます。

 mainメソッドのブロックとクラスのブロックの関係を整理すると以下のようになります。

class User1{
public static void main(String[] args){
mainメソッドの処理内容
}}
   
mainメソッドのブロック
 
 
クラスのブロック
 

 User1というプログラム(クラス)の処理内容がmainという処理命令(メソッド)だということが分かります。

 6行目の「Vending drink = new Vending("Coffee", 130);」がmainメソッドの具体的な処理内容です。実行時に処理される部分ですね。

 この行の意味は、「User1(利用者1)がVending(自動販売機)クラスから、新しく商品名"Coffee"・価格130を設定したVendingオブジェクトを作成している」ということになります。

 図で表現してみましょう(図1)。

図1 自動販売機クラスから自動販売機オブジェクトを作成する 図1 自動販売機クラスから自動販売機オブジェクトを作成する

 このプログラムは、前回も説明したとおり自動販売機(Vending)とその利用者(User)をシミュレートしたものです。実行結果として下記のように、「利用者が自動販売機を組み立てた」ことを表現するメッセージがコマンドプロンプトに出力されることを確認しました。

Vending was constructed!
 Goods: Coffee
 Price: 130 yen

 こうしてみると、VendingクラスはまるでVendingオブジェクトを作るための設計図であるかのように見えないでしょうか。実はそのとおりなのです。

 「Vending drink = new Vending("Coffee", 130);」の1行は、オブジェクト指向にのっとってプログラミングされている最も基礎的かつ典型的な部分になります。ですが、ここでいったんプログラムの内容は置きましょう。そもそも「オブジェクト」とは一体何を指し示し、それに対して「クラス」とはどういった位置付けになるのか、プログラミングにこのような手法を採用することでどのような利点があるのかを考えてみましょう。

オブジェクト指向を定義する

 オブジェクト指向というキーワードを定義すると、「これから作成(構築)する対象のもの・事柄をすべてモノ(オブジェクト)としてとらえて表現する考え方」ということになります。

 定義などというと構えてしまいますが、よくよく考えてみるとオブジェクト指向とはごく当たり前の考え方なのです。

オブジェクト指向のイメージづくり

目的はオブジェクトを作成すること

 例えば、「自動販売機」というモノ(オブジェクト)を作ることになったとしましょう。 おそらく、皆さんが始めに考えをめぐらせるのは「どんな商品を売っているのか」「商品の価格はいくらか」「どんな機能を持っているのか」などになると思います。

 実は、こういった分析こそがオブジェクト指向につながる考え方なのです。

オブジェクトの性質を洗い出す

 自動販売機の持つ性質を整理して考えてみましょう(図2)。

図2 自動販売機オブジェクトの性質 図2 自動販売機オブジェクトの性質

 ここではデータ(属性)と機能(操作)に分けて、最も一般的に考えられる性質を書き出してみました。

 オブジェクト指向では、オブジェクトの持っている数値や文字列のようなデータを「属性」と呼びます。自動販売機の持っている属性は、「商品名」や「価格」などの項目になります。

 オブジェクトの持っている機能は「操作」と呼びます。自動販売機の機能といえば、「支払金を受け取る」機能や「おつりを計算する」機能でしょう。

 ほとんどのオブジェクトは、その性質を属性と操作に分けて表現することができます。属性・操作として挙げた項目には以下のような特徴があることにも注目しておいてください。

オブジェクトが出来上がったときに決まっていなければいけない属性値(初期値)がある
  例:商品名、価格

オブジェクトが出来上がった後に決まる属性値がある
  例:支払金額

属性・操作ともに洗い出しの時点では抽象的な言葉で表現してある
  例:具体的にはどんな商品名なのか決まっていない
    具体的にはどんな商品を出すのか決まっていない

オブジェクトのクラスを作成する

 この分析結果は、これからオブジェクトを作る際の指針になる、設計図のようなものであるといえます。

 どんなオブジェクトを作る際にも設計図は必要になります。オブジェクト指向を用いたシステム開発の手順としてもまず必要になるのは設計です。

 クラスとは、オブジェクトの分析によって導き出される、属性と操作に整理された設計図のことなのです。

 ここまでの流れをいったん整理します(図3)。

図3 目的に従って性質を洗い出し、設計図を作成する 図3 目的に従って性質を洗い出し、設計図を作成する

 設計図が作成できれば、今度はその設計図を基に実際のオブジェクト(モノ)を組み立てて利用することができます。

 オブジェクト指向では、クラスからオブジェクトを生成することを「インスタンス化」といいます。

 インスタンス化の際、属性である商品名と価格は「オブジェクトが出来上がったときに決まっていなければいけない属性値」、つまり初期設定が必要な項目なので具体的な値を設定することになります。例えば商品名はコーヒー、価格は130円といった値になります。支払金額は「オブジェクトが出来上がった後に決まる属性値」、つまり自動販売機を使う利用者が設定する項目なので、オブジェクトの作成時には設定しません(図4)。

図4 初期設定が必要な項目と必要でない項目 図4 初期設定が必要な項目と必要でない項目

 利用者は、出来上がった自動販売機オブジェクトの操作を利用することができます。例えば、「支払金を受け取る」機能を利用すれば自動販売機オブジェクトの属性「支払金額」に代金を設定することができます。

 「商品を出す」機能を利用すれば、自動販売機オブジェクトを作成した際に属性である商品名に初期設定した名前の商品が出てくることになるでしょう。「おつりを算出する」機能を利用すれば、自動販売機オブジェクトを作成した際に初期設定された属性である価格と支払金額の差額、つまりおつりを得ることができるはずです。

 このように見ると、自動販売機がオブジェクトになったときに、操作によって属性の値を利用していることが分かると思います。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。