• 検索結果がありません。

これらプログラムの 実 行 は 普 通 はハードウェア 上 で 行 うのですが Java の 場 合 は 特 殊 なことを 行 っています 難 しい 理 屈 はここでは 説 明 しませんが ハードウェア 上 で 直 接 動 作 するのではなく ソフトウェアで 実 現 された 仮 想 のハードウェアが

N/A
N/A
Protected

Academic year: 2021

シェア "これらプログラムの 実 行 は 普 通 はハードウェア 上 で 行 うのですが Java の 場 合 は 特 殊 なことを 行 っています 難 しい 理 屈 はここでは 説 明 しませんが ハードウェア 上 で 直 接 動 作 するのではなく ソフトウェアで 実 現 された 仮 想 のハードウェアが"

Copied!
44
0
0

読み込み中.... (全文を見る)

全文

(1)

1 Java の基礎知識

1.1 プログラミング

「プログラミング(programming)」とは、「プログラム(program、ある一連の処 理をコンピュータへ指示するもの)を作成すること」をいいます。このプログラムを記 述(コーディング、coding)する際に使用する専用の言語を「プログラミング言語 (programming language)」といいます。プログラミング言語を使って記述されたプログ ラムを「ソースコード(source code)」と呼び、普通はテキストファイルに保存します。 ソースコードが保存されたファイルを「ソースファイル(source file)」と呼びます。

1.2 コンパイル

「Java 言語」とは、プログラミング言語の一種です。Java 言語を使うと、人間にと って比較的分かりやすくプログラムを記述できます。Java 言語のように人間が解釈しや すい言語を「高級言語」または「高水準言語」と呼びます。Java 言語で書かれたプログ ラムは、人間にとっては読みやすいのですが、2 進数値しか解釈できないコンピュータ では、そのまま実行できません。 コンピュータが実行できるようにするためには、ソースコードに対して「コンパ イル(compile)」という処理を行い、「オブジェクトコード(object code)」と呼ばれる ものを生成します。このコードは、コンピュータが解釈・実行できるものです(図1)。 図1 コンパイル オブジェクトコードは、コンピュータが解釈・実行できるものです。Java の場合、 オブジェクトコードを「Java バイトコード(byte code)」と呼びます。オブジェクトコ ードは、「バイナリファイル(binary file)」として保存されます。Java の場合、そのフ ァイルを「クラスファイル(class file)」と呼びます。

1.3 プログラムの動く

実際にこのプログラムを動作させるには、補助記憶装置(通常は、ハードディスク) に保存されているファイルを読み込んで主記憶装置(メインメモリ)へロード(load) して実行させます(図 2)。 図 2 プログラムを実行

(2)

これらプログラムの実行は、普通はハードウェア上で行うのですが、Java の場合 は特殊なことを行っています。難しい理屈はここでは説明しませんが、「ハードウェア 上で直接動作するのではなく、ソフトウェアで実現された仮想のハードウェアがあって、 その上で動作する」と覚えておいてください(仮想 のハードウェアを「Java 仮想マシ ン(Java Virtual Machine)」と呼びます)。Java Virtual Machine は、JVM と略されま す。

1.4 Eclipse でコンパイルをやってみる

前の説明にとおり、HelloWorld クラスを作ったら、Java のワークスペースの中 (…¥pleiades¥workspace¥helloworld¥src¥helloworld)に HelloWorld.java というファイルとし て保存します。これは Java のソースファイルです。 Eclipse でプログラムを実行すると、バイトコードを生成します。保存場所 (…pleiades¥workspace¥helloworld¥bin¥helloworld)で HelloWorld.class が見えます。これ は生成した Java バイトコードです。

(3)

2 Java プログラミング基礎

2.1 Java プログラムの基本形

作成した HelloWorld プログラをみながら、Java のプログラムの基本形について見 ていきましょう。 コンソール上で実行可能な Java4 のプログラムを作るには次のような形でコードを 記述します。 class HelloWorld { ① ② ③

publicstaticvoid main(String[] args) { ④ ⑤

System.out.print("Hello World!") ; ⑥ ⑦ } ⑤ } ③

2.1.1 Class クラス宣言

Java のプログラムは、ほとんどの場合 class【プログラム名】という形で書き始め ます。Class は「クラス」と読み、Java のプログラムの1つの単位を表すものです。 このようにしてプログラムを書き始めることを、「クラスの宣言」と呼びます。

2.1.2 HelloWorld クラス名

Java のクラスには1つひとつ固有の名前をつけてやります。この名前のことをクラ ス名と言います。クラス名には半角英数字、及びいくつかの記号が使えますが、クラス 名の先頭は英字もしくは$、_のいずれかで始める必要があります。また、Java プログ ラマの間の暗黙の了解として、クラス名の先頭、及び単語の区切りを大文字にすること になっています。

2.1.3 { … } クラスの範囲

どこからどこまでが「クラス」の範囲なのかを示すため、クラス宣言文からプログ ラムの末尾までを{ }で囲みます。

2.1.4 Public static void main(String[] args) メソッド宣言

そのプログラムが持つ機能、つまり「動作」にあたるものは、メソッドという形で 定義します。

(4)

まず「クラス」という大きな殻を作り、そのあとに「動作」をつかさどるメソッド を入れていくようなイメージです。 コンソール画面上などで動作するプログラムを作るときには、常にこのような形で main という名前のメソッドを宣言し、この中にプログラムの内容を書き込んでいきま す。 このようなメソッドを main メソッドと呼びます。

2.1.5 { … } メソッドの範囲

クラスと同様、メソッドも始まりと終わりを中カッコで囲みます。「ここからここ までがメソッドです」ということ示すためです。 始まりのカッコと終わりのカッコが正しく対になっていないと、プログラムは正し くコンパイルされません。

2.1.6 System.out.println(“Hello World !”); 命令文

コンピュータに実行させたい作業の内容は、命令文として記述していきます。命令 文にはいろいろなものがあり、それぞれに書き方が決めっています。 ここに登場しているのは」、「画面上に Hello World と表示しなさい」という意味の 命令文です。これを一般に println メソッドと呼んでいます。 画面上になんらかのメッセージなどを表示させたいときは、println メソッドを使っ て、次のような形で命令文を記述します。 System.out.println(“[表示させたいメッセージの内容]”); ()のなかには、表示させたいメッセージの内容を””(半角)で括って書き込みます。 例えば「こんにちは」と表示させたい場合は、次のようになります。 System.out.println(“こんにちは”); 2.1.7 命令文の終了のしるし 命令文の終わりには、「この命令はここで終わりです」ということを示すために;(半 角セミコロン)を記述します。Println メソッドなどの命令文を1行書いたら、忘れずに セミコロンを入力しておきましょう。 ただし、クラス宣言文やメソッド宣言文、中カッコなどの行にはセミコロンは不要 です。

(5)

2.2 Java のコメント

