趣味でJAVAアプリケーションが作れる趣味でJAVAアプリケーションが作れる

技術者に師事したことはないですが、ある意味プロフェシッショナルかもしれない楽々アート会(趣味で絵を描くサークル)会員の私が、ソフト制作初心者のために蘊蓄を語ります。楽々アート会のページへ(←我々の絵画作品も掲載しています)

5.JAVAでプログラミング(3)

[オブジェクト指向とは?]

世間では説明書をExcelで作る人がいます。PCにはMicrosoft Wordがインストールされているというのに。多分、Wordを使ったことがないからやり方を知らない~文章を書けて絵が貼れれば目的を達するから…そんなところでしょうか?~しかし、定型の文書を幾つも、より簡単に作成したいなら、(そういう作業に特化した)Wordでの作成をトライすべきです。
Wordは本格的なDTPソフトとは言えないでしょうが、それでもスタイルシートを作成する機能があり、実はこのスタイル(段落スタイル)は、既存のスタイルに設定された書式を“継承”して新しいスタイルを作成します。…面倒ですか?あらかじめ書式を決めておいて段落に適用してゆけば、文書を作成する際に、いちいち段落に対して個別の書式(フォントの種類やらサイズやら)を設定する必要がなくなる、ということなのですが…
元となるスタイル(使用フォント、フォントサイズ、段落の設定)を元に新しいスタイル(使用フォント=同じ、フォントサイズ→大きく、段落の設定→マージンを大きく)を作るとします。この元となるスタイルの使用フォントを変更したら、派生した新しいスタイルの使用フォントも変更されます。→これは“継承”と言われる仕組みと同じです。

…以上は、文書のスタイルについての話ですが、JAVAプログラムにおいてクラス(変数+コントラクタ+メソッド)を派生させる場合も、同様の継承が行われる、ということになっています。勿論、必要なクラスを必要なだけ作れば、別に継承などせずとも良い訳ですが、ちょっとここだけ違うクラスやらを大量に作ったら後で修正するのが大変になるのは想像できると思います。…なので面倒かもですが、この機能とこの機能はひとまとめにすべきだな…などと最初にちゃんと考慮(設計)した上でクラスを作る、その際に修正やらが簡単になる仕組み(=オブジェクト指向)を利用するということになっておるのです。なのでプログラミングにオブジェクト指向などいらないのですが、無駄な時間を節約するようなプログラミングには必要な仕組みだということです。
僕も計算(計画)は苦手で思いつくままにスパゲッティーな?プログラムを量産した過去がありますが、ソイツはもう誰も修正不可で、作った本人ですら一瞬???となる…お前が言うなって話ですが、ちゃんとコメントを書き残す、などということも含めて、折角そういうシステムになっていますので解りやすいプログラムを書いて頂きたいと思います。…加えてその仕組みがわからなければ、オブジェクト指向的に記述されたプログラム(多分殆どのJAVAプログラム)が修正しにくい(勘に左右される?)と思います。

[クラスの継承]

さて、前回「4.JAVAでプログラミング(2)」で、クラスを追加したkasan.javaですが、もう少し良い例を示したかったのですが、以下のように変更してみました。(いずれ例を変更するかも知れませんが、とりあえずはこれで説明します)

つまりが(前回↓)
Calc calc = new Calc(a,b);
:
System.out.println("加算結果="+ab);

の代わりに、(今回↓)
Calc calc = new Subcalc(a,b);
:
System.out.println(calc.s+ab);

そして前回追加したクラス Calc のコンストラクタの b=inpb; の後に、
s="加算結果=";
を追加。そして前回追加したクラスの下にもう1つ以下のクラスを追加しています。
private static class Subcalc extends Calc{
Subcalc(int inpa, int inpb) {
super(inpa, inpb);
s="減算結果=";
}

int calcplus() {
ab=a-b;
return ab;
}
}

この追加したクラスSubcalcは、Calcクラスを継承するサブクラスです。(~extends Calcと記述します)
ここで同じ名前のメソッドを記述していますが、ab=a+b; を ab=a-b;に変更しています。
このクラスをインスタンス化(Calc calc = new Subcalc(a,b);)して、ab = calc.calcplus();とすると、Subcalcに記載した方の calcplus メソッドを実行します。これをオーバーライドというそうです。ちなみに同じクラスの中で同じメソッド名を、引数(の型やら数)が違うメソッドを作り、引数によって実行メソッドを選択させることをオーバーロードというそうです。
このプログラムでは入力値A-入力値Bの値が結果として表示されることになります。結果表示部分を System.out.println(calc.s+ab); として、“加算結果=”を変数化しているのは、表示文字をクラスのコンストラクタから代入するためです。故にSubcalcクラスは、これを s="減算結果="; と変更しています。この元となるクラスをスーパークラス、派生したクラスをサブクラスと呼ぶそうです。

[インターフェース]

さて、前回「4.JAVAでプログラミング(2)」で、クラスを追加したkasan.javaですが、上の例とは別の以下のような変更をしてみました。

…いちいち修正点を書き出しませんが、1.初めに加算か減算かを選択、2.減算メソッドを追加、3.あえて説明の為だけにインターフェースを追加、って変更を加えました。
インターフェースの分だけ書き出せば、 }while(cnt<2); の後に、
Calc calc = new Calc(a,b);
if(flg==0) {
ab = calc.calcplus();
s = Ckind.s1;
}
else {
ab =calc.calcminus();
s = Ckind.s2;}
System.out.println(s+ab);

そしてCalcクラスの後ろに、
private static class Ckind implements Add, Sub {
public String add() {
return s1;
}
public String sub() {
return s2;
}
}

interface Add {
String s1="加算結果=";
String add();
}
interface Sub {
String s2="減算結果=";
String sub();
}

を追加しています。

まあ言っちゃえば、interface Addとinterface SubをCkindってクラスに継承して、2つのインターフェースに振り分けた文字列を呼び出せる仕組みにしたってだけで、ifで分岐すれば全く必要のないインターフェースではありますが、こんな感じで変数を呼び出せるってことが役立つシチュエーションで使用して頂く、って話です。
ちなみにs = Ckind.s1;、s = Ckind.s2;が、文字列を呼び出している部分です。そしてインターフェースAdd、Subの変数(またはメソッド)をクラスに実装する部分が private static class Ckind implements Add, Sub { です。

JAVAはコマンドラインで動作する以外にもブラウザを利用して動作させる(JSP)方法があります。いや、方法といえばWindowsで普通のアプリみたいに動作させる方法もあるのですが(JavaFX、及びLaunch4jを検索)…普通にVisual Studio(Delphiでも良いけど)を使えば?と思います。次回はJSPならぬPHPについて語ります。(3英字略語多すぎ…ASPってのもあるけど、略語の意味変わってるし…)


■ 記事一覧

絵画の一歩絵画初心者のために蘊蓄を語るページ
1.絵を描く
音楽の一歩楽器初心者のために蘊蓄を語るページ
1.ギターを弾く
プログラミングの一歩ソフト制作初心者のために蘊蓄を語るページ
1.プログラミングとは
2.JAVAを使う
3.JAVAでプログラミング(1)
4.JAVAでプログラミング(2)
5.JAVAでプログラミング(3)
6.PHPでプログラミング(1)
7.Excel VBAでプログラミング(1)
8.Excel VBAでプログラミング(2)