プログラマーの常識をJavaで身につける
連載一覧へ
プログラマーの常識をJavaで身につける (11)

いまさら聞けないJavaによるオブジェクト指向の常識


株式会社 NTTデータ ビジネスブレインズ
伊賀敏樹
山本耕司
2008/5/8


本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます(編集部注:Java言語の基礎を学びたい読者は、連載「Eclipseではじめるプログラミング」や連載「いまから始めるJava」をご参照ください)。

いまこそ振り返る「オブジェクト指向」

今回の主な内容

いまこそ振り返る「オブジェクト指向」
Java言語で、オブジェクト指向を見てみよう
JavaにおけるClassとObject
コラム 「オブジェクトとインスタンスは違うものなの?」
「汎化・特化」、Javaでは多くの場合「継承」
「メッセージ・パッシング」、Javaではメソッド呼び出し
コラム 「同じ言葉でも意味が違う“インターフェイス”」
「カプセル化」、Javaではアクセス修飾子などで実現
「多態性」、同一のメッセージで異なる振る舞い
Java APIの「裏技」java.lang.reflectパッケージとは?
もっとオブジェクト指向を習得するためには?

 今回は、オブジェクト指向プログラミングの常識について、Java言語を通じて学んでいきます。

 この連載「プログラマーの常識をJavaで身につける」では、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象としています。そのため、本稿をご覧になっているJava言語やその文法を学ばれた皆さんは、「オブジェクト指向」についても、一通り学ばれてきたことと思います。

 とはいえ、オブジェクト指向はなかなか習得しにくいものです。抽象的で、とても難しいものですからね。この記事を通して「オブジェクト指向とは、何なのか?」をいま一度振り返って見直してみましょう。

そもそも、オブジェクト指向って、いったい何?

 私たちがJava言語やその関連技術に接していると「オブジェクト指向」という用語や、「オブジェクト指向」を含む用語をよく耳にします。でも、そもそも、オブジェクト指向とは何なのでしょう?

 オブジェクト指向は、いくつかの基本概念から成り立っています。多くの書籍では、オブジェクト指向の基本概念は、以下のような用語によって説明されています(※用語については、後ほど説明します。下記リストはインデックスになっています)

 どれも、とても抽象的で、あまり耳にしない用語も多いかもしれませんね。皆さん、おのおのを説明できますか? できない方も多いことと思います。でも、いまは分からなくてもまったく問題ありません。実のところ、比較的熟練したJavaプログラマーでも、ここで挙げた基本概念について、あまり精通していない方もいらっしゃることと思います。

さまざまなところで使われている「オブジェクト指向」

 前述のように、オブジェクト指向の基本概念はとても抽象的であり、また、応用範囲も広いものです。実際、「オブジェクト指向分析・設計」「オブジェクト指向プログラミング」「オブジェクト指向プログラミング言語」など「オブジェクト指向」を含む用語がいろいろありますね。それぞれの用語について、ここで簡単に整理しておきましょう。

  • オブジェクト指向分析・設計
    オブジェクト指向の考え方を取り入れた分析・設計手法や開発方法論
  • オブジェクト指向プログラミング
    オブジェクト指向の考え方を取り入れたプログラミング手法。オブジェクト指向プログラミングでは、多くの場合オブジェクト指向プログラミング言語が使われるが、非オブジェクト指向プログラミング言語でオブジェクト指向プログラミングを行う場合もある
  • オブジェクト指向プログラミング言語
    オブジェクト指向の考え方を、言語仕様に反映している言語。Java言語も、もちろんオブジェクト指向プログラミング言語の1つ

 世間一般では、「オブジェクト指向分析・設計」「オブジェクト指向プログラミング」「オブジェクト指向プログラミング言語」のそれぞれを、省略して単に「オブジェクト指向」と呼んでいる場合があります。「オブジェクト指向」と書いてある際に、それらのどれを指しているのか、あるいは「オブジェクト指向」全般を指しているのか、注意する必要があります。

オブジェクト指向に関連する技術

 「オブジェクト指向」という名称が付いていないオブジェクト指向関連技術も、これまたいろいろあります。主なものを以下に挙げます。

  • UML(統一モデリング言語)
    オブジェクト指向のモデルをグラフィカルに表現するための表記法。OMGという団体により標準化されている
  • デザインパターン
    設計上、よく使われるパターンをカタログ化したもの(最初はなんのことだか分からないと思いますが、APIやクラスライブラリ、そして各種フレームワーク類を利用しているうちに、だんだん分かるようになってくると思います)
  • リファクタリング
    ソフトウェアの外部的振る舞いを保ったまま、内部の構造を改善していく作業
編集部注:デザインパターンの具体例について詳しく知りたい読者は、Java Tipsの「クラスのインスタンスを1つに保つ(Singletonパターン)」「再帰的なデータ構造を表現する(デザインパターン活用)」「Adapterパターンを使い利用コンポーネントを切り替える」をご参照ください。

「オブジェクト指向」の神話