プログラムを作成していく時に、このメソッドはどんなメソッドなのかや誰がいつ 記述したものなのかといった情報を残しておくと後で見なした時に便利です。このよう にプログラムの中に説明を記述する時に使うのがコメントです。 コメントはプログラムが実行される際に無視されますのでプログラムの動作には 何の影響もしません。 2.2.1 1行コメント プログラム中に「//」が現れた場合「//」から行末までをコメントとして扱います。 「//」は行の先頭に記述しその行を全てコメントとしてもいいですし、行の途中で記述 してその位置より右側をコメントとしてもいいです。 // 作成日 09.02.09 class sample{

public static void main(String args[]){

System.out.println("こんにちは"); // 画面出力 } } 2.2.2 ブロックコメント プログラム中に「/*」が現れた場合、次に「*/」が現れるまでの部分を全てコメン トとして扱います。この形式を使う場合には複数行に渡ったコメントを記述することが できます。 /* 作成日 09.02.09 バージョン 1.0.3 クラス名 sample */ class sample{

public static void main(String args[]){

System.out.println("こんにちは"); /* 画面出力 */

} }

(6)

2.3 Java の識別子

識別子とは、今まで出てきたクラス名やメソッド名、これから出てくる変数名など を識別するための名前です。

識別子のルール:

 使える文字は a~z , A~Z , 0~9 , _(アンダーバー) , $ (例) name, old, no32

 0~9 先頭の文字に使えない (例) 12point などは×  Java の予約語(キーワード)と同名は不可 (例) char や class などの予約語は使用できない  大文字と小文字は識別される (例) old と Old は別の変数

2.4 Java の予約語

Java の言語仕様として何らかの意味を持つ単語を予約語として登録してあります。 例えば条件分岐を記述する時に使用される「if」などが予約語です。今後変数やクラス などの名前を自分で付ける時には Java の予約語は使用することができません。 予約語の一覧は次の通りです。

abstract assert boolean break byte

case catch char class const

continue default do double else

enum extends final finally float

for goto if implements import

instanceof int interface long native

new package private protected public

return short static strictfp super

switch synchrnized this throw throws

transient try void volatile while

なお下記の 3 つは予約語ではなく予め用意された定数です。

(7)

2.5 Java の定数値(リテラル)

リテラル(英: literal)は、「文字どおり」「字義どおり」を意味する語である。プ ログラムの中には、定数値という意味です。 各データ型のリテラルを、型名を先頭につけて「文字列リテラル」「整数リテラル」 「日付リテラル」などと呼びます。 Java で定数値(固定の値、即値)を表現するには、以下のようにします。 リテラル名 形式 整数リテラル 数 ・「0」で始めると八進数 ・「0x」で始めると十六進数 ・「0b」で始めると二進数(JDK1.7 以降) int 123 0173 0x7b 0b1111011 ・末尾に L を付けると long 型 long 123L 浮動小数リテラル 小数点付きの数 double 123.0 ・末尾に F を付けると float 型 ・末尾に D を付けると double 型 float double 123f 123d 文字リテラル シングルクォーテーションで囲む。 char 'A' 文字列リテラル ダブルクォーテーションで囲む。 String "abc"

論理値リテラル true 又は false boolean true

false 空リテラル null 空型 null  特殊な文字の入力(エスケープシーケンス) 文字と文字列を値として使用する場合、キーボードから入力できないような文字が あります。例えば改行です。文字列の中で改行をキーボードから入力した場合は次のよ うになります。 class sample{

public static void main(String args[]){ System.out.println("こんにちは お元気ですか"); } } 上記の例では「こんにちは」と「お元気ですか」の間で改行を入力しようとしまし たがキーボードで「Enter」キーを押してもプログラムが改行されるだけです。

(8)

そこで改行などキーボードから入力できない文字などは「¥」+特定の文字の組み 合わせで表現します。例えば改行は「¥n」という「¥」と「n」の組み合わせによって表 すことができます。

class sample{

public static void main(String args[]){

System.out.println("こんにちは¥n お元気ですか"); } } 上記では「こんにちは」と「お元気ですか」の間に「¥n」が記述されています。「¥n」 は改行を表しますので実際に実行してみるとダイアログが開き次のように表示されま す。 このようにキーボードから入力できない文字を他の文字の組み合わせで表現した ものをエスケープシーケンスといいます エスケープシーケンス 意味 ¥b バックスペース ¥f 改ページ ¥n 改行 ¥r 復帰(行頭にカーソルを戻す) ¥t 水平タブ ¥¥ 「¥」 ¥' 「'」 ¥" 「"」

(9)

2.6 Java の変数

2.6.1 変数とは 変数とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し 必要なときに利用できるようにするために、データに固有の名前を与えたものである。 変数は値を保存しておくための箱のようによく言われます。この箱には数値や文字 列などの値を保存することができ、そしていつでも取り出したり改めて違う値を保存す ることができます。 2.6.2 変数のデータ型 変数宣言するときには変数名と同時に変数のデータ型を指定する必要があります。 型にはプログラマが拡張できない基本型(プリミティブ型)と、プログラマが拡張 できる参照型(リファレンス型)があります。 整数型(byte,short,int,long) 数値型 浮動小数点数(float,double) 基本型(プリミティブ型) 文字(char) boolean 型(boolean) データ型 クラス(class) 参照型(リファレンス型) インターフェース(interface) 配列 変数 変数 整数 文字 整数 文字

(10)

整数や浮動小数点数、そして文字などです。Java で用意されているデータ型は次の 通りです

データ型 メモリ領域をどのような値に使用するか(取り得る値)

boolean true or false

char 16 ビット Unicode 文字 ¥u0000~¥uFFFF

byte 8 ビット整数 -128~127 short 16 ビット整数 -32768~32767 int 32 ビット整数 -2147483648~2147483647 long 64 ビット整数 -9223372036854775808~9223372036854775807 float 32 ビット単精度浮動小数点数 double 64 ビット倍精度浮動小数点数

2.7 メソッドとフィールド

計算機に必要なものは加算や減算といったデータを処理する「機能」と、計算対象 や計算結果などの「データ」に分けることができます。Java では「機能」をメソッドと 呼び「データ」をフィールドと呼びます。 クラスには、そのクラスから作り出されるモノが持つ機能(メソッド)とデータ(フィ ールド)を記述していきます。 class クラス名{ フィールド 1 フィールド 2 ... メソッド 1 メソッド 2 ... } どんなメソッドとフィールドを用意するかでそのクラスから作り出されるものが 決まります。目的の処理を行わせるために、適切なメソッドとフィールドを設計しなけ ればなりません。

(11)

2.7.1 メソッド メソッドの書式は次のようになっています。 [修飾子] 戻り値のデータ型 メソッド名(引数 1, 引数 2, ....){ } ここでは詳しく解説はいたしませんが、メソッドは呼び出す時、単に呼び出すだけ ではなく値を指定することもできます。例えテレビに対して「チャンネルを変えろ」と いうメソッドを呼び出すことも出来ますが、「チャンネルを"1"に変えろ」と何か値を指 定して呼び出す場合もあります。また「現在のチャンネルを教えろ」というメソッドを 呼び出せばテレビが持っているデータを参照して呼び出し元に値を返してきます。 ここでは説明のために一番簡単な構成のメソッドを見てみます。 void メソッド名(){ } 引数も戻り値もないメソッドです。クラスの場合「{」から「}」の間にメソッドや フィールドを記述しましたが、メソッドの場合も「{」から「}」の間にメソッドが行い たい処理を記述します。 では挨拶だけをする簡単なクラスを作成してみます。 class Robot{ void hello(){ System.out.println("こんにちは"); } void bye(){ System.out.println("さようなら"); } }

