プログラミングの配列をわかりやすく解説|宣言・実務応用まで

Mirai

配列ってよく出てくるんだけど、変数と何が違うの?宣言の書き方もよくわからないし、for文と組み合わせるところでつまずいてる…。

Zetto

今回はプログラミングの配列を基本からとことんわかりやすく解説するよ。宣言・初期化・for文との使い方・実務での使われ方まで、これ一記事でカバーするから参考にしてみて。

Zettoのライタープロフィール
本記事の専門性

現役エンジニアのZettoです。JavaとTypeScriptを中心に、商用Webアプリの開発を担当しています。

Java Silver・Java Goldを保有し、実務で日常的に配列を扱ってきた経験をもとに解説します。

配列の仕組みを理解すれば、大量のデータを整理して扱う力が一気に身につきます。

この記事では、配列の基本定義から宣言・初期化・for文との組み合わせ・よくあるエラーの対処法まで、順番に解説します。

ぜひ最後まで読んでみてください。

目次

配列とは何か|変数との違いをわかりやすく解説

配列と変数の違い

まず「配列とは何か」という基本的な概念から解説します。

  • 配列の基本的な定義
  • 変数と配列の違い
  • 配列を使うメリット

順番に見ていきましょう。

配列の基本的な定義

配列とは、同じデータ型の値を複数まとめて管理できるデータ構造です。

イメージとしては、番号が振られたロッカーが横一列に並んでいる様子を思い浮かべてみてください。

それぞれのロッカーに値が入っていて、番号(インデックス)を指定することで目当ての値を取り出せます。この「番号付きロッカーの列」が配列のイメージです。

Javaで書くと、こんな感じになります。

int[] scores = {80, 65, 92, 78, 55};

scores[0] で1番目の値(80)、scores[1] で2番目の値(65)にアクセスできます。

配列の特徴を整理すると、次の3点です。

  • 同じデータ型の値しか格納できない
  • 各要素に番号(インデックス)でアクセスする
  • サイズはあらかじめ決める必要がある

今回はJavaを中心に解説しますが、PythonやJavaScriptにも配列(リスト)は存在します。

書き方は違っても「複数のデータをまとめて管理する」という考え方は、どの言語でも共通です。

変数と配列の違い

変数は「1つの値を入れる箱」、配列は「複数の値をまとめて入れる箱」です。

5人の生徒のテストの点数を管理する場合で比べてみましょう。

変数で管理する場合

int score1 = 80;
int score2 = 65;
int score3 = 92;
int score4 = 78;
int score5 = 55;

配列で管理する場合

int[] scores = {80, 65, 92, 78, 55};

変数で管理しようとすると、人数が増えるほど変数の数も増えていきます。100人分のデータを扱うとしたら、変数を100個書かなければなりません。

配列なら1つの変数名でまとめて管理できるので、コードの見通しがぐっとよくなります。

配列を使うメリット

配列を使う主なメリットは3つです。

  • 大量のデータを一括で管理できる
  • for文と組み合わせてまとめて処理できる
  • コードがシンプルになり読みやすくなる

特に「for文と組み合わせてまとめて処理できる」は、実務で最も活躍するパターンです。これについては後の章で詳しく解説します。

プログラミング学習全体のメリットについて知りたい方は、こちらの記事もあわせてチェックしてみてください。

Zetto

配列は変数の「進化版」です。まずは「複数の値をまとめて管理する箱」というイメージを持てれば、あとの内容もスムーズに理解できます。

配列の宣言・初期化・要素へのアクセス方法

配列の宣言と初期化

配列の具体的な書き方を、宣言・初期化・アクセスの3ステップで解説します。

  • 配列の宣言と初期化のやり方
  • 添字(インデックス)を使った要素へのアクセス
  • 配列の長さ(length)の取得方法

1つずつ見ていきましょう。

配列の宣言と初期化のやり方

配列の作り方には大きく2パターンあります。

宣言のみ行う場合

まずサイズだけを決めて、後から値を入れる方法です。

// サイズ5の整数型配列を宣言
int[] scores = new int[5];

// 後から値を代入する
scores[0] = 80;
scores[1] = 65;
scores[2] = 92;
scores[3] = 78;
scores[4] = 55;

new int[5]5 がサイズです。「5つの整数を入れる配列を作る」という意味になります。

宣言だけした配列の初期値は型によって異なります。

整数型(int)なら 0、真偽値型(boolean)なら false、文字列型(String)なら null が自動的に入ります。

宣言と同時に初期化する場合

初期値が最初から決まっているときは、宣言と同時に値を入れる書き方がシンプルでおすすめです。

// 宣言と同時に初期化
int[] scores = {80, 65, 92, 78, 55};

// こちらの書き方も同じ意味
int[] scores = new int[]{80, 65, 92, 78, 55};

