2002
-0613 ver 1.00 発行版
-0614 ver 1.01 誤字訂正
-0619 ver 1.10 リンク先修正
2003
-0221 ver 1.20 一部表現追加
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃.&&&& **** %%%%. JavaScript&Javaで目指そう!基本情報技術者試験 ┃
┃&&&&&&******%%%%%% 執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp ┃
┃'&┃&''*┃*''%┃%' 発行 江口昌宏 jmaga@yscon.co.jp ┃
┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
前回の発行部数 6374部 まぐまぐ:5261 melma!:699 Pubzine:414
★解除・登録 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
第18号 2002/06/13
配列と new
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
プログラムを作成する上での注意事項:
Windows98SE, SDK(JDK) 1.3.1,IE 5.5 を前提としています。
拡張子を表示するに設定してください。
------------------------------------------------------------------------
▼ 数列と配列
小さい時に,お風呂の中で,1+1は2, 2+2は4,4+4は8 と計算する遊びをしたか
もしれません。その答えだけを書くと,
2, 4, 8, 16, 32, 64, 128, 256, ...
と続きます。このように数字がつながっていて,一つのかたまりとして考える
時には,数学では数列といいます。プログラムの世界ではこれを拡張して,中身
が文字列など他のものでもよく,配列といいます。
------------------------------------------------------------------------
▼ 配列を使用しない例
JavaScript で,3つの質問に従って8つの性格を占うプログラムで,配列を使
わず書いた例です。まず,動作させて見てから,プログラムを見て下さい。
http://www.yscon.co.jp/j/java/jmaga/j18/18-01.htm のページを表示して,
「性格占い」のボタンを押して下さい。
例 j18-01.htm
http://www.yscon.co.jp/j/java/jmaga/j18/18-01.htm
性格判断
------------------------------------------------------------------------
▼ 配列を使用して書き直し
配列を使用して上のプログラムを書き直しました。
function xuranai(){} のところのみが違いますので,他は省略します。
例 j18-02.htm
http://www.yscon.co.jp/j/java/jmaga/j18/18-02.htm
性格判断 配列使用
------------------------------------------------------------------------
▼ 配列の宣言
配列を使用するときは,事前に宣言をする必要があります。以下の部分が配列
の宣言の部分です。
xque = new Array(3);
xans = new Array(3);
xseikaku = new Array(8);
new と Array は,キーワードです。Array は,配列という意味のの英語です。
new は,日本でもおなじみの「新しい」です。( ) の中は,配列の構成要素の数
です。
xque = new Array(3);
は,「Array の新しいインスタンスを3つ作成して,それを xque と名付ける」
です。Java では,配列の宣言の仕方が少し違います。上と同じ例であれば,文字
列型が3つということで,
String xque[] = new String[3];
となります。「String クラスの新しいインスタンスを3つ作成して,それを,
String 型の配列 xque と名付ける」
JavaScript は,変数の型を実行時に動的にどんどん変化させます。一方,Java
は,コンパイル時に型を明確にしておく必要があります。そのため,配列の宣言
は,JavaScript では,型名を使わず,Array で代用しており,Javaでは,型名を
明示しています。
配列の要素の数を JavaScript では,Array(3) と () を使用しており,Java
では,String[3] と [] をを使用しています。配列をプログラム内で使用する時
は,
xque[0] = "お金がある?";
のように,xque[] を使用しているため,宣言時に [] を使うJava の方が自然
な書き方と言えます。JavaScript では,Arrayに引数である 3 を渡すという感じ
です。これは,メソッド(関数)の書き方です。
JavaScript と Java では,このように配列の宣言において違いがあります。ま
た別の号で詳しく扱います。
------------------------------------------------------------------------
▼ new と参照型変数
数値などの変数は,JavaScript では宣言せずに使用でき,また,宣言しても
var xi = 0; のように new は,使用しません。また,Java でも,int xi = 0;
で宣言でき,すぐに使用可能です。JavaScript も Java も数値などの変数を宣言
するときは,new は,使用しません。new は,配列やオブジェクトを宣言するとき
に使用します。次のようになります。
xque = new Array(3);
整数などの変数は基本型と呼ばれています。一方,配列やオブジェクトの場合
は,参照型と呼ばれます。基本型の変数の場合,一つの変数に必要になるバイト
数は固定で,長整数でもたかだか8バイトです。一方,配列やオブジェクトは,
一定の大きさでなく,莫大な量になる可能性があります。そのため,参照型(配
列やオブジェクト)は,new という予約語を設定して,変数の宣言,つまり,主
記憶上にエリアを特別に確保します。
Java において,Stringクラスは例外で,宣言時に new を使用しなくても宣言
できます。そのため,String クラスは,基本型のように見えます。
------------------------------------------------------------------------
▼ エンジン部とデータ部に分離
配列を使用することのメリット,デメリットを見ていきましょう。
//質問
xans1 = prompt("お金がある?", "y");
xans2 = prompt("恋人いる?", "y");
xans3 = prompt("将来が見えてる?", "y");
の部分は,配列を使用することで
//質問データ
xque[0] = "お金がある?";
xque[1] = "恋人いる?";
xque[2] = "将来が見えてる?";
と
//質問
for(i=0;i<3;i++){
if (prompt(xque[i], "y") == "y"){
xans[i] = 1;
}
}
に分離しました。この分離は,質問のロジックとデータを分離したと言えます。
質問のロジックは,データを燃料してくるくる回るエンジンにあたります。ロジッ
ク部分をエンジン部,質問データの方をデータ部ということにします。エンジン部
とデータ部を分離するやり方は,エンジン部ではデータが変数で表現されているの
で,間接法の一種と言えます。
エンジン部とデータ部を分離することで,プログラム内のモジュールの独立性
が高まります。質問事項や性格を変更するときは,データ部のみに変更が集中し
て管理がしやすくなります。また,同じデータであってもエンジン部のみ改善す
ることで,操作性をよくすることできます。
配列を用いることで,エンジン部とデータ部の分離がしやすくなったと言えま
す。これは大きなメリットです。
------------------------------------------------------------------------
▼ 配列を用いるとプログラムサイズが小さくなる
配列を使用しないプログラムと配列を使用したプログラムを比較すると歴然で
すが,配列を使用するとプログラムのソースリストが短くなります。
//ポイント計算
xsei = 0;
if (xans1 == "y"){
xsei = 1;
}
if (xans2 == "y"){
xsei = xsei + 2;
}
if (xans3 == "y"){
xsei = xsei + 4;
}
が,
// ポイント計算
xsei = xans[2]* 4 + xans[1]*2 + xans[0];
とコメントを入れて2行になりました。これは配列を使用しなくても,工夫すれ
ば可能です。しかし,配列を使用することで,簡単に書くことができます。
性格表示のところも同様です。
//性格表示
if (xsei==0){
alert("性格0を表示");
}
if (xsei==1){
alert("性格1を表示");
}
if (xsei==2){
alert("性格2を表示");
}
if (xsei==3){
alert("性格3を表示");
}
if (xsei==4){
alert("性格4を表示");
}
if (xsei==5){
alert("性格5を表示");
}
if (xsei==6){
alert("性格6を表示");
}
if (xsei==7){
alert("性格7を表示");
}
が,
//性格表示
alert(xseikaku[xsei]);
になります。配列の要素を使うことで,プログラム内で繰り返しかかれている
ことが,単純に表現できます。これも配列を使用するメリットです。
------------------------------------------------------------------------
▼ 配列を用いると分かりにくくなる
上で見たように配列の利用の仕方は,間接法の一つです。間接法の欠点は,抽
象度が高くなり,その分,具体性が薄くなり分かりにくくなります。
//性格表示
alert(xseikaku[xsei]);
と書くより,
//性格表示
if (xsei==0){
alert("性格0を表示");
}
if (xsei==1){
alert("性格1を表示");
}
if (xsei==2){
alert("性格2を表示");
}
if (xsei==3){
alert("性格3を表示");
}
if (xsei==4){
alert("性格4を表示");
}
if (xsei==5){
alert("性格5を表示");
}
if (xsei==6){
alert("性格6を表示");
}
if (xsei==7){
alert("性格7を表示");
}
と書くと,8通りの性格が,直接,意味がのある言葉として,xsei の値に従って,
表示されます。直感的に理解できます。
配列を使用することで,抽象度が上がり,具体性が減ります。それによって分か
りになります。これはデメリットです。
この抽象度が上がり,分かりにくなるのですが,一方では,より数式化が進む,
数式としての分かり易さ,操作し易さがが生まれます。数式のイメージまで,抽
象度が上がると逆に分かりやすくなるという逆転現象が発生します。
------------------------------------------------------------------------
▼ 配列は,繰り返しを内蔵する
上の例で単純になったところを見てもらうと,同じようなプログラムが繰り返
されているところが,配列を使用することで,すっきりと書かれたことが分かる
と思います。
配列は,同じようなデータが存在する場合,それをひとかたまりとして,名前を
つけて,要素番号で,一つ一つを区別します。これは,プログラムのロジックの
繰り返しが,配列の内部での要素の繰り返しに閉じこめられたことになります。
そのため,プログラム上の繰り返し現れるところが,配列を利用することで,そ
の複雑さが配列に移動して,プログラム自体がシンプルになります。ただ,配列
を使用する場合,間接法ですので,抽象度があがり修正しやすくなりますが,直
感的ではなくなります。それを防ぐためには,配列の名称や,使い方,要素の並
べ方など,できるだけパターン化して利用するといいでしょう。数学の公式のよ
うにするということです。
------------------------------------------------------------------------
▼ 次号の予定
生成子
感想は,斎藤まで,suehiro@he.mirai.ne.jp
広告等のお問い合わせ:jmaga@yscon.co.jp
------------------------------------------------------------------------
▼ 誤字・脱字等の修正,プログラムの修正など,以下の場所で確認できます。
過去の修正版等
http://www.mirai.ne.jp/~suehiro/java/jmaga/
登録・削除および広告の案内
http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html
------------------------------------------------------------------------
▼ 著作権について
このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ
フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。
本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を
必要とします。
広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html
------------------------------------------------------------------------
▼アンケート(以下を返信してください)
この号のJマガは役立ったあるいは勉強になりましたか?
該当するものだけ残してください。
5: 大いに,YES
4: YES
3: 普通
2: NO
1: 大いに,NO
その他