Robot クラスの中に hello メソッドと bye メソッドを用意しました。hello メソッド は呼び出されると「こんにちは」と表示します。また bye メソッドは呼び出されると「さ ようなら」と表示します。このように必要な機能をメソッドとして追加しくことで、そ のクラスから作成されるモノが持つ機能が増えていくことになります。

(12)

2.7.2 フィールド フィールドの書式は次のようになっています。 [修飾子] データ型 変数名; ここでは詳しく解説はいたしませんが、フィールドには変数を記述します。変数と いうのは値を一時的に保管する場所のことで、値のデータ型と名前を指定します。デー タ型とは値の種類のことで例えば数値とか文字列などがあります。名前は保管場所を識 別するために付けられた名前です。 例えば次のように記述します。 int old; String name; 整数を扱う old という名前の変数と、文字列を扱う name という名前の変数を記述 しました。 では数値をカウントするクラスを作成してみます。 class Counter{ int num; void init(){ num = 0; } void count(){ num = num + 1; } void printNum(){ System.out.println(num); } } Counter クラスの中に 1 つのフィールドと 3 つのメソッドを用意しました。init メソ ッドを呼び出すと num 変数に 0 を格納し、count メソッドを呼び出すと num 変数に格納 されている値に 1 を加えて再度 num 変数に格納します。そして printNum メソッドを呼 び出すと num 変数に格納されている値を出力します。 このようにフィールドは同じクラスのメソッドによって値を設定したり取り出し たりして使われます。 メソッドもフィールドも詳細に説明するのはまた別のページで行いますので、ここ ではどのように使われるのかを覚えておいてください。

(13)

2.8 Java の演算子

算術演算子 算術演算子は数値を計算する場合に使用します。次のようなものが用意されていま す。 演算子 使用例 意味 + a + b a に b を加える - a - b a から b を引く * a * b a に b をかける / a / b a を b で割る % a % b a を b で割った余り  単項マイナス演算子 単項演算子は数値の正と負を反転させるために使用します。次のようなものが用意 されています。 演算子 使用例 意味 + +a a の正負をそのまま - -a a の正と負を反転  インクリメント・デクリメント演算子 演算の中でも数値を 1 つだけ増加することと 1 つだけ減少させる処理は比較的多く 使用されます。「+」演算子や「-」演算子を使って記述すると次のようになります。 int num = 7; num = num + 1; 変数「num」に代入されている値と 1 を加算し、その結果を改めて変数「num」に 格納しています。1 つだけ減らす場合も「-」演算子を使って同じように記述することが できます。 このように 1 だけ増加する、又は 1 だけ減算するために用意された演算子がインク リメント演算子(++)とデクリメント演算子(--)です。 演算子 使用例 意味 ++ a++ 又は ++a a の値を 1 増加する -- a-- 又は --a a の値を 1 減らす

(14)

例えば先ほどの例は次のように書き換えることができます。 int num = 7; num++; 同じように変数の値を 1 つだけ減らす場合には次のように記述することができま す。 int num = 7; num--; 「++」演算子や「--」演算子は対象となる変数の値を変化させますので、演算結果 を変数に代入する必要はありません。 なお「a++」と記述する代わりに「++a」と記述することもできますが、結果が異な る場合があります。  前置と後置 インクリメント演算子とデクリメント演算子にはそれぞれ前置と後置の二種類が 用意されています。 インクリメント演算子の前置きと後置きは次のようになります。 前置: ++変数 後置: 変数++ デクリメント演算子の前置きと後置きは次のようになります。 前置: --変数 後置: 変数-- 前置であっても後置であってもインクリメント演算子は対象の変数の値を 1 だけ 増加させ、デクリメント演算子の場合は対象の変数の値を 1 だけ減少させることに違い はありません。次の例を見て下さい。 int a = 7; a++; System.out.println(a); // 8 ++a; System.out.println(a); // 9 前置であっても後置であってもこのような使い方の場合には同じ結果となります。

(15)

 前置と後置で結果が異なる場合 前置と後置で結果が異なる場合について確認します。次の例を見て下さい。 int a = 7; int b; b = a++; System.out.println(a); System.out.println(b); 後置のインクリメント演算子を使っています。この場合は次のように実行されます。 int a = 7; int b; b = a; a = a + 1; System.out.println(a); // 8 System.out.println(b); // 7 後置のインクリメント演算子の場合、まずインクリメント演算子が書かれていない かのように文が実行されます。今回の場合であれば変数「b」に変数「a」を代入してい ますので数値の 7 が変数「b」に代入されます。それから変数「a」の値を 1 だけ増加さ せます。 次の例を見て下さい。 int a = 7; int b; b = ++a; System.out.println(a); System.out.println(b); 前置のインクリメント演算子を使っています。この場合は次のように実行されます。 int a = 7; int b; a = a + 1; b = a; System.out.println(a); // 8 System.out.println(b); // 8 前置のインクリメント演算子の場合、まず対象の変数を 1 だけ増加させます。よっ て変数「a」の値が 8 となります。それからインクリメント演算子を除いた文 の実行を します。今回の場合であれば変数「b」に変数「a」を代入していますので数値の 8 が変

(16)

数「b」に代入されます。 今回の場合はインクリメント演算子と代入が含まれる場合でしたが、「a++;」や「--b;」 などのよう文でない場合には前置と後置で結果が異なる場合がありますので注意して 下さい。  ビット演算子 整数の値に対してビット単位で処理を行うために用意されているのがビット演算 子です。次の演算子が用意されています。 演算子 使用例 意味

& a & 0xFF00FF00 a と 0xFF00FF00 のビット AND | a | 0xFF00FF00 a と OxFF00FF00 のビット OR ^ a ^ 0xFF00FF00 a と OxFF00FF00 のビット XOR ~ ~a a のビット反転(ビット NOT) << a << 3 a を 左へ 3 ビットシフト >> a >> 3 a を 右へ 3 ビットシフト(符号有り) >>> a >>> 3 a を 右へ 3 ビットシフト(符号無し) 数値を 2 進数の形式で表示し、各ビットに対して演算を行います。  シフト演算子 ビット演算子の中でも下記の 3 つはシフト演算子と呼ばれることもあります。 演算子 使用例 意味 << a << 3 a を 左へ 3 ビットシフト >> a >> 3 a を 右へ 3 ビットシフト(符号有り) >>> a >>> 3 a を 右へ 3 ビットシフト(符号無し) これらの 3 つの演算子は対象の値の各ビットを右または左へシフトします。 10 進数で右または左へ数値をシフトした場合、それは数値を 1/10 にしたり 10 倍す ることを意味します。例えば 1230 を左へシフトして 12300 とす れば 10 倍したことに なりますし、右へシフトして 123 とすれば 1/10 になったこととなります。同じように 2 進数でシフトした場合は 1/2 にしたり 2 倍 したりすることを意味します。  代入演算子 変数に値を代入する時に使用する代入演算子(=)はこれまでのサンプルなどでも使 用してきました。 演算子 使用例 意味 = a = b a に b を代入する 「=」の右辺に書かれた値や変数などを左辺に書かれた変数に代入します。

