1.2 構造体からクラスへ

 伝統的な手続き型言語では,まずデータ構造を決定し,それを処理するためのアルゴリズム,言いかえれば手続きを決定することで,プログラムを作成してきました.これは,名著,
Niklaus Wirth.
Algorithm + Data Structure = Programs. Prentice Hall, 1976.

のタイトルに謳われているとおりです.

 例えば,皆さんがやってきたこの演習課題などは、典型的な例です.

 そこで類似した問題として以下のようなものを考えます.

 

・個々のガソリンスタンドは,単価,全売上,売るガソリンの残量のデータを管理しています.

・市内に2店舗ある支店の売上と残量を管理するプログラムを作りなさい.

 

 その典型的な開発手順として,
  1. 単価,全売上,売るガソリンの残量 の3データを保存するデータ構造を決定する.
  2. データの初期値(開店時のデータ)を与える処理を作成.
  3. 販売した結果,売上,残量が変化する処理.
  4. ある時点の売上,残量などを表示する処理.
といったところでしょう.その帰結として,

struct GasStation {
    int unitPrice;
    int sales;
    int remain; 
};
という構造を決め,

あたりを実装することになるでしょう.



 ここで気付いてほしいのは,

データと, それを処理する手続き(関数)セットにして扱っても良いのではないか?
というところです.

 上記の問題ではピンとこないかもしれませんが,例えば,上記の問題に,客の車店員 の情報など,別のデータ構造が追加された問題を想像すると良いでしょう.その場合,構造体の山と,関数定義が散乱しているより,どの関数がどの構造を見たり,いじったりするのかを,明示的にセット扱いしたほうが見やすいと思われます.

 Javaでは,データとそれを操作する関数をセットにしてクラスという構造として扱います.丁度,クラスとは,構造体と,その構造体を操作するための関数をセットにしたものだと考えれば良いのです.
上記の例は,


public class GasStation {
    int unitPrice;
    int sales;
    int remain; 

    void init(int u, int s, int r){
        // 実際の初期化のための処理を書く,例えば,
        unitPrice = u; sales=s; remain=r;
    }

    int sales(int fuil){
       // 実際の売上のための処理を書く,例えば,
       remain -= fuil; sales += fuil * unitPrice;
       return sales; 
    }

    void show(){
      // 実際の現状を表示するための処理を書く,例えば,
      System.out.println(sales);
      System.out.println(remain);
    }
}

となります.このように構造体とセットにされた手続き(関数)のことを,javaではメソッドと呼びます.

 このように構造体的な役割はclassによって担えるので,javaには構造体はありません.ちなみに,いくつか見なれないキーワードがありますが,まあ,気にしないでください.


例題

とりあえずこの例題をコンパイルしてみよう.でも、コンパイル時にエラーが出ます.

 


2003年10月1日 11:09 更新