関数(手続き)としてのクラス

オブジェクト指向以前のやり方

前回の Goukei3.java や Goukei4.java で、名前と点数を表示する部分がなにをやっているかわかりにくいですね。つまり、

System.out.print( test1[i].namae );
System.out.print( " " );
System.out.println( test1[i].ten )

の部分を

showSeito1Kamoku( test1[i] );

などとできれば簡単になります。オブジェクト指向以前にはこれは関数(手続き)としてプログラムされていました。。

ファイル名 Goukei5.java

public class Goukei5 { 
    // 名前と点数を書く関数(手続き)
    public static void showSeito1Kamoku( Seito1Kamoku s ) {
           System.out.print( s.namae );
           System.out.print( " " );
           System.out.println( s.ten );
    }
    public static void main( String[] args ) {
       Seito1Kamoku[] test1 = {
               new Seito1Kamoku("岩井 亜紀",78),
               new Seito1Kamoku("河合 和子",45),
               new Seito1Kamoku("木原 園子",65),
               new Seito1Kamoku("布川 麻子",35),
               new Seito1Kamoku("福永 秋絵",92),
               new Seito1Kamoku("三上 美奈",63),
               new Seito1Kamoku("矢島 千晶",57),
               new Seito1Kamoku("吉沢 裕子",89),
               new Seito1Kamoku("渡辺 智子",84)
       };
       double goukei = 0;
       for ( int i=0; i < test1.length ; i++ ){
           showSeito1Kamoku( test1[i] );  //関数(手続き)を呼び出す
           goukei = goukei + test1[i].ten;
       }
       System.out.println( goukei );
       System.out.println( goukei/test1.length );
    }
}

showSeito1Kamoku という関数(手続き)をあらかじめ用意しておき、showSeito1Kamoku( test1[i] ); の部分で、test1[i] のデータを showSeito1Kamoku という関数(手続き)に渡して表示をしてもらう。

オブジェクト指向のやり方

クラスの方に関数を組み込んでしまう

新しい変数の型 Seito1Kamoku とその内容を表示する showSeito1Kamoku が別々になっていると、わかりにくいし、後で機能拡張した時に、片方をなおし忘れることも考えられます。2つは関連しているのですから、一緒にしておく。これがオブジェクト指向の考え方です。

ファイル名 Seito1Kamoku.java

次のように拡張します。

public class Seito1Kamoku { 
    /* フィールド */
    String namae;
    int ten;
    /* コンストラクタ */
    public Seito1Kamoku( String s, int n ){
       namae = s;
       ten   = n;
    }
    /* メソッド */
    public String toString(){
       return namae + " " + ten ;
    }
}

メソッドと書いてある部分がそれです。名前は toString() showSeito1Kamoku が表示までやってしまうのに対して、表示するデータをひとつにまとめるものになっています。どこまでをやらせるかは考え方によりますので別のやり方もあります。

今までの言語ではこのようなものを関数とか手続きと読んでいることが多いのですが、javaではメソッドと呼んでいます。

返す値は namae + " " + ten で、データの型はStringです。

toString()の前のStringが、String型のデータを返すという印です。。

returnの後にある式 namae + " " + ten の処理結果が返す値になります。

これはコンパイルだけします。mainがないので実行はできません。

メソッドを使う

使い方は、フィールドに似ています。

System.out.println( seito1.toString() );

Goukei3.java をこのメソッド(関数)を使って書き直したプログラムです。

ファイル名 Goukei6.java

public class Goukei6 { 
    public static void main( String[] args ) {
       Seito1Kamoku seito1 = new Seito1Kamoku("岩井 亜紀",78);
       Seito1Kamoku seito2 = new Seito1Kamoku("河合 和子",45);

       System.out.println( seito1.toString() );

       System.out.println( seito2.toString() );
    }
}

配列と組み合わせて使う

Goukei4.java をこのメソッド(関数)を使って書き直したプログラムです。

ファイル名 Goukei7.java

public class Goukei7 { 
    public static void main( String[] args ) {
       Seito1Kamoku[] test1 = {
               new Seito1Kamoku("岩井 亜紀",78),
               new Seito1Kamoku("河合 和子",45),
               new Seito1Kamoku("木原 園子",65),
               new Seito1Kamoku("布川 麻子",35),
               new Seito1Kamoku("福永 秋絵",92),
               new Seito1Kamoku("三上 美奈",63),
               new Seito1Kamoku("矢島 千晶",57),
               new Seito1Kamoku("吉沢 裕子",89),
               new Seito1Kamoku("渡辺 智子",84)
       };
       double goukei = 0;
       for ( int i=0; i < test1.length ; i++ ){
           System.out.println( test1[i].toString() );
           goukei = goukei + test1[i].ten;
       }
       System.out.println( goukei );
       System.out.println( goukei/test1.length );
    }
}

書き直しただけなので結果はおなじはずです。Goukei4 よりもこちらがわかりやすいと感ずることができれば、まずまずです。

U:\user\java> java Goukei7
岩井 亜紀 78
河合 和子 45
木原 園子 65
布川 麻子 35
福永 秋絵 92
三上 美奈 63
矢島 千晶 57
吉沢 裕子 89
渡辺 智子 84
608.0
67.55555555555556

toString()の省略

toString()というメソッドはSystem.out.println等の中では省略可能です。

System.out.println( seito1.toString() );

は、次のように書くことができます。

System.out.println( seito1 );
もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified