Goukei.java に生徒の名前を合わせて処理をする Goukei2.java を作りました。これをオブジェクト指向になる前の様式でプログラムを組んでみます。
javaで作ったプログラムが必ずオブジェクト指向になるとはいえないという例にもなります。こうしてはいけないという訳ではありませんが、なぜオブジェクト指向のプログラム言語が主流になったかを考えてみてください。
public class GoukeiProc { public static void main( String[] args ) { String[] namae = {"岩井 亜紀","河合 和子","木原 園子", "布川 麻子","福永 秋絵","三上 美奈", "矢島 千晶","吉沢 裕子","渡辺 智子" }; int[] ten = {78,45,65,35,92,63,57,89,84}; double goukei = 0; for ( int i=0; i < ten.length ; i++ ){ System.out.print( namae[i] ); System.out.print( " " ); System.out.println( ten[i] ); goukei = goukei + ten[i]; } System.out.println( goukei ); System.out.println( goukei/ten.length ); } }
これできちんと処理されますが、プログラムの中では名前と点数が別々の配列に入れられていて、番号で結びつけられています。文字と数値という異なるものを単一の配列に入れられなかった時代の名残です。
しかし、元のデータは次のように人と点数で固まりになっているのでそのままセットで扱えるならば楽になります。
"岩井 亜紀",78 "河合 和子",45 "木原 園子",65 "布川 麻子",35 ............
プログラムが複雑になり、プログラミングが共同作業になるにつれ、現実のデータを元の形で扱いたいと考えるようになりました。
実はこのような発想はオブジェクト指向が言われる前からC言語などで使われていた「構造体」というもに見られます。ただデータベースなどはっきりとしたデータ構造を持つときに使うものと受け止められていました。オブジェクト指向はこれをもっと広く使っていこうとするもといえます。
Seito.java や Goukei2.java で、名前と点数を表示する部分が何度かでてきます。これが何をしている部分かわかりにくいですね。
System.out.print( test1[i].namae ); System.out.print( " " ); System.out.println( test1[i].ten )
このの部分をたとえば
show( test1[i] );
などとできれば簡単になります。オブジェクト指向以前にはこれは関数(手続き)としてプログラムされていました。。
public class GoukeiProc2 { // 名前と点数を書く関数(手続き) public static void show( 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++ ){ show( test1[i] ); //関数(手続き)を呼び出す goukei = goukei + test1[i].ten; } System.out.println( goukei ); System.out.println( goukei/test1.length ); } }
show という関数(手続き)をあらかじめ用意しておき、show( test1[i] ); の部分で、test1[i] のデータを show という関数(手続き)に渡して表示をしてもらうということです。
この関数をクラスの内部に入れるとデータの統合だけでなく、データを処理する手続きもまとめておけるのでプログラムの見通しがよくなります。データを処理する方法という意味でメソッドと呼ばれるようになりました。
また、メソッドがクラスの中にあるとメソッドを呼ぶ側が全部のデータを知らなくてもメソッドがクラス内のデータを使って答えを出してくれるので便利です。