1. はじめに |
2. 準備
3. コンパイルと実行
4. オブジェクト指向プログラミング ・・・ 何、言ってんだかわかんないので読まないように
5. ファイル入出力
6. 表の表示
7. 表からの入力
8. データベース操作 ・・・ Oracle8 で味を占めたので、JBuilder2 を使ってアクセスしてみました(不完全)
9. 参考文献
2. 準備 ↑top |
3. コンパイルと実行 ↑top |
set CLASSPATH=.;C:\... (ピリオドとセミコロンは半角英文字です)
私がつまづいたのは、まず、ファイル名の付け方です。ファイル名=クラス名.javaでなければいけないのです。大文字・小文字が違っていてもコンパイラに怒られてしまいます。実行時も注意が必要です。java Hello.class とやっても怒られます。慣れてくると気にせずにできますが、最初は、どうしてこんな分かりにくいの? と投げ出したくなりました。
ここでは、単に皆さんの環境に問題がないかを確認するために、コンパイルと実行をやってみたと思ってください。
実は、上記のプログラムはとても特殊な例で、オブジェクト指向の説明としてはあまりよくない例です。それでは、オブジェクト指向プログラミングとはいったいどういうことを言うのでしょうか?
4. オブジェクト指向プログラミング ↑top |
この世の中、何事にも理由というものがあります。オブジェクト指向が選ばれる理由とは何でしょうか。
いくつかの書籍を読んで総じて言えることは、 規模の大きなプログラムにおいて、製造・試験が今までの言語に比べて楽で、保守性、拡張性に優れている 、ということです。ここで「大きなプログラム」というところが重要です。簡単なプログラムについて、今までの言語と比較して考えてみましょう。
一つ前に使ったサンプルプログラムを BASIC言語で表現してみます。
print "Hello World"たったの1行です。内容も直感的でプログラミング初心者にも受け入れやすいでしょう。
次に、C言語 でサンプルプログラムを書き換えてみます。
void main () {ちょっと複雑になったとお感じでしょうか。{ }で囲われているのはなぜでしょうか。それに付けられた mainというのは何を表しているのでしょうか。voidっていうのは英語なんでしょうか。
printf("Hello World\n");
}
次に、Java言語 での例を再度示します。
public class Hello {この辺にくると、明らかに面倒くさいという気がするのは私だけではないと思います。C言語を知っていれば、内側の3行は察しが付きますが、その外のclassというのは何でしょうか。printするための関数(Javaでは関数とは言いませんが)も何やら長くなっています。
public static void main(String argv[ ]) {
System.out.println("Hello World");
}
}
このように、簡単なプログラムで考えると明らかにBASICが優れています。
わざわざ、Javaで書く人はいません。そういう意味でこのサンプルは、Javaを説明するには不向きで、とりあえず動いた、動いたというしろものなのです。
今BASICを使う人はいないでしょうが(VisualBASICについてはよく知りません)、似たようなインタプリタ方式の言語である
Perl
というのを使って人はいっぱいいます(Perl言語というのは、どちらかというとC言語の方に近いのですが、直感的な使いやすさはBASICに通じるものがあります)。
ここまで読んできてたプログラミング初心者の方は以下のように考えるのではないでしょうか。
「私は大きなプログラムなど作るつもりはないので、どうもJava言語を勉強する必要はないようだ」
結論から言うと、「いいえ、Javaを覚えた方がいいと思います」 という答えです。今のプログラムは、グラフィカルなインタフェース(画面からの入力を示していますが、それ以外のものを想像する方が難しい人も多いでしょう)が必須になってきていますが、これを実現するだけで既に大きなプログラムとなるでしょう。こんな機能も欲しいと付け加えていくと、想像以上に大きなプログラムになっていることもよくあることです。こんなプログラムは、自分で作ったものでも少し時間が経つと何が何だかわからなくなるものです。また、インターネットでブラウザを対象にしているのなら、簡単なプログラムでもJavaを使う方が得策でしょう。
という訳で、自分でプログラムを作ってみようという人は、結果としてある程度大きなプログラムを作ることになるでしょうから、最初からJavaを勉強し、プログラミングしていくことを奨めるのです。
次には、こんな質問が来そうです。
「大きいプログラムだと、どうしてJavaが有利なのか。」
前置きがとっても長くなりましたが、このセクションで説明したいのはこのことです。
それでは、前述の流れにそってプログラミング言語の進化について私なりの解釈を書いてみます。
まず、BASIC言語からC言語への進化の必然性について書いてみます。
BASIC言語では、1つのプログラムを1つの流れで記述することが強要されていました。もちろんサブルーチンという考え方もありましたが、これは一まとまりの共通的な処理を切り出したに過ぎず、その中で使われる変数は共通のものでした。そのため処理を分割することでプログラムの見通しは良くなりますが、それぞれのサブルーチンを独立に考えることはできませんでした。
サブルーチン単位でプログラム試験することはできますが、これらを結合させたときに新たな問題が発生することは避けられません。これではサブルーチンを再利用することはできますが、とても部品とまでは言えません。必ず手直しが入るからです。これはBASIC言語の最大の欠点で、これに対処するためにプログラムの構造化も試みられましたが、次に示すC言語に取って代わられました。
C言語の大きな特長の一つに関数があります。BASICの欠点はサブルーチンの非独立性であると書きましたが、Cでは変数の受け渡しを明確に定義した関数という概念を取り入れて解決しています。先ほどのプログラムサンプルで、main() と出てきたのが関数の名前で、その範囲を { } で表しています。実際は以下のように、複数の関数間の受け渡しで始めてその有効性が理解できるでしょう。
void main() {この例では同じ名前の2つの変数を使っていますが、この2つが干渉し合うことはありません。この考え方により、大規模なシステムを細分化して設計、製造、試験することが可能となり、より複雑なシステム開発が実現できるようになりました。
char name[10];
strcpy(name, "Tom");
hello(name);
}
void hello (char name[10]) {
printf("Hello World, my name is %s\n", name);
}
こんな便利なC言語ですが、使っているうちに欠点があらわになってきました。
今度は、C言語からJava言語への進化です。
このレベルの記述ですとC++言語と同等の説明となるでしょう。
関数内で使う変数について独立であることを書きましたが、実際のプログラムでは関数の引数として受け渡す変数が膨大な数の関数の中を流れて1つの処理を実行します。この変数が各種の処理によってどのように変化していくかは、関数の処理の流れを追っていく必要があります。ある1つの変数に着目したとき、これを書き換えている関数は複数存在し、これを管理することは重要ですがプログラム規模が大きいほど困難を伴います。関数間をデータが流れていく以上、その独立性は保てません。C言語の説明で細分化して試験できるように書きましたが、実際はこの後に関数をくっつけて結合試験なるものを実施する必要があります。
私は仕事として、C言語を用いていくつかのシステムを開発してきました。中にはピークで100人を超えるような規模の大きなものもありました。関数が1000を超えると、関数と関数の関係など何が何だか分からなくなってきます。プログラムの開発量を減らすために同じような機能を切り出して共通関数を定義するのですが、この部分に改造が必要になってくると関数間の関連が問題になってきます。機能改善のためにプログラムに手を入れることがありますが、ちょっとしたことでも修正量や開発期間が予想以上になったしまうことはよくあることです。
ではどうすればいいでしょうか。データが関数間を流れるのが問題であるのなら、流れないようにすればいいことになります。これをそのまま実現すると、1つの関数ですべてを処理するBASIC言語に戻ってしまって本末転倒になりますが、ここではデータが流れる関数をまとめた単位を新たに定義するということを考えます。つまり、いくつかの変数とこれを処理する関数を一まとまりにすることで、データの独立性を完全なものにしているのです。該当の変数はそのまとまりの中でしか使っていないのですから、プログラマはその中だけを意識していればいいのです。
これがオブジェクト志向プログラミングの本質であると私は解釈しています。ただしこのままだと、C言語でデータを扱うときに構造体というもののメリットが欠落してしまいます。また、データをまとめるという観点で考えると必然的に似たような処理がいたるところに出てきます。これを解決するのが継承というしくみです。これはデータを構造化すると共にそれを処理すための方法も構造化する一石二鳥のしくみです。
このオブジェクト志向プログラミングを実現するための言語として、Java言語が生まれました。今までにもオブジェクト志向のプログラミング言語はいくつか存在していますが、Java言語はそれらの敷居が高かった部分を改善し、有る意味では妥協して、より実装しやすい言語として登場したため、万人の支持を受けているようです。
先ほど、「いくつかの変数とこれを処理する関数を一まとまりにする」ことを書きましたが、これをクラスといいます。この中の処理するための関数はメソッドと呼ばれます。
それでは、少しはJavaらしいサンプルプログラムを通して、具体的に考えていこうと思います。
5. 配列とリスト ↑top |
5. リストのソート ↑top |
6. JavaMail ↑top |
6. 異常の検出 ↑top |
5. ファイル入出力 ↑top |
6. 表の表示 ↑top |
7. 表からの入力 ↑top |
8. データベース操作 ↑top |
9. 参考文献 ↑top |
このページにご意見のある方は、egami@ee.e-mansion.com までお願い致します。