(17)

代入演算子は「=」の他に別の演算子と組み合わせた次のものが用意されています。 演算子 使用例 意味 += a += b a = a + b と同じ -= a -= b a = a - b と同じ *= a *= b a = a * b と同じ /= a /= b a = a / b と同じ %= a %= b a = a % b と同じ &= a &= b a = a & b と同じ |= a |= b a = a | b と同じ ^= a ^= b a = a ^ b と同じ <<= a <<= b a = a << b と同じ >>= a >>= b a = a >> b と同じ >>>= a >>>= b a = a >>> b と同じ これらの演算子は変数に代入する値に何らかの演算を行って、その結果を再度同じ 変数に代入する場合に便利です。  関係演算子 今後、処理を制御するための様々な方法が出てきます。その中でもある条件を満た している時だけ実行する条件分岐や、条件が満たされている間は繰り返し同じ処理を行 う繰り返し処理などが多く利用する機会が多いと思います。 詳しい解説は別のページで行いますので下記のサンプルだけ簡単に見てください。 int old = 10; if (old >= 20){ System.out.println("20 歳以上です"); }else{ System.out.println("20 歳未満です"); } 変数「old」に代入された値を 20 と比較します。大きいか等しければ「20 歳以上で す」と画面に出力し、小さい場合には「20 歳未満です」と画面に出力します。 このような条件式で使用されるのが関係演算子です。関係演算子は 2 つの値を比べ ます。大きいか小さいかまたは等しいかなどを評価し、結果として式全体が true 又は false となります。 左辺 関係演算子 右辺 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 式が評価され、結果として式が true か false となる

(18)

関係演算子として用意されているのは次の通りです。 演算子 使用例 意味 < a < b a は b よりも小さい <= a <= b a は b よりも小さいか等しい > a > b a は b よりも大きい >= a > b a は b よりも大きいか等しい == a == b a と b は等しい != a != b a は b は等しくない instanceof a instanceof b 参照型変数 a が b クラス/インターフェース/配列のインス タンスかどうか 関係演算子を含む式が正しければ true となり間違っていれば false となります。例 えば 10 < 20 は正しいので 10 < 20 という式が true となります。  論理演算子 関係演算子を使うことで様々な条件を記述することができますが、さらに論理演算 子を使うことで「10 より大きく かつ 30 より小さい」や「x が 10 と等しい 又は y が 20 と等しい」などのように複数の条件式を組み合わせたより複雑な条件式を記述でき ます。

論理演算子を使った場合も結果として式が boolean 型の true(真)か false(偽)のいずれ かとなります。論理演算子として用意されているのは次の通りです。

演算子 使用例 意味

&& a && b a と b が共に true の時に true

|| a || b a か b の少なくとも 1 つが true の場合に true ! !a a が true の場合に false、a が false の場合に true

論理演算子の場合には対象となる値が boolean 型の値です。これは boolean 型の値 を指定する場合もありますが、通常は関係演算子を使った条件式などを記述します。 ではそれぞれ確認してみます。  論理積 「&&」は論理積とも呼ばれ、演算子の左辺及び右辺の値が共に true の場合だけ全 体も true となります。

左辺 && 右辺

(19)

左辺と右辺の値による全体の値の一覧は次の通りです。

左辺 右辺 全体

true true true true false false false true false false false false 次の例を見てください。

int num = 10; boolean b;

b = num > 5 && num <= 20;

この場合、まず「num > 5」について判定します。結果は true です。次に「num <= 20」

を判定します。結果は true です。そして&&演算子の両端の値が共に true ですので式「num

> 5 && num <= 20」は true となります。

なお最後に「&&」演算子が判定されるのは「>」演算子や「<=」演算子と比べて 優先順位が低いためです。  論理和 「||」は論理和とも呼ばれ、演算子の左辺または右辺の値の少なくとも一つが true の場合に全体が true となります。

左辺 || 右辺

左辺と右辺の値による全体の値の一覧は次の通りです。 左辺 右辺 全体

true true true true false true false true true false false false 次の例を見てください。

int num1 = 10; int num2 = 20; boolean b;

(20)

この場合、まず「num1 > 20」について判定します。結果は false です。次に「num2 < 30」を判定します。結果は true です。そして||演算子の両端の値の少なくとも一つが true ですので式「num1 > 20 || num2 < 30」は true となります。

なお「&&」演算子と「||」演算子の優先順位は同じではなく「&&」の方が優先順 位が高くなっています。次の例を見てください。

int num1 = 30; int num2 = 10; boolean b;

b = num1 > 20 || num2 < 30 && num2 > 20;

この場合、先に「num2 < 30 && num2 > 20」が判定されます。これは false となりま す。次に「num1 > 20 || false」が判定されますので全体としては true となります。もし 先に「num1 > 20 || num2 < 30」から判定された場合は次に「true && num2 > 20」が判定 されるため全体としては false となり本当の結果とは変わってしまいます。 このように論理演算子が複数含まれるような式の場合には優先順位に注意して下 さい。  論理否定 「!」は論理否定とも呼ばれ、演算子の右辺の値を反転します。

!右辺

右辺の値による全体の値の一覧は次の通りです。 右辺 全体 true false false true 次の例を見てください。 int num = 10; boolean b; b = !(num > 20); この場合、まず「num > 20」について判定します。結果は false です。そして!演算 子によっての式「!(num > 20)」は true となります。 なお!演算子は優先順位がかなり高いので必要に応じて括弧を使って下さい。

(21)

 判定される順番 &&演算子や||演算子では左辺及び右辺の値を使って全体の判定を行いますが、どち らの演算子もまず左辺から判定します。

左辺 && 右辺

&&演算子の場合で考えてみると、まず左辺を判定します。ここで左辺が false だっ た場合には全体が false と確定するため右辺の判定は行いません。

左辺 || 右辺

||演算子の場合もまず左辺を判定します。ここで左辺が true だった場合には全体が true と確定するため右辺の判定は行いません。 ここで順番を何故気にするのかと言えば、まず左辺から先に判定されるため左辺と 右辺のどちらに何を記述するのかによって処理効率が変わる場合があります。左辺だけ で結果が確定する場合が多いようにしておけば、右辺を判定する必要がなく効率的です。 また左辺で結果が確定した場合に右辺は判定されませんので、右辺にインクリメン ト演算子を含む式が記述されていた場合など式そのものが処理されない場合もありま す。次の例を見てください。 int num1 = 30; int num2 = 25; boolean b; b = num1 > 10 || ++num2 < 40; この場合、||演算子の左辺だけで全体が true となることが確定するため右辺はまっ たく処理されません。その為変数「num2」の値も 1 増えることはあ りません。もしも 左辺が false だった場合には右辺も判定されるため変数「num2」の値が式を判定後に 1 だけ増加します。このように論理演算子を使用 する場合には注意が必要となります。  条件演算子(三項演算子) 条件演算子は三項演算子とも呼ばれる演算子で条件によって処理を分けることが できます。書式は次の通りです。

