Java基礎 第6回では繰り返し文について学びました。
この記事では、Java言語における『配列』とその操作方法、ならびに参照渡しの概念について詳細に解説しています。配列の宣言方法から要素へのアクセス方法、配列の操作方法、そして配列の参照渡しといった少し深いテーマまで、例などを使ってわかりやすくご紹介していきます。
Javaプログラミングの学習を始めた方や、配列と参照渡しの概念をより深く理解したい中級者の方にとって、この記事はピッタリな内容になっています。
Javaの配列について
配列とは
配列は、複数のデータを1つの変数にまとめて格納するためのデータ構造です。配列を使用することで、複数の値を管理しやすくなります。
配列の宣言と初期化
配列の宣言には主に以下の3つのパターンが存在します。
配列を宣言するだけの場合
データ型[] 配列名;
例)
int[] numbers;
配列を宣言して要素数を指定する場合
データ型[] 配列名 = new データ型[要素数];
例)
int[] numbers = new int[5];
配列を宣言して要素を初期化する場合
データ型[] 配列名 = {要素1, 要素2, 要素3, ...};
例)
String[] names = {"Alice", "Bob", "Charlie"};
配列の要素へのアクセス
配列の要素にアクセスするには、配列名の後ろに[インデックス]を付け加えます。インデックスは0から始まり、要素の位置を表します。インデックスは添え字とも言います。
配列名[インデックス]
例えば、先ほどのnumbers配列の2番目の要素にアクセスする場合は次のようになります。
int number = numbers[1];
ここで、numbers[1]は2番目の要素を表し、その値をnumber変数に代入しています。
配列の要素は[0]から始まります。
配列の操作
配列にはさまざまな操作があります。ここでは、配列の要素の変更、配列の長さの取得、配列のコピーについて説明します。
配列の要素の変更
配列の要素には、インデックスを指定して値を代入することで変更することができます。
配列名[インデックス] = 新しい値;
例えば、numbers配列の3番目の要素を42に変更する場合は次のようになります。
numbers[2] = 42;
このコードでは、numbers[2]の値を42に変更しています。
配列の長さの取得
配列の長さ(要素の個数)を取得するには、lengthプロパティを使用します。
int length = 配列名.length;
例えば、numbers配列の長さを取得する場合は次のようになります。
int length = numbers.length;
このコードでは、numbers配列の長さをlength変数に代入しています。
配列のコピー
配列をコピーするには、System.arraycopy()メソッドを使用するか、Arrays.copyOf()メソッドを使用します。
下記はそれぞれの使用例です。
System.arraycopy()の使用例
// 元の配列
int[] original = new int[]{1, 2, 3, 4, 5};
// 新しい配列
int[] copied = new int[5];
// 元の配列から新しい配列に要素をコピー
System.arraycopy(original, 0, copied, 0, original.length);
// これでcopied配列には元の配列と同じ要素が含まれます
for (int i : copied) {
System.out.println(i);
}
実行結果
1
2
3
4
5
Arrays.copyOf()の使用例
import java.util.Arrays;
// 元の配列
int[] original = new int[]{1, 2, 3, 4, 5};
// Arrays.copyOf()メソッドを使用して配列をコピー
int[] copied = Arrays.copyOf(original, original.length);
// これでcopied配列には元の配列と同じ要素が含まれます
for (int i : copied) {
System.out.println(i);
}
実行例
1
2
3
4
5
参照渡し
Javaでは、基本型の変数は値そのものを格納しますが、参照型の変数はオブジェクトへの参照を格納します。そのため、参照型の変数を引数としてメソッドに渡すと、実際のオブジェクトが渡されることになります。
このJavaの挙動を理解するために、図書館と本を使った例え話を考えてみましょう。
基本型の変数は、本そのものを持つことに例えられます。例えば、自分が所有する本を直接手に取り、その中身を読むことができます。その本の内容を変更すると、自分が持っているその本のみが変わります。他の人が同じタイトルの本を持っていても、その人の本は影響を受けません。これが「値そのものを格納」するという概念です。
一方、参照型の変数は、図書館の本を指す図書カードに例えられます。図書カード自体は本の内容を持っていませんが、そのカードを使って図書館から特定の本を取り出すことができます。この図書カードが「参照」に相当します。
そして、その図書カード(参照)を友人に渡すと、友人も同じ本にアクセスできます。さらに、もし友人がその本に書き込みをしたら、次にあなたがそのカードで本を取り出したとき、その変更が反映されているはずです。なぜなら、あなたと友人がアクセスしているのは同じ本(オブジェクト)だからです。
これが「参照型の変数はオブジェクトへの参照を格納」し、「参照型の変数を引数としてメソッドに渡すと、実際のオブジェクトが渡される」ことを示す例です。
参照渡しの例
以下は、参照渡しの例です。
public class Main {
public static void main(String[] args) {
int[] array = {1, 2, 3};
System.out.println("Before modification: " + Arrays.toString(array));
modifyArray(array);
System.out.println("After modification: " + Arrays.toString(array));
}
public static void modifyArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] *= 10;
}
}
}
上記のコードでは、modifyArray()メソッドにarrayという配列が渡されています。modifyArray()メソッド内で、渡された配列の各要素を10倍にしています。これにより、元の配列も更新されることが確認できます。
実行結果は以下の通りです.
Before modification: [1, 2, 3]
After modification: [10, 20, 30]
この結果から、`modifyArray`メソッドで配列`arr`の要素が変更され、その変更が元の配列`array`に反映されていることがわかります。
つまり、メソッドに配列を渡した際、その配列の参照が渡されるため、メソッド内で配列の内容を変更すると、その変更がメソッドを呼び出した側の配列にも適用されます。これが「参照渡し」の仕組みです。
まとめ
今回はJavaにおける配列についてご紹介いたしました。
最初は戸惑う部分もあるかもしれませんが、配列はJavaプログラミングに関して多用する機能なのでみにつくまで繰り返し復習して取り組んでいきましょう!
次回はメソッドについて紹介していきます!
コメント