{} の中に初期値をカンマ区切りで並べます。

サイズは自動でカウントされるので、自分で指定する必要はありません。

実務ではこの「宣言と同時に初期化」のパターンをよく使います。

添字(インデックス)を使った要素へのアクセス

配列の各要素には、添字(インデックス)という番号でアクセスします。

重要なのは、インデックスは0から始まるという点です。

ここは多くの初心者がつまずくポイントなので、しっかり押さえておきましょう。

int[] scores = {80, 65, 92, 78, 55};

System.out.println(scores[0]); // → 80(1番目の値)
System.out.println(scores[1]); // → 65(2番目の値)
System.out.println(scores[4]); // → 55(5番目の値)

値を書き換えるときも同じようにインデックスを使います。

scores[2] = 100; // 3番目の値を92から100に変更

配列の長さ(length)の取得方法

配列のサイズを取得するときは .length を使います。

int[] scores = {80, 65, 92, 78, 55};
System.out.println(scores.length); // → 5

これはfor文と組み合わせるときに非常によく使います。

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}

i < scores.length とすることで、配列の要素数に合わせてループが回ります。

サイズが変わってもコードを修正する必要がないので、実務ではほぼ必ずこの書き方を使います。

配列の宣言・初期化・アクセスは、プログラミングの基礎中の基礎です。

ここを押さえてしまえば、for文との組み合わせもスムーズに理解できるようになります。

Zetto

インデックスが0始まりというのは、最初は違和感があるかもしれません。でも慣れてしまえば自然と指が動くようになりますよ。

for文と配列の組み合わせ方【実務で最頻出】

for文で配列を処理

for文と配列の組み合わせは、実務で最も頻繁に使うパターンです。

  • 基本的なfor文での配列操作
  • 拡張for文(for-each)の使い方
  • 実務で使う代表的なパターン

順番に解説していきます。

基本的なfor文での配列操作

for文と配列を組み合わせることで、大量のデータをまとめて処理できます。

カウンタ変数を使う基本パターン

最も基本的な書き方です。

int[] scores = {80, 65, 92, 78, 55};

for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}

出力結果

80
65
92
78
55

i がインデックスの役割を果たしていて、ループのたびに 0→1→2→3→4 と増えていきます。

scores.length5 なので i < 5、つまり i4 になるまでループが続きます。

合計値や平均値を計算するときも、このパターンをよく使います。

int[] scores = {80, 65, 92, 78, 55};
int total = 0;

for (int i = 0; i < scores.length; i++) {
    total += scores[i];
}

double average = (double) total / scores.length;
System.out.println("合計:" + total);    // → 合計:370
System.out.println("平均:" + average);  // → 平均:74.0

逆順・条件付きループの応用パターン

インデックスを scores.length - 1 から始めると、逆順に処理できます。

int[] scores = {80, 65, 92, 78, 55};

// 逆順に出力
for (int i = scores.length - 1; i >= 0; i--) {
    System.out.println(scores[i]);
}

条件付きで処理したい場合はif文を組み合わせます。

// 70点以上のスコアだけ出力
for (int i = 0; i < scores.length; i++) {
    if (scores[i] >= 70) {
        System.out.println(scores[i]);
    }
}

for文・配列・if文の3点セットを使いこなせると、実務のデータ処理の大半をカバーできるようになります。

拡張for文(for-each)の使い方

Java5以降では、拡張for文(for-each文)を使うともっとシンプルに書けます。

int[] scores = {80, 65, 92, 78, 55};

for (int score : scores) {
    System.out.println(score);
}

int score : scores の意味は「scores配列から1つずつ取り出して score に入れる」です。

インデックスを書かなくていい分、全要素を順番に処理するだけなら拡張for文のほうがスッキリします。

ただし、以下のケースでは通常のfor文を使います。

  • インデックスを使った処理が必要なとき(「3番目の要素だけ処理する」など)
  • ループ中に配列の要素を書き換えたいとき
  • 逆順に処理したいとき

状況に応じて使い分けるのが実務の判断基準です。

実務で使う代表的なパターン

実務でよく登場するfor文と配列のパターンを整理します。

  • 最大値・最小値の検索:配列内の一番大きい(小さい)値を探す
  • 要素の検索(線形探索):条件に一致する要素を探す
  • 配列のコピー:別の配列に値をコピーする
  • ソート処理:並び替え(実務では Arrays.sort() を使うことが多い)

特に最大値の検索は、面接でもよく出る定番パターンです。

書き方を覚えておくと役に立ちます。

int[] scores = {80, 65, 92, 78, 55};
int max = scores[0]; // まず最初の要素を仮の最大値とする

for (int i = 1; i < scores.length; i++) {
    if (scores[i] > max) {
        max = scores[i];
    }
}

