┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp  ┃ ┃'&┃&''*┃*''%┃%'  発行    江口昌宏 ***  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第6号 2001/11/2x  Java 試験問題(基本情報技術者試験午後平成13年秋問8)解説 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項: Windows とIE を前提としています。 拡張子を表示するに設定してください。  今回のこの号は,中級者向けです。 目安(このマガジンでの分類)  初級者 初級シスアドに合格して,次に基本情報を受験しようかなと思ってい る人。エクセルの数行のマクロなら組んだことある。  中級者 なんらかのプログラム言語の教育を学校で受けた,仕事でやっている。  上級者 基本情報技術者試験をJavaで受験して合格する水準  仕事でJavaを使用している職場では,このメールマガジンの上級者が,その会 社では初心者レベルでしょう。 ------------------------------------------------------------------------ 試験が終わって  読者のみなさんの中には,この前の秋の情報処理技術者試験をJavaで受験され たかたも多い思います。私の予想(JavaPress vol 14)では,アルゴリズムが出題 でしたが,と大幅に違って,文法問題が中心でした。  文法を問うた問題としてみてみると,なかなかの良問です。この問題を解説す ることで,いい文法の解説ができます。  試験終了後,日も浅いので,記憶が確かなうちに復習しておきます。今回の 号は,前回の試験の問8を解説します。次号は,問12を解説を予定しています。  初心者の方には,この号,次の号と難しい内容になります。  まずは,試験問題をご覧ください。 ------------------------------------------------------------------------ ▼ 試験問題  問題文をメール形式に変更するにあたって,意味を同一に保ったまま,改行と 図等,一部変更する場合があります。 問8  次の Java プログラムの説明及びプログラムを読んで,設問に答えよ。 [プログラムの説明]  プログラムは,ある衣料小売業 A 社の在庫管理システムで使用するクラスとそ のテスト用クラスからなる。現在 A 社で取り扱う商品はスラックス(Slacks)と ジーンズ(Jeans)であり,両方に共通な属性である品番 (code),サイズ (size) 及 び色 (color) は抽象クラス Pants で定義する。サイズ及び色については,それぞれの 属性値が引数の値と等しいかどうかを判定するメソッドとして sizeIs 及びcolorIs を定義する。  ジーンズ(Jeans)は,打ち合いボタン留めであるかファスナー留めであるかを示 す属性(buttonFront)をもつ。  テスト用クラスのメソッドmainを実行すると,次の実行結果を得る。 S1, 31, Black S2, 31, Black J1, 32, Black, zipper J2, 34, Blue, button true true false false 図 実行結果 [プログラム] public class TestPants { // テスト用クラス public static void main(String[] args){ Pants[] pants = { new Slacks("S1", 31, "Black"), new Slacks("S2", 31, "Black"), new Jeans("J1", 32, "Black", false), new Jeans("J2", 34, "Blue", true), }; String black = new String("Black"); for (int i=0; i < pants.length; i++){ System.out.println(pants[i]); } System.out.println(pants[0].sizeIs(31)); System.out.println(pants[1].colorIs(black)); System.out.println(pants[2].sizeIs(30)); System.out.println(pants[3].sizeIs(31)); } } abstract class Pants{ String code; int size; String color; Pants(String code, int size, String color){ this.code = code; this.size = size; this.color = color; } public boolean sizeIs(int size){ return [  a  ]; } public boolean colorIs(String color){ return [  b  ]; } public String toString(){ return code + ", " + size + ", " + color; } } class Slacks extends Pants{ Slacks(String code, int size, String color){ super(code, size, color); } } class Jeans extends Pants{ boolean buttonFront; Jeans(String code, int size, String color, boolean buttonFront){ [  c  ]; this.buttonFront = buttonFront; } public String toString(){ return [  d  ]; } } 設問 プログラム中の [   ] に入れる正しい答えを,解答群の中から選べ。 a, b に関する解答群  ア this.size = size  イ this.size == size  ウ this.size.equals(size)  エ this.color = color  オ this.color == color  カ this.color.equals(color) c に関する解答群  ア super()  イ super(buttonFront)  ウ super(code,size,color)  エ super(code,size,color,buttonFront) d に関する解答群  ア code + "," + size + ", " + color  イ code + ", " + size + ", " + color + ", " + buttonFront  ウ super.toString() + ", " + buttonFront  エ super.toString() + ", " + (buttonFront ? "button" : "zipper") ------------------------------------------------------------------------ ▼ 問題を解こう  今日は,まず,文法の解説は軽めにして,問題を解くことを優先します。  プログラム問題の解くコツとしては,プログラムソースを分析する前に,設問 から,さらに,問題文からアプローチします。 ------------------------------------------------------------------------ ▼ 設問1 a と b を考える  解答群を最初に見てみます。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ 設問 プログラム中の [   ] に入れる正しい答えを,解答群の中から選べ。 a, b に関する解答群  ア this.size = size  イ this.size == size  ウ this.size.equals(size)  エ this.color = color  オ this.color == color  カ this.color.equals(color) △△△ ----- 引用終了 -------------- △△△  解答群をみると,同値かどうかを判断していると分かります。  Java は,c と同様,比較するときは,== を使用します。".equlas" は,Java において,参照型変数(インスタンスを含む)を比較するときの使用するメソッ ドです。Jマガでは,しばらく,メソッドをオブジェクト(クラス,インスタンス) が持つ関数と定義します。できるだけ,メソッドという用語を使用せずに説明し す。  ここで,Java の変数の種類を確認します。変数の型は,基本型と参照型に分類 されます。  変数の型 基本型 整数型,浮動小数点型,文字型,論理値型 参照型 文字列型,配列型,インスタンス型,インターフェース型  基本型は,単純な型で,参照型は,なんらかの特殊な構造を持った型です。よっ て,基本型の変数は,単純に同値かどうか判断できます。しかし,参照型は,例 えば配列の例でいえば,すべての配列を順に比較するなど,特定の操作が必要に なります。その同値かどうかを判断する操作を,クラス内に equlas という関数 で定義してあります。  基本型は,同値かどうかを,if (a==b) { }のようにかけますが,参照型は, if(a.equals(b)) { }のように,equals 関数を利用して同値かどうかを判断しま す。  解答群に登場している"this."は,this.xxx と書かれると,「まさに実行しているここのインスタンスにあるxxx」という意味です。  関連する問題文のソースをみてみます。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ abstract class Pants{ String code; int size; String color; Pants(String code, int size, String color){ this.code = code; this.size = size; this.color = color; } public boolean sizeIs(int size){ return [  a  ]; } public boolean colorIs(String color){ return [  b  ]; } public String toString(){ return code + ", " + size + ", " + color; } } △△△ ----- 引用終了 -------------- △△△  変数定義のところをみると, int size; String color;  とありますので,size の同値かどうかは,== です。String は,参照型の変数 型ですので,同値かどうかの判断は,equals を利用することわかります。 解答 a:イ,b:カ ------------------------------------------------------------------------ ▼ c を解く  こちらも解答群から見てみます。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ c に関する解答群  ア super()  イ super(buttonFront)  ウ super(code,size,color)  エ super(code,size,color,buttonFront) △△△ ----- 引用終了 -------------- △△△  super というのは,継承している自分の親クラスを指します。super.m1() とあ れば,親クラスの m1 関数という意味です。super だけで,関数名名が無いとき は,生成子(コンストラクタ)という特殊な関数を指します。生成子は,主記憶上 にそのインスタンスのエリアを確保します。  superの生成子(コンストラクタ)使うのは,子クラスの生成子の中です。  問題文を確認しましょう。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ class Jeans extends Pants{ boolean buttonFront; Jeans(String code, int size, String color, boolean buttonFront){ [  c  ]; this.buttonFront = buttonFront; } (省略) } △△△ ----- 引用終了 -------------- △△△  c の空欄のところは,Jeans( ) の中にあります。Jeans クラスの中にある, Jeans() ですので,同一名ですので,Jeans クラスの生成子であるということが 分かります。生成子の名前は,クラス名と同一という規則があります。(コラム 参照)  [ c ]の下に,  this.buttonFront = buttonFront;  とありますので,buttonFront 以外の引数を[ c ]で親クラスの生成子に渡 していると判断できます。 解答 ウ super(code, size, color) ------------------------------------------------------------------------ ▼ 設問1 d を考える  解答群を見ます。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ d に関する解答群  ア code + "," + size + ", " + color  イ code + ", " + size + ", " + color + ", " + buttonFront  ウ super.toString() + ", " + buttonFront  エ super.toString() + ", " + (buttonFront ? "button" : "zipper") △△△ ----- 引用終了 -------------- △△△  toString() と "", +, から,文字列の合成が話題になっていることが分かりま す。文字列同士の結合は,単純に "+" を利用することで可能です。  該当するプログラムリストを見てみましょう。 ▽▽▽ ----- 問題文から引用開始 ----- ▽▽▽ class Jeans extends Pants{ boolean buttonFront; Jeans(String code, int size, String color, boolean buttonFront){ [  c  ]; this.buttonFront = buttonFront; } public String toString(){ return [  d  ]; } } △△△ ----- 引用終了 -------------- △△△  空欄d は,Jeans クラスからできたインスタンスが保持している情報を文字列 で表現する関数,toString の一部です。  toString は,親クラスの Pants クラスにもあるので,その差分を定義すれば いいです。Pants クラスとJeans クラスの差は,buttnFront というブール型の変 数です。解答は,次の二つに絞れます。  ウ super.toString() + ", " + buttonFront  エ super.toString() + ", " + (buttonFront ? "button" : "zipper")  ウの書き方だと,True か False が表示されてしまいます。"button" あるい は,"button" や "zipper" を出したいときは, buttonFront ? "button" : "zipper" とやります。  これは,C言語から引き継いだ,真偽演算子の?です。真偽演算子は,次のよう に使用します。  a==b ? "a=bです", "a<>bです";  よって,解答は 解答 エ super.toString() + ", " + (buttonFront ? "button" : "zipper") ------------------------------------------------------------------------ ▼ 動作可能な完全なプログラム ファイル名を,TestPants.java で保存してください。ぜひ,コンパイルして, 実行して見てください。 表示される文字列"S1", "Black"等,漢字にして実行すると分かりやすいですよ。 public class TestPants { public static void main(String[] args){ Pants[] pants = { new Slacks("S1", 31, "Black"), new Slacks("S2", 31, "Black"), new Jeans("J1", 32, "Black", false), new Jeans("J2", 34, "Blue", true), }; String black = new String("Black"); for (int i=0; i < pants.length; i++){ System.out.println(pants[i]); } System.out.println(pants[0].sizeIs(31)); System.out.println(pants[1].colorIs(black)); System.out.println(pants[2].sizeIs(30)); System.out.println(pants[3].sizeIs(31)); } } abstract class Pants{ String code; int size; String color; Pants(String code, int size, String color){ this.code = code; this.size = size; this.color = color; } public boolean sizeIs(int size){ return this.size == size; } public boolean colorIs(String color){ return this.color.equals(color); } public String toString(){ return code + ", " + size + ", " + color; } } class Slacks extends Pants{ Slacks(String code, int size, String color){ super(code, size, color); } } class Jeans extends Pants{ boolean buttonFront; Jeans(String code, int size, String color, boolean buttonFront){ super(code, size, color); this.buttonFront = buttonFront; } public String toString(){ return super.toString() + ", " + (buttonFront ? "button" : "zipper"); } } ------------------------------------------------------------------------ ▼ コラム:生成子(コンストラクタ)は,返値がない?  public static void main(String[] args) { 省略 }  のmain関数のように,返値がない場合,void を付けました。  数学的に言えば,関数は,  y = sin(x) のように,x が引数で,sin が関数名,y が帰値です。この帰値 が無い場合,kaeritinasikannsuu(x) があった場合,  void kaeritinasikannsuu(x) と書きます。  今日の問8の例で, abstract class Pants{ String code; int size; String color; Pants(String code, int size, String color){ this.code = code; this.size = size; this.color = color; } public boolean sizeIs(int size){ return this.size == size; } (省略) }  に,2つの関数,Pants( ) とsizeIs( )が定義されています。下の sizeIs( )は, 返値が,boolean です。Pants( )は,返値がありません。この Pants( ) は, クラス名と同一ですので,生成子と呼ばれる特殊な関数(メソッド)で,返値を 省略されるとされています。  『Java言語仕様 第2版』p181 によると,「コンストラクタ宣言は結果型を持 たないメソッド宣言と良く似たものとなっている」と書かれています。そのため か,多くの Java を説明した書籍では,生成子(コンストラクタ)は,辺値を省 略すると説明されています。  sizeIs() のような一般的な関数(メソッド)と生成子(コンストラクタ)の 使用例を見てみましょう。Pants() のいい例がありませんので,代わりに, Stringクラスの生成子である,String() の例をみます。 一般的な関数 sizeIs()の使用例 System.out.println(pants[0].sizeIs(31));  これは,TrueかFalseが表示されます。 生成子(コンストラクタ) Stirng() の使用例 String black = new String("Black");  これは,"Black"という文字列を中身として,主記憶上に文字列のインスタンス を black という名前で生成(コンストラクト)します。  black は,文字列のインスタンスですので,代入できるのは,文字列だけです。 ということは,new String( ) は,文字列になります。実際に"Black"という文字 列です。実は,コンストラクタは,辺値が無いのではなくて,辺値は,そのクラ スなのです。  先の例 Pants(String code, int size, String color){ this.code = code; this.size = size; this.color = color; }  の生成子(コンストラクタ)定義は,  「コンストラクタ宣言は結果型を持たないメソッド宣言と良く似たものとなっ ている」のでは,なくて,関数名が省略されていて,結果型(返値)は,Pantsの インスタンスです。もし,関数名をつけるなら,new でしょう。  このように考えたほうが,自然ではないでしょうか? ------------------------------------------------------------------------ ▼ 次号の予定  次回は,基本情報技術者試験午後平成13年秋問12の解説をします。  感想は,斎藤まで,suehiro@he.mirai.ne.jp  広告等のお問い合わせ:*** ------------------------------------------------------------------------ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html