配列を扱うメソッド
10.4 配列を扱うメソッド
続いて、配列を扱うメソッドについて学習していきます。
プログラミングでは、同じ種類のデータを効率よく管理するために配列を使いますが、メソッドの引数に配列を使うことでさらに効率よくプログラムを作成することができます。
10.4.1 基本構文
配列を扱う場合、戻り値と戻り値の型、もしくは引数の型が通常の変数の宣言から配列の宣言に変わります。
しかし、その他の基本的な構成は全く一緒です。
配列の宣言の[ ]
配列の印である「 [ ] 」(角括弧)は、型名とセットです。
※宣言時には型名ではなく変数名に「 [ ] 」を付けてもエラーにはなりませんが、紛らわしいので
常に型名に「 [ ] 」を付けるようにして下さい。
10.4.2 配列変数をメソッドの引数に渡すプログラム
配列変数をメソッドの引数に取り、それを利用した処理を行うプログラムを作成します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch10
③ 名前 :ArrayArgument.java
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ ArrayArgument.java
package jp.co.f1.intro.ch10; public class ArrayArgument { static void display(String[] aryData) { for (int i = 0; i < aryData.length; i++) { System.out.println(aryData [i]); } } public static void main(String[] args) { String[] hotSpring = { "別府", "由布院","伊東" }; System.out.println(" -- 三大温泉 -- "); display(hotSpring); } }
実行結果
解説
プログラムが実行される順に解説します。
まず、mainメソッド内で最初に処理が行われる13行目からです。13行目では、String型の配列変数hotSpringを宣言し、3つの要素を宣言と同時に任意の値で初期化しています。
次に、文字列を表示します。
その後、displayメソッドを実行します。このメソッドには、String型の配列変数hotSpringを引数に渡しています。
5~10行目がdisplayメソッドの本体です。17行目で呼び出され、この中の処理が行われます。
5行目では、引数に取った配列変数hotSpringの値をaryDataに代入しています。これを図に表すと図 10.4.1になります。配列変数に配列変数を代入しているので、配列変数hotSpringの要素の場所情報がargArrayにコピーされました。
図 10.4.1 : 配列変数hotSpringを引数に渡す時
6~8行目まではfor文です。aryData.lengthの値は3になります。配列変数aryDataの要素の長さは、配列変数hotSpringの要素の長さともいえます。変数0の時、「0 < 3」で条件は満たされ、7行目が実行されます。7行目では、aryData[0]の値である「別府」が表示されます。変数はインクリメントされ、6行目の条件式の判定に移ります。このように内部処理をあと2回繰り返し、for文を抜けます。
displayメソッドを呼び出した17行目以降にmainメソッド内の処理がないため、プログラムが終了します。
ポイント
・ 引数に配列変数を受け渡す場合は、渡した配列変数が参照している要素を共有する。
10.4.3 配列の要素を変更する自作メソッドを使用したプログラム
引数に取った配列の要素を変更するメソッドを作成し、これを呼び出して実行します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch10
③ 名前 :ChangeArrayElement4.java
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ ChangeArrayElement4.java
package jp.co.f1.intro.ch10; public class ChangeArrayElement4 { static void changeHotSpring(String[] aryData){ aryData[0] = "ベップ"; aryData[1] = "ユフイン"; aryData[2] = "イトウ"; } public static void main(String[] args) { String[] hotSpring = { "別府", "由布院","伊東" }; System.out.println(" -- 三大温泉 -- "); for(int i = 0; i < hotSpring.length ; i++){ System.out.println("hotSpring[" + i + "]の値は、" + hotSpring[i]); } changeHotSpring(hotSpring); System.out.println(" -- 三大温泉 -- "); for(int i = 0; i < hotSpring.length ; i++){ System.out.println("hotSpring[" + i + "]の値は、" + hotSpring[i]); } } }
実行結果
解説
このプログラムには、changeHotSpringメソッドという自作メソッドがmainメソッドより先に書かれています。ここでもプログラムの実行順どおりに解説していきます。
まず、mainメソッド内の最初の処理である13行目です。この行では、String型の配列変数hotSpringを宣言し、3つの要素を作成しています。
次に、15行目で文字列を表示します。
17~19行目のfor文を実行します。カウンタ変数iは配列変数hotSpringの全ての要素のインデックスを指すようにカウンタ変数の値や条件式が設定されています。このfor文では、配列変数hotSpringの全ての要素の値を表示しています。
21行目はchangeHotSpringメソッドを呼び出しています。また、配列変数hotSpringを引数に渡しています。
5行目では、引数にとったString型の配列変数hotSpringを同じString型の配列変数のaryDataに代入しています。配列変数Aに配列変数Bを代入するということは、同じ要素を参照するということでした。これは、図 10.4.2のようなイメージになります。
図 10.4.2 :配列変数を引数に渡す場合
6行目では、argArray[0]に「ベップ」という文字列を代入しています。これは、hotSpring[0]と同じ要素です。
これを図で表したものは図 10.4.3になります。
図 10.4.3 : 要素の値の変更後
7行目、8行目も同じように文字列を代入し、メソッド内の処理を終わります。このメソッドはvoidと指定されているので、戻り値はありません。このイメージは図 10.4.4になります。
図 10.4.4 : 要素の値の変更後
mainメソッドの処理に戻ります。
23行目では文字列を表示します。
25~27行目は、for文です。17~19行目のfor文と同じ処理をしています。配列変数hotSpringの全ての要素を表示させています。changeHotSpringメソッドで要素の値を変更したため、表示される文字列が異なります。
ポイント
・ 仮引数の配列変数の要素の値を変更すると、同じ要素を共有しているので実引数の配列変数の要素の値も変更される。
10.4.4 戻り値として配列を返す自作メソッドを使用したプログラム
続いて作成するプログラムは、3つの値を引数に取り、それを配列にして返すメソッドを作成し、呼び出します。また、その配列の要素をfor文を使って全て表示します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch10
③ 名前 :ReturnValueArray.java
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ ReturnValueArray.java
package jp.co.f1.intro.ch10; public class ReturnValueArray { public static void main(String[] args) { String[] hotSpring = new String[2]; hotSpring = makeArray("別府", "由布院","伊東"); for(int i = 0; i < hotSpring.length ; i++){ System.out.println("hotSpring[" + i + "]の値は、" + hotSpring[i]); } } static String[] makeArray(String name1,String name2,String name3){ String[] localArray = {name1,name2,name3}; return localArray; } }
実行結果
解説
このプログラムには、mainメソッドの後ろに自作のメソッドが1つ記述されています。
7行目では、String型の配列変数hotSpringを宣言し、2つの要素の記憶領域を確保しています。String型の配列の要素の規定値はnullのため、記憶領域の確保と同時にnullで初期化されています。
図 10.4.5 : 配列変数hotSpringの宣言と2つの要素の記憶領域を確保
9行目では、makeArrayメソッドを呼び出し、その戻り値を配列変数hotSpringに代入しています。
17~22行目がmakeArrayメソッドの宣言部分です。
makeArrayメソッドは、1番目にString型の値、2番目にString型の値、3番目にString型の値を引数に取るメソッドです。今回は、それぞれ「別府」「湯布院」「伊東」という文字列を引数に取りました。つまり、変数name1には「別府」、変数name2には「湯布院」、変数name3には「伊東」という文字列が代入されたことになります。この図は図 10.4.6を参考にして下さい。
図 10.4.6 : makeArrayメソッドの引数への値の代入
19行目では、String型の配列変数localArrayを宣言し、3つの要素を作成と同時に初期化しています。つまり、「別府」「湯布院」「伊東」という文字列の要素が作られた事になります。
図 10.4.7 : String型の配列変数localArrayの宣言と要素の作成
20行目では、配列変数localArrayを戻り値として返しています。9行目で配列変数hotSpringに代入した値は、この配列変数localArrayとなります。このイメージは図 10.4.8、図 10.4.9を参照して下さい。
図 10.4.8 : メソッドの戻り値を配列変数に代入(9行目)
図 10.4.8は、makeArrayメソッドを呼び出し、戻り値を配列変数hotSpringに代入している9行目を図で表したものです。メソッドを呼び出す記述をした部分が戻り値である値に置き換わるイメージです。
図 10.4.9は、同じく9行目の動きを表しています。makeArrayメソッドの戻り値である配列変数localArrayを配列変数hotSpringに代入しているイメージです。配列変数hotSpringに配列変数localArrayを代入することで、配列変数localArrayが持っている要素の場所情報が配列変数hotSpringに代入されます。そのため、配列変数hotSpringはそれぞれnullが代入されている2つの要素は参照しなくなり、代わりに「別府」「湯布院」「伊東」という文字列をそれぞれ値に持つ3つの要素の場所情報を持つことになりました。
図 10.4.9 : 配列変数hotSpringへメソッドの戻り値である配列変数localArrayの代入