System.out.println("最高点:" + max); // → 最高点:92

僕が1社目の研修で最初に書いたコードが、これに近い処理でした。当時はfor文の中でif文が動く仕組みがよくわからなくて、何度も読み返した記憶があります。

でも実際に手を動かして動かしてみたら、あっという間に理解できました。

for文と配列の組み合わせは最初とっつきにくく感じるかもしれません。

でもパターンを一度覚えてしまえば、実務のほとんどのデータ処理に応用できるようになりますよ。

Zetto

for文と配列の組み合わせは、プログラミングの中で最も「何度も書く」パターンの1つです。手が動くようになるまで、繰り返し書いてみてください。

2次元配列の使い方と注意点

2次元配列の使い方

2次元配列は少し発展的な内容ですが、実務でも登場するので押さえておきましょう。

  • 2次元配列の宣言と初期化
  • 2次元配列の要素へのアクセス
  • 配列の注意点|型制約とサイズ固定

順番に解説します。

2次元配列の宣言と初期化

2次元配列とは、配列の中に配列が入ったデータ構造です。

Excelの表(行と列)のようなイメージで捉えると理解しやすいです。

// 3行2列の2次元配列
int[][] matrix = {
    {1, 2},
    {3, 4},
    {5, 6}
};

new を使った書き方もあります。

// 3行2列のサイズで宣言
int[][] matrix = new int[3][2];

matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[1][0] = 3;
// 以降も同様に代入していく

2次元配列の要素へのアクセス

2次元配列のアクセスは [行][列] の形式です。

int[][] matrix = {
    {1, 2},
    {3, 4},
    {5, 6}
};

System.out.println(matrix[0][0]); // → 1(0行0列目)
System.out.println(matrix[1][1]); // → 4(1行1列目)
System.out.println(matrix[2][0]); // → 5(2行0列目)

全要素を処理するときは、2重のfor文を組み合わせます。

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

出力結果

1 2 
3 4 
5 6

配列の注意点|型制約とサイズ固定

配列を使う上で必ず押さえておきたい注意点が2つあります。

① 異なるデータ型は格納できない

Javaの配列は宣言した型の値しか入れられません。

int[] numbers = new int[3];
numbers[0] = 100;      // OK
numbers[1] = "文字列"; // コンパイルエラー!

② サイズは後から変更できない

一度作った配列のサイズは変えられません。

int[] scores = new int[5]; // サイズ5で固定
// 6個目を後から追加することはできない

データの件数が変わる可能性がある場合は、後述する ArrayList の使用を検討してみてください。

2次元配列はCSVデータの処理や行列計算でも使うことがあります。

「行と列の表」というイメージを持っておけば、実務で登場したときも迷わず対応できますよ。

Zetto

2次元配列は最初は複雑に感じるかもしれませんが、「Excelの表をプログラムで表現したもの」というイメージで考えると、スッと理解できます。

配列でよくあるエラーと対処法|ArrayList(List)との使い分けも解説

配列エラーと対処法

実務で遭遇しやすいエラーと、配列と ArrayList の使い分けを解説します。

  • ArrayIndexOutOfBoundsExceptionの原因と対処法
  • 配列 vs ArrayList(List)|使い分けの判断基準
  • 現場での配列の使われ方【実体験】

順番に見ていきます。

ArrayIndexOutOfBoundsExceptionの原因と対処法

ArrayIndexOutOfBoundsException は、配列を使う上でよく発生するエラーです。

直訳すると「配列インデックスが範囲外」、つまり「存在しないインデックスにアクセスしようとした」ときに発生します。

発生する原因

主な原因は3パターンです。

パターン① 存在しないインデックスへのアクセス

int[] scores = {80, 65, 92}; // サイズ3(インデックス0〜2)
System.out.println(scores[3]); // エラー!インデックス3は存在しない

パターン② for文の条件ミス

// NG:「<=」がバグの原因
for (int i = 0; i <= scores.length; i++) {
    System.out.println(scores[i]);
}

<= にしてしまうと、最後に i = 3 でアクセスしようとしてエラーになります。正しくは < です。

パターン③ 空配列(サイズ0)へのアクセス

int[] scores = new int[0];
System.out.println(scores[0]); // エラー!

対処法と予防策

エラーを防ぐための習慣を3つ紹介します。

  • for文の条件は i < 配列名.length<= は使わない)
  • 配列のサイズを確認してからアクセスする
  • if (scores.length > 0) で空配列のチェックをする

僕自身、研修期間中にこのエラーを何度も出しました。今では条件式を書くとき、「あ、< だ」と自然に確認できるようになっています。

繰り返し書いているうちに体が覚えてくれるので、焦らず1つずつ直していきましょう。