条件式 ? 式 1 : 式 2

条件式の値が true だった場合に式 1 を処理し、false だった場合に式 2 を処理しま す。

(22)

文字列の連結 「+」演算子は算術演算子の加算や単項演算子としても使われていますが文字列に 対して使用すると文字列と文字列を連結する演算子となります。

文字列 1 + 文字列 2

次の例を見てください。 System.out.println("目覚まし" + "時計"); 上記では「目覚まし」と「時計」という 2 つの文字列を連結しています。文字列を 連結するというのは左側の文字列の後ろに右側の文字列をつなげた文字列となります。 よって「目覚まし時計」という文字列を画面に出力することになります。  演算子の優先順位 演算子の優先順位と結合規則は次の通りです。 優先 順位 演算子 . [] () {} ; , ++ -- ~ ! * / % + - << >> >>> < > <= >= == != & ^ | && || ?: = *= /= %= += -= <<= >>= >>>= &= ^= |= たとえば、 int a =2; int b = a + 3*a;

(23)

上記の演算子の表は、上にかかれている演算子のほうが優先順位が高くなっていま す。 優先順位と異なる順に計算したい場合は、丸カッコを用いて計算順序を明示します。

(a+ 3) * a

2.9 制御構造 複雑な処理を行うプログラムを作成するためには、制御構造(control structure) を用いる。すなわち、さまざまな制御構造を組み合わせてプログラムを作成することが できます。これは、いわゆる構造化プログラミングの発想です。制御構造は 選択と繰り返しに分類されます。 2.9.1 If 選択文 If 文の処理一: 条件式を評価した結果に応じて処理を分けたい場合に使われるのが if 文です。書式 は次のようになっています。 if (条件式){ 実行する文 1; 実行する文 2; ... } 条件式が false だった場合にはブロック内の処理は何も行わず if 文の次の文へ処理 が移ります。 実際には次のように記述します。 int x=0; if (x==1) System.out.println("x=1"); 上位の例では変数 x は1の場合にはブロック内の処理を実行して「x=1」と画面に 表示します。

(24)

If 文の処理二: if 文を使えば条件式が true の時だけ行う処理を記述できますが、条件式が false だ った場合の処理も合わせて記述することができます。その場合の書式は次の通りです。 if (条件式){ true の時に実行する文 1; true の時に実行する文 2; ... }else{ false の時に実行する文 1; false の時に実行する文 2; ... } 条件式を評価し、true だった場合には条件式の後のブロック内の文を実行し、false だった場合には else の後のブロック内の文を実行します。条件式の評価は必ず true か false になるためどちらか一方のブロック内の文だけを実行することになります。 実際には次のように記述します。 int x=0; if(x==1) System.out.println("X=1"); else System.out.println("X!=1"); 上位の例では変数 x の値が 1 の場合には「x=1」と画面に表示します。そして変数 x の値が 1 ではない場合には「x!=1」と画面に表示します。 この処理流れは条件演算子(三項演算子)と同じです。たとえば if(x>0) y=x; else y=-x; 条件演算子で書き換えて下記とおりです。 y = x>0?x:-x;

(25)

If 文の処理三: ここまでは一つの条件式を使って条件分岐を行ってきましたが、今度は複数の条件 式を使いより複雑な条件文を行ってみます。書式は次の通りです。 if (条件式 1){ 条件式 1 が true の時に実行する文 1; 条件式 1 が true の時に実行する文 2; ... }else if (条件式 2) { 条件式 1 が false で条件式 2 が true の時に実行する文 1; 条件式 1 が false で条件式 2 が true の時に実行する文 2; ... }else if (条件式 3) { ... ... }else{ 全ての条件式が共に false の時に実行する文 1; 全ての条件式が共に false の時に実行する文 2; ... } 複数の条件式が使われている場合は上の条件式から順に評価していきます。まず条 件式 1 を評価し true だった場合は直後のブロック内の処理を実行して if 文を終了しま す。条件式 1 の評価が false だった場合だけ次の条件式 2 を評価します。条件式 2 が true だった場合には直後のブロック内の処理を実行し て if 文を終了します。このように順 に条件式を評価し、全ての条件式が false だった場合に else の後のブロック内の文を実 行します。 実際には次のように記述します。 if (x==1) { System.out.println("X=1"); } else if (x==2) { System.out.println("X=2"); } else if (x==3){ System.out.println("X=3"); } else { System.out.println("other"); }

(26)