「オブジェクト指向」は世の中のすべての問題を解決……
   しません!

 このように、さまざまなジャンルに応用されているオブジェクト指向ですが、実際のところ問題解決のための1つの方法論にすぎません。私たちが扱うコンピュータ・プログラミングの世界において、「どんな課題もオブジェクト指向が解決する」なんてことはありません。むしろ、「オブジェクト指向で進めることによってデメリットの方が大きくなってしまう」なんていう場合もあります。

 オブジェクト指向に限らず、方法論にはメリットとともに必ずといってよいほどデメリットがセットで付いてきます。方法論を使いこなすためには、バランス感が最も重要という場合も多いものなのです。

オブジェクト指向分析・設計をしないと、オブジェクト指向プログラミング言語で開発できない……なんてことはありません

 良くも悪くも、オブジェクト指向分析・設計によるシステム分析・設計とオブジェクト指向プログラミング言語によるシステム開発とは、まったく分離されたものです。おのおのオブジェクト指向という手法が利用されていますが、密に連結したものではありません。

 オブジェクト指向分析・設計は採用せずに、オブジェクト指向プログラミング言語を用いたシステム開発を行うことは、珍しくありません。これは、対象となるシステムにもよるものなのですが、例えば業務システムのようなジャンルでは、オブジェクト指向分析・設計は採用しない方が現時点では多数派です。不思議なことのように聞こえますが、これもプログラマーの常識です。

 関係者の多くがオブジェクト指向に不慣れな状態で、オブジェクト指向分析・設計をシステム開発に導入すると、単なる手段であるべきオブジェクト指向が、いつの間にか目的にすり替わってしまう、という恐ろしい状況に陥ってしまう可能性があります。

Java言語で、オブジェクト指向を見てみよう

 それでは、Java言語を通してオブジェクト指向の基本概念を学んでいきましょう。

 「オブジェクト指向」そのものはとても抽象的なものですが、Java言語に当てはめて具体化することにより、Javaによるプログラミング経験のある皆さんには理解しやすくなることと思います。

JavaにおけるClassとObject

 Java言語をご存じの皆さんにとって、クラスオブジェクトは、すでになじみが深いことと思います。ここからは、ラーメン屋を例に話を進めていきましょう。

とりあえず、ラーメンをクラスで表すと……

 早速、ラーメンを表すラーメン・クラスを考えてみましょう。

図1 ラーメンの調理方法
図1 ラーメンの調理方法(こちらの図はJavaプログラミング[アプリケーション編]ステップアップラーニング』(技術評論社)で使われた図を引用して再作成したものです)

 Java言語でラーメン・クラスを表すと、例えば以下のようになります。

Ramen.java
/**
* ラーメン・クラス
*/

public class Ramen {
    /**
    * ラーメンのスープ
    */

    private String fSoup = null;

    /**
    * ラーメン・クラスのコンストラクタ
    */

    public Ramen() {
        // スープに「とんこつ」をセット
        fSoup = "とんこつ";
    }
    /**
    * ラーメンを表示
    */

    public void showRamen() {
        System.out.println("ラーメンを表示");
        System.out.println(" スープ : " + getSoup());
    }
    /**
    * ラーメンのスープを取得
    *
    * @return スープ
    */

    public String getSoup() {
        return fSoup;
    }
}

 おいしいラーメンが出来上がる気持ちがしてきましたか?

次に、ラーメンを作る料理人をクラスで表すと……

 先ほどのラーメン・クラスを使って、実際のラーメンに当たるラーメン・オブジェクトを作ってみます。とはいえ、ここはラーメン屋なので、ラーメン料理人にラーメンを作ってもらいましょう。

図2 ラーメン屋で働く料理人
図2 ラーメン屋で働く料理人(こちらの図はJavaプログラミング[アプリケーション編]ステップアップラーニング』(技術評論社)で使われた図を引用して再作成したものです)

 ラーメン料理人クラスは、注文を受けると、ラーメン・クラスのインスタンスを作ります。

RamenCook.java
/**
* ラーメン料理人クラス
*/

public class RamenCook {
    /**
    * ラーメンの注文を受ける
    *
    * @return ラーメン・インスタンス
    */

    public Ramen acceptRamenOrder() {
        // ラーメン・クラスからラーメン・クラスのインスタンスを作成
        final Ramen ramen = new Ramen();

        // 作成されたラーメン・インスタンスをreturnする
        return ramen;
    }
}

 次ページでは、引き続きクラスとオブジェクトについて解説し、さらに「汎化・特化」についても説明します。

 
1-2-3-4

 Index
第11回 いまさら聞けないJavaによるオブジェクト指向の常識
Page1
いまこそ振り返る「オブジェクト指向」
Java言語で、オブジェクト指向を見てみよう
JavaにおけるClassとObject
  Page2
コラム 「オブジェクトとインスタンスは違うものなの?」
「汎化・特化」、Javaでは多くの場合「継承」
  Page3
「メッセージ・パッシング」、Javaではメソッド呼び出し
コラム 「同じ言葉でも意味が違う“インターフェイス”」
「カプセル化」、Javaではアクセス修飾子などで実現
「多態性」、同一のメッセージで異なる振る舞い
  Page4
Java APIの「裏技」java.lang.reflectパッケージとは?
もっとオブジェクト指向を習得するためには?






Java Solution全記事一覧



TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH