オブジェクト指向とは

Java はオブジェクト指向と呼ばれるプログラミング方法を行う言語のひとつです。オブジェクト指向では何か特定の役割を果たすモノ(=オブジェクト)を作成し、そのオブジェクトに対して実行する処理を指示する形でプログラミングを行います。ここでは Java におけるオブジェクト指向とはどういったものなのかを簡単に解説します。

(Last modified: )

手続き型でのプログラミング

オブジェクト指向の話をする前に、よく対比される手続き型と呼ばれるプログラミング方法について解説します。簡単に書いてしまえば手続き型は目的を達成するための必要なコードを直接記述していくものです。 Java は分類としてはオブジェクト指向を使った言語ですが、手続き型の手法で記述することも可能です。

例えば 1 から 10 までの範囲の乱数を 5 つ画面に表示するプログラムを考えてみます。表示する乱数は続けて同じ値が表示されないようにしています。手続き型であれば、この目的を達成するのに必要なコードは次のように記述することができます。

class JSample5_1{
  public static void main(String[] args){
    int lastNum = 0;;

    for (int i = 0; i < 5; i++){
      int newNum;
      do{
        newNum = (int)Math.ceil(Math.random() * 10);
      } while (newNum == lastNum);

      System.out.println(newNum);
      lastNum = newNum;
    }
  }
}

手続き型でのプログラミング(1)

最初に最後に表示した乱数を保管しておくための変数を用意します。新しい乱数を取得し、前回と同じ値だったら取得しなおします。取得した乱数を画面に出力し、変数に保管しておきます。それを繰り返し文を使って 5 回繰り返します。

このように乱数を 5 回表示するという目的に対して、必要なコードを順に記述して実行しています。このようなプログラミング方法を手続き型などと呼びます(正確には異なるかもしれませんが気にしないでください)。必要に応じてサブルーチンを定義し、繰り返し行う処理を分けることもできます。

手続き型の場合は必要となる結果を得るためのコードを順番に書いていくだけなので、今回のような簡単なサンプルの場合には適しています。またどんな複雑なプログラムであっても長い処理を順に記述していけば最終的に目的の結果を得ることはできます。

なお Java では必ずクラスを定義する必要があるのでクラスの中にコードを記述していますが、これはオブジェクト指向ではなく手続き型のプログラミング方法です。

オブジェクト指向でのプログラミング

次にオブジェクト指向の場合です。オブジェクト指向では最初にモノ(=オブジェクト)を設計するところから始めます。どんな処理を行うのか、どんなデータを扱うのか、関連性の高い処理とデータをまとめてオブジェクトを設計します。

オブジェクト指向の例としてよく車が使われます。車は動かす、止まるといった処理や、燃料の残量や走行距離といったデータを扱います。これらを車というオブジェクトで扱います。車と関係はありますが、燃料の単価のようなデータを車というオブジェクトで管理することは不適切のため、例えばガソリンスタンドなどの別のオブジェクトを用意します。

それでは先ほどと同じ 1 から 10 までの範囲の乱数を 5 つ画面に表示するプログラムを考えてみます。表示する乱数は続けて同じ値が表示されないようにしています。オブジェクト指向に沿った形で作成する場合次のようなコードになります。

class JSample5_2{
  public static void main(String[] args){
    Randamer r = new Randamer(10);

    for (int i = 0; i < 5; i++){    
      System.out.println(r.getNum());
    }
  }
}

class Randamer{
  private int maxnum;
  private int lastNum;

  public Randamer(int maxnum){
    this.maxnum = maxnum;
    lastNum = 0;
  }

  public int getNum(){
      int newNum;
      do{
        newNum = (int)Math.ceil(Math.random() * 10);
      } while (newNum == lastNum);

      lastNum = newNum;
      return lastNum;
  }
}

オブジェクト指向でのプログラミング(1)

乱数を管理するオブジェクト Randamer を定義しました。このオブジェクトは作成する乱数の範囲や最後に作成した乱数の値を管理するフィールドと、条件にあった乱数の値を返すメソッドが定義されています。 main メソッドの中では Randamer オブジェクトを一つ作成し、オブジェクトに対して乱数を一つ返すように依頼しています。それを繰り返し文を使って 5 回繰り返します。

ここで使用したどんなオブジェクトを作成するのかを定義するのに使用するのがクラスです。クラスではオブジェクトが扱うデータや、実行する処理を定義します。通常の変数では指定したデータ型の値を一つ管理できるだけですし、配列を使っても同じデータ型の値を複数管理できるだけです。クラスは必要な数だけ任意のデータ型のデータを管理することができ、そのデータを処理するための専用のメソッドを用意することができます。

今回のような簡単なサンプルでは面倒に見えるオブジェクト指向でのプログラミングですが、クラス単位で開発や拡張、メンテナンスを行うことができたり、それぞれのクラスで共通のルールを設けることができるといった仕組みが用意されておりメリットも数多くあります。次のページ以降では、クラスの記述方法やオブジェクト指向独自の記述方法などより細かい解説を行っていきます。

-- --

Java におけるオブジェクト指向とはどういったものなのかを簡単に解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。