If 文の処理四: もう 1 つもっと複雑の条件式使われている場合があります。if 文のネスト(入れ子 構造)といいます。 if(条件式 1){ if(条件式 2){ 条件式 2 が true の場合の処理 else{ 条件式 1 が true で条件式 2 が false の場合 }else{ if(条件式 3){ 条件式 1 が false で条件式 3 が true の場合 else{ 条件式 1 も条件式 3 も false の場合 } このような記述になります。

それぞれ if 文の中にさらに if else 文を else 文の中にさらに if else 文を記述して ネストしています。 では、実際にサンプルプログラムを見ていきます。 if (x == 1) { if(y == 1) System.out.println("x = 1,y = 1"); else System.out.println("x = 1,y != 1"); }else if(x !=1) { if(y == 1) System.out.println("x != 1,y = 1"); else System.out.println("x != 1,y != 1");

(27)

2.9.2 Switch 選択文

ある変数の値を複数の値と比較し、値に応じた処理を行うような場合を考えてみま す。if 文を使って記述すると次のようになります。 int num = 3; if (num == 1){ System.out.println("非常に不満"); }else if (num == 2){ System.out.println("少し不満"); }else if (num == 3){ System.out.println("どちらとも言えない"); }else if (num == 4){ System.out.println("少し満足"); }else if (num == 5){ System.out.println("大変満足"); } このように if 文を使っても記述できますが、対象となる値毎に処理を分けるには switch 文を使って記述することもできます。

 switch 文の利用

switch 文は対象の式を評価した結果の値に応じ、値に一致するラベルの位置へ処理 を移すために使います。条件分岐とは厳密には少し違いますが同じような使い方ができ る文ですす。switch 文の書式は次のようになっています。 switch (式){ case 定数 1: 実行する文 1; 実行する文 2; ... break; case 定数 2: 実行する文 1; 実行する文 2; ... break; }

(28)

switch 文ではまず式を評価します。式には単に整数の値が代入された変数などを単 に記述してもいいですし、計算式などを記述することも可能です。ただ いずれの場合 であっても式の評価した結果が整数でなければなりません。浮動小数点数や文字列など は記述できません。また整数であっても long 型の値は使 用できません。 式には例えば次のように記述します。 int num = 3; switch (num){ // 変数の値が式を評価した値 ... } switch (num % 2){ // 演算結果が式を評価した値 ... } 次に switch 文の「{」から「}」のブロック内に実行したい処理を羅列していきます。 int num = 3; switch (num){ System.out.println("非常に不満"); System.out.println("少し不満"); System.out.println("どちらとも言えない"); System.out.println("少し満足"); System.out.println("大変満足"); } switch 文は式を評価した値に一致するラベルへ処理を移動させるために使われま す。そこでどの値だったらどの処理を行うのかを指定するためにブロック内にラベルを 記述していきます。ラベルは次のような形式となっています。

case 定数:

ブロック内にラベルを記述すると、式を評価した値と一致するラベルのところへ処 理を移すことができます。

(29)

例えば 5 つのラベルを記述すると次のようになります。 int num = 3; switch (num){ case 1: System.out.println("非常に不満"); case 2: System.out.println("少し不満"); case 3: System.out.println("どちらとも言えない"); case 4: System.out.println("少し満足"); case 5: System.out.println("大変満足"); } ラベルに書いた値が「1」「2」「3」「4」「5」ですので、式の値が 1 から 5 の場合に 対応するラベルの位置へ処理が移ります。今回の場合、変数 「num」の値が 3 ですの で「case 3:」のラベルの位置に処理が移ります。そしてその後に記述された 「System.out.println("どちらとも言えない");」が実行されます。 注意して頂きたいのはあくまでラベルが書かれた位置に処理が移るだけというこ とです。ラベルの位置へ移動した後は switch 文の最後までそれ以降の文を 順に実行し ていきます。よって「System.out.println("どちらとも言えない");」が実行された後は 「System.out.println("少し満足");」と「System.out.println("大変満足");」が実行されます。 もしもラベルの位置へ移動した後に、次のラベルの前まで来たら switch 文を終了さ せたい場合には break 文を使います。break 文についてはまた 別のページで詳しく解説 しますが、switch 文の中で break 文が実行されると switch 文を終了します。具体的には 次のように記述します。 int num = 3; switch (num){ case 1: System.out.println("非常に不満"); break; case 2: System.out.println("少し不満"); break; case 3:

(30)

System.out.println("どちらとも言えない"); break; case 4: System.out.println("少し満足"); break; case 5: System.out.println("大変満足"); break; }

上記のように break 文を記述すると break 文を実行した時点で switch 文は終了しま す。よって上記の場合では 「System.out.println("どちらとも言えない");」が実行された 後に「break;」が実行されて switch 文は終了します。 以上が switch 文の大まかな使い方です。if 文を使えば同じようなことが記述できる 場合が多いのですが一つの変数の値に応じて処理を分けたい場合には switch 文の方が 見やすく記述できる場合があります。

 default 句

式の値と一致するラベルが無かった場合は何も実行せずに switch 文を終了します が、一致するラベルが無かった場合に何か実行させたい処理がある場合には default 句 を使います。書式は次の通りです。 switch (式){ case 定数 1: 実行する文; ... break; case 定数 2: 実行する文; ... break; default: 実行する文 1; 実行する文 2; ... } 上記の場合、式を評価した結果の値が、定数 1 にも定数 2 にも一致しなかった場合 には「default:」の位置に処理が移ります。そしてその後に書かれた文が順に実行されて いきます。 例えば次のように記述します。

(31)

int num = 3; switch (num){ case 4: System.out.println("少し満足"); break; case 5: System.out.println("大変満足"); break; default: System.out.println("満足していない"); } 上記の場合、変数「num」の値が 4 または 5 以外の場合には全て「System.out.println(" 満足していない");」の文を実行します。

2.9.3 while 繰り返し文

主に指定した回数だけ繰り返し目的で利用される for 文に対して、条件が満たされ ている間は何度でも繰り返す目的で利用されるのが while 文です。書式は次の通りです。 while (条件式){ 実行する文 1; 実行する文 2; ... } while 文では条件式を評価し true だった場合には「{」から「}」のブロック内に記 述された文を実行します。 では簡単な例を使い while 文がどのように処理されるのかを確認してみます。 int x=1; while(x<3) { System.out.println("x="+x); x++; }

注意:while(条件式)の後には;(セミコロン)は不要です。

(32)

do…while 文 while 文ではまず条件式を評価してから 1 回目の繰り返しを行います。その為、場 合によっては一度も繰り返し処理を行わないことがあります。それ に対してまず繰り 返しを一度行ってから条件式を評価したい場合に利用されるのが do..while 文です。書 式は次の通りです。 do{ 実行する文 1; 実行する文 2; ... }while (条件式); do..while 文ではまず「{」から「}」のブロック内に記述された文を実行します。そ して条件式を評価し true だった場合には再度ブロック内の処理を行いますが false だっ た場合には do..while 文を終了して次の文へ処理が移ります。

注意すべき点は最後にセミコロン(;)を付ける必要がある点です。

2.9.4 for

for 文は指定した回数だけ処理を繰り返す時に使われます。書式は次の通りです。 for (初期化式; 条件式; 変化式){ 実行する文 1; 実行する文 2; ... } for 文では条件式を評価し true だった場合には「{」から「}」のブロック内に記述 された文を実行します。 そしてブロック内の処理が一通り終わると改めて条件式を評価します。そしてまた true だった場合にはブロック内の文の実行し、false だった場合には for 文を終了します

ではまず条件式だけを使って for 文を記述してみます。次の例を見て下さい。

for (int i = 0; i < 2; i++){ System.out.println(i); }

(33)

この例では条件式「i < 2」が true となる間繰り返し処理を実行します。繰り返し処 理を 1 度実行するために条件を変化させなければ無限に繰り返しを行ってしまいます ので今回の 例では繰り返しの中で実行される文の一つとして変数「i」の値を 1 ずつ増 加させています。 この例では次のように文が実行されていきます。 1)i = 0; 2)条件式を評価。i は 2 よりも小さいので繰り返しを実行 3) System.out.println(i); 4)i++; 5)条件式を評価。i は 2 よりも小さいので繰り返しを実行 6) System.out.println(i); 7)i++; 8)条件式を評価。count は 2 よりも小さくないので繰り返しを終了 このように for 文ではまず最初に条件式が評価されます。もしも条件式がいきなり false となった場合には繰り返し処理は実行されません。条件式が true だった場合には for 文の「{」から「}」までのブロック内の文を順に実行していきます。 ブロック内の最後の文を実行したら 1 回目の繰り返しが終了です。そして for 文の 最初に戻り改めて条件式を評価します。true なら再度ブロック内の文を実行し、false だ った場合には for 文の次の文へ処理が移ります。 for 文はこのように条件式の評価とブロック内の処理の実行を繰り返す為のもので す。

2.9.5 break

break 文は for 文、while 文、do..while 文、switch 文のブロック内で使用され、break 文が実行されるとブロックを抜けて次の処理へ移ります。break 文の書式は次のように なっています。

break;

switch 文の中で break 文をどのように使うのかについては switch 文を説明する部分 を参照して下さい。まずは for 文での使い方を確認します。

for 文は条件式が true の間、ブロック内の処理を繰り返し実行しますが、break 文が 実行されると for 文を終了し次の処理へ移ります。

(34)