配列 vs ArrayList(List)|使い分けの判断基準

Javaには配列と似た ArrayList というクラスがあります。

どちらを使うか迷う方も多いので、違いを整理します。

比較項目配列(array)ArrayList
サイズ固定(変更不可)可変(追加・削除できる)
データ型プリミティブ型もOK参照型のみ(Integer など)
処理速度高速やや遅い
記述量少ないやや多い(ジェネリクスが必要)
使いやすさシンプル機能豊富(sort・containsなど)

使い分けの目安はこうです。

  • 配列を使う場合:データ件数が固定、処理速度を優先、シンプルに書きたい
  • ArrayListを使う場合:データの追加・削除が発生する、件数が事前にわからない

現場での配列の使われ方【実体験】

実際の現場でどのように配列を使ったか、紹介します。

僕が携わった在庫管理Webアプリの案件では、商品コードの一覧を配列で扱うケースがありました。CSVから読み込んだ固定件数のデータを一時的に配列に格納して処理する場面です。

一方で、ユーザーが動的に追加・削除できるデータは ArrayList で管理していました。用途によって使い分けるのが現場のリアルです。

配列を「基礎」として理解した上で ArrayList を学ぶのが、最短の習得ルートです。

エラーへの対処法や ArrayList との使い分けは、最初から完璧に覚える必要はありません。実際にコードを書いてエラーを出しながら身につけていくのが一番の近道ですね。

Zetto

ArrayIndexOutOfBoundsException は、ほぼ全てのJava学習者が通る洗礼です。エラーメッセージを読んで原因を特定する練習だと思えば、全然怖くないですよ。

配列に関するよくある質問(FAQ)

配列に関するFAQ

最後に、配列に関してよくある質問に答えます。

  • 配列のサイズは後から変更できますか?
  • 配列とListはどちらを優先して使うべきですか?
  • 多次元配列は実務でよく使いますか?

配列のサイズは後から変更できますか?

Javaの配列は一度作ったサイズを変更することはできません。

後から要素を追加したい場合の選択肢は2つあります。

① サイズを大きくした新しい配列を作ってコピーする

int[] original = {1, 2, 3};
int[] newArray = new int[original.length + 1];

System.arraycopy(original, 0, newArray, 0, original.length);
newArray[3] = 4; // 新しい要素を追加

② ArrayListを使う

ArrayList list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4); // 後から自由に追加できる

サイズが変わる可能性があるなら、最初から ArrayList を使うほうが設計が楽になります。

配列とListはどちらを優先して使うべきですか?

迷ったら List(ArrayList)を優先するほうが実務に即しています。

理由は次の通りです。

  • データの追加・削除が柔軟にできる
  • ソートや検索などの便利なメソッドが豊富
  • 可変長なのでデータ件数が変わっても安心

ただし、以下の場合は配列の方が適しています。

  • データ件数が固定で変わらない
  • 処理速度を最優先にしたい(大量データの高速処理など)
  • intdouble などプリミティブ型のデータを扱う

「配列は概念を理解するために学び、実務では List を使うことが多い」というのが正直なところです。

多次元配列は実務でよく使いますか?

2次元配列は実務でも登場しますが、頻度は高くありません。

主な使い場面はこちらです。

  • CSVや表形式データの一時的な格納
  • 座標・行列計算を扱う数値処理
  • 画像処理(ピクセルデータの操作)

一般的なWebアプリ開発では、DBから取得したデータを List> のような形で扱うことの方が多いです。

2次元配列の概念を理解しておくと、こういった構造も自然と理解しやすくなりますよ。

配列の基礎さえ固めれば、実務の応用は自然と身につく

配列基礎から応用へ

今回は「プログラミングの配列」について、基本定義から宣言・for文・実務応用まで解説しました。

重要ポイントをまとめます。

  • 配列は「複数の値をまとめて管理する箱」
  • インデックスは0から始まる
  • サイズは固定、型制約あり
  • for文との組み合わせが実務の基本
  • サイズが変わる場合は ArrayList を使う

配列は一見シンプルに見えて、つまずくポイントが多い概念です。この記事で解説した基礎パターンを繰り返し書いていれば、自然と身についてきます。

まず int[] の宣言と基本的なfor文ループを、自分で書いて動かすところから始めてみてください。

配列をはじめとした基礎をしっかり身につけたい方には、実践的なカリキュラムのあるスクールも有効な選択肢の一つです。

働きながら通えるスクールを探している方は、以下の記事を参考にしてみてください。

Mirai

配列のイメージがだいぶ掴めてきた!インデックスが0始まりっていうの、絶対に忘れないようにする。

Zetto

その調子!まずは自分でコードを書いて、エラーを出して、直す。この繰り返しがプログラミング上達の一番の近道だね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次