Javaプログラム
初めてプログラムをする人を対象として、プログラムの入門者用にまとめて行きます。文章中に詳細説明のためのリンクや他の言語を知っている人の為のリンク等はつけるつもりですが初心者に分かりやすい様に配慮したいと思います。プログラム入門者の方は以下の様に読み進めて下さい。
Javaプログラムについては、基本的にリンクを張らないで説明します。私はコラム的な文章や比喩的表現などを使うのは好きなのですが、これは本文を離れてしまいます。入門者には勧その時点で奨めない内容やリンクは右側に付けます。プログラムに必要な言葉等は本文中にリンクを付けますので、その言葉が理解できず先に進めない場合に限りリンク先を見るような使い方をして下さい。
Javaって何
Javaは、米Sun Microsystem,Inc(以降「Sun])が開発したオブジェクト指向のプログラミング言語のことです。生まれはSunのUNIX上のOSでした。
Javaは色々なOS上で動かせることを想定して作られたプログラム言語ですが、現在Javaを使う主な方法としては、やはり、Webブラウザ上で動きのあるページを記載できるというのが1番でしょう。このWeb上で動く部分(部品)をアプレットと言います。通常のアプリケーションソフトなども作ることは出来ますが、本文では、アプレットを中心にJava言語の説明をしてゆきたいと思います。
Javaプログラムをしてみよう
Javaプログラムをするためには、JavaのコンパイラやJava環境などが必要ですが、コンパイラはSunのホームページ( http://java.sun.com/j2se/1.3/ja/index.html)から、マイクロソフト社の-ウィンドウズ用JDK(Java Development Kit :j2sdk1_3_0-win.exe)をダウンロードするか、雑誌、専門誌などの添付CDROMから取得してください。実際ダウンロードの場合データ量が多いので、最新のJava関連雑誌から取得することをお奨めします。
それから、これをインストールして、プログラムできる環境にするまでが、初心者には敷居が高いと思います。でも、ご安心下さい。筆者は初心者用にインストール支援と簡単にJavaプログラムの骨格が自動生成されるツールを用意しました。HSLのJavaツール「HJava.exe」(β版)です。説明ファイル「HJavaRead.txt」をダウンロードしてお使い下さい。
第0章 Javaインストールと体験
◎インストール (まずJDK1.3「j2sdk1_3_0-win.exe」と「HJava.exe」を用意して下さい)
インストールにはハードディスクに約100MB以上の空きが必要です。j2sdk1_3_0-win.exe と HJava.exe をC:¥temp等にコピーし、全てのアプリケーションを終了する。
C:¥temp等にコピーしたHJava.exeをそこから実行して、その指示に従い作業を進める。HJava.exeを実行し幾つかのダイアログを確認すると初期設定ダイアログが出てきます。「初期設定」ダイアログで最初にJDKをインストールします。JDKのインストールについてはSunの使用承諾等を読んで進めて下さい。
インストールを続けるときはOKを押して下さい。
JDKを用意してあるかの確認です。用意してあればOKを押して下さい。
JDKをC:tempにコピーしている場合は「JDKインストールファイル・・・」のボタンを押す必要はありません。JDKインストールを開始しますボタンを押して下さい。 ※JDKがインストールしてある場合は、Version、Pathのところに番号とパスが表示されます。Version1.3の場合はインストールの必要はありません。また、Ver1.1以上であれば、本文の説明上問題ありません。
C:ドライブに空き容量がある場合は、今後出てくる説明と同じようにするために、C:ドライブにインストールする事をお奨めします。
上記の初期設定ダイアログで「OK」ボタンを押すとメイン画面が出てきます。これで、インストールは終了です。
1度「ファイル」メニューの終了をえらんで終了して下さい。これで、C:\java\hjava\bin\hjava.exeが在ればOKです。HJavaを使う場合、必要に応じで hjava.exeのショートカットなどを 作って使用して下さい。
◎実際にやってみよう
1、インストールされたC:\java\hjava\bin\hjava.exeを起動し、ファイルメニューから新規作成を選ぶ
2、下記の新規作成ダイアログが表示されますので、新規クラス名を入力して「OK」ボタンを押す
これが、Javaアプレットのクラス名となります。また、HJavaシステムのプロジェクト名にもなります。
(クラス名は全て半角英数字で、最初の文字は英字でなければいけません)まずは練習と言う事で、クラス名は Hello としてみましょう
3、Javaソース画面が表示されます。
アプレットの骨格を自動生成したJavaソースが表示されます。今回クラス名にした形で出来ていますので、このままコンパイルすることができます。また、タブでHTMLソースの方を選ぶと、このアプレットを実行するためのHTMLソースが出来ております。
4、コンパイルする
メニュー下にある「Javaコンパイル」ボタンを押すと生成されたソースをコンパイルします。5、アプレットの実行
メニュー下にある「インターネットエクスプローラ起動」ボタンを押し。作られたアプレットをブラウザで実行させます。
さあ、どうでしょう、ブラウザにHello World!の文字列は出たでしょうか、この様に簡単にアプレットが作成できます。
※注意!
Windowsのバージョンによっては、HJAVAのDOSウィンドウ裏画面が、手前に来るとマウスが使えなくなる場合がありますが、その時は、「Alt」+「Tab」キーを押してウィンドウのHjavaを手前に表示させて下さい。、今後のバージョンでこれらの対策もしてゆきますので、現時点ではこのように対応してください。◎最初は、この自動生成されたJavaソースから解説して行きます。
第1章 Javaの文法
◎ここでは、Javaの表現を大まかに説明します。初めは分からない単語ばかり出てくるかもしれませんが、後でゆっくり理解できるように説明して行きますので、今は、「Javaではこんな言葉がよく使われるのだな−」程度で思っていて下さい。
まず、第0章でみた、自動生成された「Hello World!」を表示するアプレットを見てみましょう。
//=======================================================
//Javaソース:Hello.java <hsl@hslnpo.com HJava Ver1.0>
//=======================================================
import java.applet.*;
import java.awt.*;
//=======================================================
//アプレットのメインクラス:Hello
//=======================================================
public class Hello extends Applet
{
// アプレットの再表示
public void paint(Graphics g) // 描画ハンドラ
{
g.drawString("Hello World!", 50, 50);
}
}簡単な例ではありますが、それでも色々な英単語のようなものがならんでいてよく分かりませんね。 ここでは表示された「Hello World!]の文字を探してそこを見てみましょう。したから3行目にありましたね。drawStringは、文字を描く指示です。
このメソッドは想像できますよね
Javaの文は、コメント、ブロック、宣言、表現、制御文等のどれかになり、それらのほとんどがセミコロン(;)で終了します。「Hello World!」を出力しているひとかたまりの文も右端を見ると(;)で終わっているのが分かります。でもその他は、import から始まる文の右側に(;)が付いているだけで、他はついていません。では、その約束を説明します。
1-1 コメント
人が見て何の処理をしているか分かるように書いておく説明文です。コンピュータは無視する部分です。他の人や、後で自分が分かりやすい様に書いておく癖をつけた方がよいと思います。
ただ、あまり書きすぎても見づらくなりますので、端的にまとめましょう。コメントには、スラッシュ(/)を2つ続けて書くことで、そこから右側の行末までコンピュータは無視します。当然、その左側はコンピュータも見るプログラムです。
//(例)この行はコメントです。
g.drawString("ここはプログラム", 0, 20); // ここはコメント
////////////スラッシュは2つ以上なら幾つでも コメント/////////また、複数行や、ある範囲でのコメントに、スラッシュ(/)とアスタリスク(*)を使った方法があります。
始まりは、スラッシュとアスタリスクを続け、終わりは逆にアスタリスクとスラッシュをつかいます。
/*ここはコメントです。*/ /* ここも、
ここも g.drawString("ここも コメント", 0, 20);
ここも、ずーと コメントです。
ここも コメント アスタリスクとスラッシュまで、*/但し、/**/のコメントの場合、この中にネストして/**/を入れることは出来ません。
下記はコンパイルエラーとなります。
/* ここはコメント
/* ネストコメントは出来ない */
*//* */コメントの中に //のコメントはOKです。
/* ここはコメント
// ここにコメントを書くことは問題ない
*/
1-2 プログラムを記述するフォーマット
Java言語はフリーフォーマット方式で記述できます。
(最近のコンピュータ言語はほとんどこの方式)自動生成されたHelloプログラムを見ると以下の様になってます(コメントは削除してあります)
import java.applet.*;
import java.awt.*;
public class Hello extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello World!", 50, 50);
}
}各単語の間に1つ以上の空白文字が入っている必要はありますが、下記の様に詰めて書いてもエラーではありません。但し、他人や自分が見やすいように書く方が良いので、なるべく標準的な書き方になれるようして下さい。
import java.applet.*;import java.awt.*;
public class Hello extends Applet
{public void paint(Graphics g){g.drawString("Hello World!", 50, 50);}}
1-3 ブロック
ブロックは、幾つかの処理を、波カッコ { と } の間にまとめる1つの単位と思って下さい。
アプレットでは、最低外部に見せるメインクラスに1対の{ }と、メソッドと呼ばれる単位でまとめる処理単位に1対の{ }があります。
具体的に Helloアプレットでみると、メインクラスのHello と paintメソッドのそれそれで1対になってます。
public class Hello extends Applet
{ // メインクラスHelloの始まりカッコ
public void paint(Graphics g)
{ // paintメソッド始まりカッコ
g.drawString("Hello World!", 50, 50);
} // paintメソッド終わりカッコ
} // メインクラスHelloの終わりカッコこの様に、あるブロックの中に更にブロックをつくることは問題ありません。尚、プログラムを見やすくする意味で、各ブロックの縦カラム位置を同じにするのが普通です。こうすると1つの処理単位がどこで始まりどこで終わるか分かりやすくなります。
1-4 文の終わり記号 (セミコロン ; )
既に説明の通り、Javaはフリーフォーマットで記載されますので、ある処理の文と続く別の処理とを明示的に分ける必要があります。このとき、1つの文の終わり記号としてセミコロン ; を使います。
通常は、宣言文の後や1つのメソッドを記載した文の後などに付けますが、ブロックの後にはつけません。
繰返しを指示する for(i = 0; i < 10; i++) 文など、特別な例もありますから、実際プログラムしながら覚えて行くようにすれば良いと思います。筆者はフリーフォーマットのプログラムはC言語で覚えましたが、このセミコロン ; の付ける位置がどこで付けて、どこで付けないか、覚えるまで、結構時間が掛かったと思います。
第2章 Javaのデータ型
◎ここでは、Javaで使う8つの基本データ型を説明します。Javaでは各データ型のサイズが、言語仕様によって決められています。また、全ての数値型は符号付きで、符号なしはサポートされていません。(C言語の人はびっくり)
データ型 ビットサイズ数 初期値 扱える値 boolean 8 false true か false byte 8 0 -128 〜 127 char 16 'x0' 'A' などのキャラクタ値やUnicode等 short 16 0 -32,768 〜 32767 int 32 0 -2,147,483,648 〜 2,147,483,647 long 64 0L -9,223,372,036,854,775,808 〜
9,223,3772,036,854,775,807float 32 0.0F 32ビット符号付きIEEE754浮動小数点数
±3.4E-38〜±3.4E+38 精度7桁double 64 0.0D 64ビット符号付きIEEE754浮動小数点数
±1.7E-308〜±1.7E+308 精度16桁最初に使う変数は、整数の計算では int型を、実数では double型あたりが素直に使いやすいでしょう。
ポイント:コンピュータにおける精度の考え方
整数型はそのデータ型が扱える範囲で桁あふれが無ければ、与えたデータは完全の値で、変わってしまうことはありませんが、実数型の場合は、データの扱える値の大きさはかなりあるのですが、精度自体はfloat型では7桁程度、double型では16桁程度しか精度がなく、それを超えた精度の部分は切り取られます。
例を上げれば、銀行のお金など、どんなに大きな金額になっても、1円でも狂うわけにはいきませんので整数型で計算を行いますが、物理的な計算等(例えば太陽の質量)では、絶対量の桁数がものすごく大きくなる場合がある反面、精度がそれほど必要でない場合が多いのでdouble型で対応が出来ます。但し、もっと精度が必要になる場合は自分でデータ型をつくることは出来ますが、それは後で説明します。
2-1 変数と変数の宣言
変数とは、プログラムなどで計算やデータ処理をする場合に、一時的にデータを保存したり、計算結果などを保存しておくものです。これら変数は、必要になったとき、あるデータ型に名前(識別子)を付けて宣言してから使います。
数学で言えば Y = 2X + A などの式があった場合の、Y や X や A に相当します。Javaでは、変数を使う場合、使う前に必ず宣言をする必要があります。
宣言の方法は、まずデータ型を決め、次に変数に識別子となる名前を付け、セミコロンで終わる。データ型 変数名
int a ; // 変数 a の最初の値は、0です。(データ型表確認)データ型 変数名 初期値
int x = 10 ; // 宣言と同時に変数の値を 10にする更に、同じデータ型ならば、カンマ(,)で区切りながら幾つでも変数宣言ができる。
int i,j,k; // 変数 i j k を1度に宣言
double dx=15.2,dy=35.1; // 複数の宣言と初期値設定を1度におこなう
int X , A = 12 ;
double Y ;X = 4 ;
Y = 2.25 * X + A ; // 演算子は後で説明します。想像はつくでしょうが・・・
// Y の結果は 21です。
各データ型の配列を宣言
使用するときの添字番号は 0から始まりますので、N個の配列があった場合は、添字番号は0〜N−1と言う事になります。// 配列宣言とデータ設定方法(1次元配列の例)
int ids[ ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 配列宣言とデータ初期値設定int idat1 = ids[0]; // idat1 は1です。
int idat2 = ids[1]; // idat2 は2です。
int idat10 = ids[9]; // idat10 は10です。// 配列宣言とデータ設定方法(2次元配列の例)
int ids2[ ][ ] = // 2次元配列宣言とデータ初期値設定
{ { 11, 12 },
{ 21, 22 },
{ 31, 32 }
};配列の場合、宣言しただけでは変数の領域はつくられません。以下の例ではnew演算子を使い動的に領域を作っています。詳しくは演算子の方で説明します。
// 宣言だけの場合(1次元配列の例)
int idats[]; // 配列であることを指定するだけで、このままでは使えない。
idats = new int[10]; // int 型 10個の配列を作る
◎注意点:変数名のつけ方
変数に識別子となる名前を付けるときの決まりごとは、先頭がアルファベット文字「A-Z」、「a-z」や下線 _ や$マークのどれかで始まり、続く文字は先頭で使っている文字の他、数字「0-9」を使うことが出来ます。
この他にUnicode文字(日本語の漢字や全角の英数字など)も使えますが、最初はなるべく半角英数字を使って行きましょう。
他に予約語として使えない単語もあります。また、クラス名やメソッド名と同じ変数名にすることも、コンパイルエラーとなり使えません。
Java言語仕様等で決められている予約語は以下
abstract boolean break byte case cast catch char class const continue default do double else extends final finally float for future generic goto if implements import inner instanceof int interface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient try var void volatile while Javaのバージョンにより更に追加されているものがあるかもしれません。
2-2 定数
既に変数の宣言のところで使っていますが、変数に数値や文字などを代入するような場合に使うプログラムに埋め込む形のデータのことを言います。定数のことをリテラルと呼ぶこともあります。
(使用例1)
// データ型 変数名 初期値定数
int x = 10 ; // ここでの 10 のことを定数と言う(使用例2)
// 数学書式や物理等の固定定数などにもつかいますね
// 円周率を 3.14 としたとき円面積を求める場合
double ans ;
double r = 10 ; // 半径
ans = r * r * 3.14 ; // 円面積は、半径2乗×π定数にはディフォルトの型があり、記載方法により型を変えられます。
int idat = 100; // 整数の定数はディフォルトの型が intです。
long ldat = 100L; // long の定数にするには、最後に L又は小文字のlを付けます。
double ddat = 1.2; // 実数の定数はディフォルトの型がdoubleです。
float fdat = 1.2F; // floatの定数にするには、最後に F 又は小文字の f を付けます。整数の定数には10進数の他に、8進数、16進数の記述の仕方があります。
// 8進数で指定する場合は、数字の先頭に 0 をつけて8進数データを続ける
int idat = 036; // 10進数での 3016進数で指定する場合は、数字の先頭に 0x をつけて16進数データ「0-9,a-f」を続ける
int idat = 0x1e; // 10進数での 30文字定数と特殊な定数
// 文字定数はシングルクォート(’)で囲みます。
// 例えば空白文字を表したい場合 ’ ’と空白文字をシングルクォートで囲みます。
char ch = 'A' ;
char kuhaku = ' ' ;// 改行や水平タブ、バックスペース、CR(復帰)、FF(改ページ)など特殊な定数
char LF = '\n', TAB = '\t', BS = '\b', CR = '\r', FF = '\f' ;// シングルクォート(’)やダブルクォート(”)自体を表現するには
char singq = '\'' , doubq = '\"'; // ’や”の前に¥をつける// ¥自体を表現するには、¥を2つ続ける (¥¥)
char en = '\\' ;
2-3 型の変換
今まで変数の代入や定数の代入を無意識に行って来ましたが、Javaでは変数の代入をする場合に、同じ型同士なら問題が無いのですが、型が違う変数の代入をする場合や計算をする過程により型の変換が行われる場合があります。(計算過程による型変換は演算子の方でも説明します)
型の変換には、データ型やデータ型のビットサイズにより以下の約束があります。
- 同じ整数型の場合で、ビットサイズの小さな変数を大きな変数に代入する場合は問題ないですが、逆に、ビットサイズの大きな変数を小さな変数に代入する場合は、型の変換(型キャスト)をする必要があります。このとき、代入される値が代入される側の扱える範囲値を超えていると、意図して行った場合を除き、意味のない値となります。
int idat = 100, idat2 = 1000;
short sdat, sdat2;
byte bdat, bdat2;
// 型変換を行うには、受け渡す変数の前に(変換する型)を付けます
sdat = (short)idat; // sdatは100 (short で扱える範囲値なのでOK)
sdat2 = (short)idat2; // sdat2は1000 (short で扱える範囲値なのでOK)
// コンパイルエラーは出ませんが、元のデータの情報が無くなる場合があります。
// 意図的でない場合はこの様に使用するのは、バグとなります。
bdat = (byte)idat; // bdatは100 (byte で扱える範囲値なのでOK)
bdat2 = (byte)idat2; // bdat2は1000ではない <= 意図的でなければ バグ
- 整数を実数に代入する場合は問題ないですが、逆に実数を整数に代入する場合は小数点以下のデータは捨てられます。
int idat;
double ddat = 3.14159;
idat = (int)ddat; // idat は 3 となる
- 同じ実数型の場合でビットサイズの小さな変数を大きな変数に代入する場合は問題ないですが、逆にビットサイズの大きな変数を小さな変数に代入する場合は、型の変換(型キャスト)をする必要があります。精度が低くなりますので注意しましょう。
float fdat;
double ddat = 0.12345678901234567;
fdat = (float)ddat; // 0.1234567 位までしか精度はでないでしょう型キャストの問題は、バグの主な原因となることが多いので、特にメモリを節約するプログラムでない場合は、大きなビットサイズの変数を使った方が良いでしょう。
(節約の心は捨てたくないですが、今やバグを見つける時間よりメモリの値段の方が安い)
2-4 変数の宣言場所「スコープ」
重要なのですが、以外に把握されにくいものがこの「スコープ」と言われる宣言場所により変数の有効な範囲が変わることです。
実際に色々プログラムを作って経験を積まないと、的を得た場所に宣言できないものでもあります。(今は有効範囲を意識してプログラムする癖を付けて下さい)
第3章 Javaの演算子
◎Javaにもプログラム言語として当然の十分なる演算子があります。演算子を覚え、無意識に使えるくらいになることが、「私はプログラムが分かる」と言える要となるでしょう。
もっとも重要で、いつも使う代入演算子「=」などはもう、何度も使ってますし、数値計算における演算子は中学の数学で十分理解できることですから、あまりくどい説明は要らないですね。Javaでの演算子を優先順位も含め表にすると以下となます。
優先順位とは数学で言えば掛け算と足し算が一緒になった計算があると、掛け算の方を先に計算することと同じです。当然カッコ()が付けば、()が付いた方が計算する優先順位が上がります。
優先度 演算子 備考 1高い方 . [ ] ( ) 2 ++ -- ! ~ インクリメント、デクリメント、否定、1の補数 3 * / % 乗算、除算、剰余算 4 + - 加算、減算 5 << >> >>> 左シフト、右シフト、符号ビットを保存しない右シフト 6 < > <= >= より小さい、より大きい、以下、以上 7 == != 等しい、等しくない 8 & ビット論理積(AND) 9 ^ ビット排他的論理和(XOR) 10 | ビット論理和(OR) 11 && 論理積 12 || 倫理和 13 ?: 条件演算子(三項演算子) 14 = += -= *= /= %= 他 op= op部分が上記演算子等で表現できる 15 , カンマ 筆者もこれら全てを完全に覚えているかと言うと不安になります。でも、不安なときは、優先順位の高いカッコ()を使うと良いでしょう。他の人にもプログラムが見やすくなる利点もあります。
3-1 算術演算子(単項演算子、二項演算子)
+
-
*
/
%
-マイナス符号
3-2 関係演算子及び等価演算子
<
>
3-3 論理演算子
3-4 ビット演算子
3-5 シフト演算子
3-6 代入演算子および三項演算子
3-7 条件演算子
3-8 文字列結合演算子
分からない点はメールで質問してください。hsl@hslnpo.com
間違いや不適切な点は、後で見なおしながら直しては行きますが、お気づきの点などありましたらメールで教えて下さい。
今後少しづつ記載しますので、ご了承下さい。