for (初期化式; 条件式; 変化式){ ... if (条件式){ break; } ... } if 文などと組み合わせて break 文を記述します。(if 文などと組み合わせなければ、 必ず 1 回目の繰り返しの途中で break 文が実行され for 文が終了してしまいます)。 実際には次のように記述します。 int sum = 0;

for (int i = 1; i <= 100; i++){ sum += i; if (sum > 100){ break; } } System.out.println("sum = " + sum); この場合、1 から 100 までの数値を順に加算していきますが、合計が 100 を超えた 時点で break 文を実行し for 文を終了し次の文へ処理が移ります。

while 文の場合も基本的に同じです。繰り返しの途中で break 文が実行されると while 文 を終了し次の処理へ移ります。 while (条件式){ ... if (条件式){ break; } ... } 実際には次のように記述します。

(35)

int num = 1; while(true){ System.out.println(num); num++; if (num > 100){ break; } } この場合、while 文の条件式が「true」となっていますので条件式を評価した結果は 常に「true」となりこのままでは無限ループとなります。ただし変数「num」の値が 100 を越えたら break 文が実行され while 文が終了します。 do..while 文の場合も基本的には同じです。

2.9.6 continue 文

continue 文は break 文と同じく for 文、while 文、do..while 文のブロック内で使用さ れ、continue 文が実行されると実行された位置からブロックの最後まで残りの処理をス キップします。continue 文の書式は次のようになっています。

continue;

スキップという意味が分かりにくいかもしれませんが、次の例を見て下さい。

for (int i = 0; i < 10; i++){ if (i == 3){

continue; }

System.out.println(i); }

上記では変数「i」の値が 3 の時に continue 文が実行されます。continue 文が実行さ れるとブロック内でそれ以降に記述された処理を全て行わずに次の繰り返しの条件判 断に進みます。つまり上記の場合は変数「i」の値が 3 の時だけ「System.out.println(i);」 が実行されません。

なお for 文の場合は変化式が別途用意されているので気にしなくても大丈夫ですが、 while 文などでは条件式の値を変化させる処理も含めてスキップさせてしまわないよう

(36)

に気をつけて下さい。 例えば次のように記述してしまうと変数「i」が 3 になると変数「i」の値を変化さ せる処理もスキップしてしまうため、次の繰り返し処理になっても変数「i」の値が変 化せずに無限ループとなってしまいます。 int i = 0; while(i < 10){ if (i == 3){ continue; } i++; System.out.println(i); } なお break 文と同じく繰り返し処理が多重になっている場合には、continue 文を含 む一番内側の繰り返し処理をスキップして次の繰り返しへ移ります。任意の繰り返し処 理をスキップさせるには次のページで解説するラベル付き continue を使って下さい。

(37)

2.10 配列

2.10.1 概念 同じ基本データ型のデータをいくつかまとめて一方向または多方向に並べたデー タ型は、配列(array)と呼ばれます。 配列には、要素を一方向に並べた1次元配列(one-dimensional array)と、多方向に 並べた多次元配列(multi-dimensional array)があります。 2.10.2 配列宣言 配列を使用するには、まず最初に使用する配列を宣言しなくてはいけません。宣言 は次のように行います。

型名 配列変数名[];

変数の場合と同じく格納される値のデータ型と、配列を区別するための配列変数名 を指定します。一つの配列には同じデータ型の値しか格納することはできません。 変数の場合は宣言するだけで一つの値を格納できる場所が確保されましたが、配列 の場合では値を格納する場所を必要な数だけ後から確保する必要があります。場所を確 保するには new 演算子を使って次のように行います。 型名 配列変数名[]; 配列変数名 = new 型名[要素数]; 一つの配列に確保される一つ一つの場所を要素と呼びます。new 演算子では型名の 後の「[」から「]」の間に要素の数である要素数を指定して格納する場所である要素を 確保し、それを配列変数に代入します。これで配列は要素数の数だけの値を格納するこ とができるようになります。 なお配列の宣言と要素の確保はまとめて次のように記述することもできます。

型名 配列変数名[] = new 型名[要素数];

例えば int 型の値を 5 つ格納できる配列を用意するには次のように記述します。 int a[]; a = new int[5];

int b[] = new int[5];

上は配列の宣言と要素の確保を別々に行った場合、下は要素の宣言と配列の確保を まとめて行った場合です。

 配列の宣言の別の方法

Java では先に記述した記述方法の他に次の書式を使うことができます。

(38)

どちらの書式であっても配列の宣言に違いはありません。どちらかの方法で統一し て使うようにしていればいいと思います。ただどちらかの書式では記述しにくい時もあ りますので二つの記述方法があることは覚えておいて下さい。 この書式を使って int 型の値を 5 つ格納できる配列を用意するには次のように記述 します。 int[] a; a = new int[5];

int[] b = new int[5];

2.10.3 初期化 変数では次のように宣言と同時に初期値を代入することができました。

型名 変数名 = 初期値;

配列の場合で配列の宣言と要素の確保、そして各要素への初期値の代入をまとめて 行うには次の書式を使います。

型名 配列変数名[] = {値 1, 値 2, ... };

配列の各要素に代入する初期値を「{」から「}」の間にカンマ(,)で区切って記述し ます。要素の確保が行われていませんが、値を記述した数と同じ要素を自動的に確保し ます。 実際には次のように記述します。 int n[] = {18, 29, 36, 12}; この場合、int 型のデータを扱い 4 つの要素を持つ配列を作成し、各要素には「18」 「29」「36」「12」と言う値を代入するということになります。 これは次のように記述した事と同じです。 int n[]; n = new int[4]; n[0] = 18; n[1] = 29; n[2] = 36; n[3] = 12; この書式はとても便利ですが、配列の要素数の分だけ必ず値を指定する必要があり ます。8 個の要素が必要だが初期化の時点では 4 つ要素だけ初期値を代入したいといっ た場合にはこの書式ではなく配列の宣言を行って要素を確保してから一つ一つ初期値

(39)

を代入していくしかありません。 2.10.4 配列の長さ 配列で確保されている要素の数を調べたい場合があります。要素の数は配列の長さ とも呼ばれますが次の書式で取得することができます。

配列変数名.length

調べたい配列変数の後にドット(.)+length と記述することで配列の長さを取得でき ます。(なお length はフィールドではなく特別な構文です。フィールドについてはクラ スの説明の時に行います)。 実際には次のように記述します。 int n[] = {18, 29, 36, 12}; System.out.println(n.length); 配列には 4 つの要素が確保されていますので画面には 4 と表示されます。 配列の長さは、配列と繰り返し処理を組み合わせて使用する場合によく使用されま す。配列の全ての要素を順に処理したい時、要素の数を取得して繰り返しを行う回数を 決めます。次の例を見てください。 int n[] = {18, 29, 36, 12};

for (int i = 0; i < n.length; i++){ System.out.println(n[i]); } 条件式の箇所で「配列変数.length」を使い繰り返し回数を決めています。配列の要 素数が確定していれば数値を直接記述した方が効率がいいのですが、 配列変数.length を使っておけば後で配列の要素の数が変更になった場合でも修正は必要ありません。ま た、数値が記述されているとなぜこの数値なのか 後から分からなくなる可能性もあり ますが、数値の代わりに配列変数.length が記述されていれば配列の長さだけ処理したか っということがはっきりと分 かります。 2.10.5 多次元配列 配列は複数の値をまとめて管理できる便利なものですが、配列の各要素に代入する 値に別の配列を使うことができます。 次の例を見てください。 int kokugo[] = {80, 92, 45}; int sansu[] = {75, 89, 54};

(40)

国語と算数の成績をそれぞれ 3 人分管理しています。3 人分の国語の成績を管理す るの配列を一つ利用し、3 人分の算数の成績を管理するのに配列を 1 つ利用しています。 ここでこの二つの配列を値として考え、配列を値として格納するような別の配列を 用意します。配列の宣言は次のようになっていました。

型名 配列変数名[];

作成しようとする配列に格納されるデータ型は int 型の値を持つ配列です。つまり データ型は int[]となります。よって配列を値として持つ配列は次のように記述すること ができます。 int[] seiseki[]; この配列は名前が「seiseki」で型名が int[]です。ただこの記述方法でもエラーとは なりませんが、通常は次のいずれかの記述方法を使います。 int seiseki[][]; int[][] seiseki; この配列変数は値として配列を格納する配列です。この配列変数を使うことで 3 人 分の成績を格納した配列を値として持つことができます。このような配列は多次元配列 と呼ばれるます。 2.10.6 多次元配列の要素の確保 多次元配列であっても配列と違いはないので利用する前に要素の確保が必要であ り次のように記述します。 型名 配列変数名[][]; 配列変数名 = new 型名[要素数][]; 例えば 2 つの要素を持つ場合には次のようになります。 int seiseki[][];

seiseki = new int[2][];

これで多次元配列の要素が確保されました。次に要素に値を格納していきますが、 値として格納するのは別の配列です。例えば次のように記述します。

int seiseki[][];

seiseki = new int[2][];

int kokugo[];

kokugo = new int[3]; kokugo[0] = 80; kokugo[1] = 92; kokugo[2] = 45;

(41)

int sansu[];

sansu = new int[3]; sansu[0] = 75; sansu[1] = 89; sansu[2] = 54; seiseki[0] = kokugo; seiseki[1] = sansu; 丁寧に記述するとこのようになりますが、多次元代入に値として代入する配列を別 に作らなくても次のように記述することができます。 int seiseki[][];

seiseki = new int[2][];

seiseki[0] = new int[3]; seiseki[1] = new int[3];

seiseki[0][0] = 80; seiseki[0][1] = 92; seiseki[0][2] = 45; seiseki[1][0] = 75; seiseki[1][1] = 89; seiseki[1][2] = 54;

慣れないと分かりにくいと思いますが seiseki[0]を kokugo に seiseki[1]を sansu に置 き換えてみて頂ければ分かると思います。

さらにまとめて次のように記述することができます。

int seiseki[][];

seiseki = new int[2][3];

seiseki[0][0] = 80; seiseki[0][1] = 92; seiseki[0][2] = 45;

(42)

seiseki[1][1] = 89; seiseki[1][2] = 54; この場合、int 型の値を持つことができる要素を 3 つ分確保した配列を値として持 つことができる要素を 2 つ確保した配列を作成します。結局のところ多次元配列におけ る要素の確保は次のように記述できます。 型名 配列変数名[][]; 配列変数名 = new 型名[要素数][値の配列の要素数]; また通常の配列と同じように配列の宣言と要素の確保はまとめて次のように記述 することもできます。

型名 配列変数名[][] = new 型名[要素数][値の配列の要素数];

よって先ほどまでのサンプルは次のように記述できます。

int seiseki[][] = new int[2][3];

seiseki[0][0] = 80; seiseki[0][1] = 92; seiseki[0][2] = 45; seiseki[1][0] = 75; seiseki[1][1] = 89; seiseki[1][2] = 54; 多次元配列は配列を値として持つような配列であり、複数の変数を使用することで 繰り返し処理と組み合わせて多くの値をまとめて処理することができるようになりま す。 なお今回の多次元配列は 2 次元の配列でしたが、2 次元の配列を値として持つよう な 3 次元の配列など何次元の配列でも作成は可能です。 2.10.7 多次元配列の初期化 配列の各要素に初期値を設定する方法は次のような書式を使いました。

型名 配列変数名[] = {値 1, 値 2, ..};

多次元配列の場合は要素に代入される値が別の配列となりますので次のような書 式となります。 型名 配列変数名 1[] = {値 1, 値 2, ..}; 型名 配列変数名 2[] = {値 1, 値 2, ..}; 型名 配列変数名[][] = {配列変数名 1, 配列変数名 2}; 別途作成された配列を値のように記述しています。またさらに次のように記述する

(43)

こともできます。

型名 配列変数名[][] = {{値 1_1, 値 1_2, ..}, {値 2_1, 値 2_2, ..}};

具体的には次のように記述します。 int num[][] = {{10, 8, 5}, {9, 16, 4}, {3, 7, 5}}; 通常の配列では値をカンマ(,)で区切って記述していましたが多次元配列の場合は 値の場所に別の配列を記述しています。これは次のように記述した場合と同じです。

int num[][] = new int[2][3];

num[0][0] = 10; num[0][1] = 8; num[0][2] = 5; num[1][0] = 9; num[1][1] = 16; num[1][2] = 4; num[2][0] = 3; num[2][1] = 7; num[2][2] = 5; Java ではプログラムの途中で空白や改行を入れることができますので、初期値が長 くなった場合には例えば次のように記述すると分かりやすいかもしれません。 int num[][] = { {10, 8, 5}, {9, 16, 4}, {3, 7, 5} }; 注意点としては通常の配列と同じく必要な要素の分だけ全て値を指定する必要が あります。 2.10.8 多次元配列の長さ 多次元配列の場合も「配列変数名.length」で配列の長さを取得することができます。

配列変数名.length

では多次元配列の場合に取得できる値を確認してみます。次の例を見てください。 int num[][] = {{1, 3, 5}, {2, 4, 6}}; System.out.println(num.length);

参照

関連したドキュメント

仏像に対する知識は、これまでの学校教育では必

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

Nintendo Switchでは引き続きハードウェア・ソフトウェアの魅力をお伝えし、これまでの販売の勢いを高い水準

自閉症の人達は、「~かもしれ ない 」という予測を立てて行動 することが難しく、これから起 こる事も予測出来ず 不安で混乱

つまり、p 型の語が p 型の語を修飾するという関係になっている。しかし、p 型の語同士の Merge

口文字」は患者さんと介護者以外に道具など不要。家で も外 出先でもどんなときでも会話をするようにコミュニケー ションを

   遠くに住んでいる、家に入られることに抵抗感があるなどの 療養中の子どもへの直接支援の難しさを、 IT という手段を使えば

自然言語というのは、生得 な文法 があるということです。 生まれつき に、人 に わっている 力を って乳幼児が獲得できる言語だという え です。 語の それ自 も、 から