JavaSilver_躓いた問題をまとめてみた④ 配列その1

f:id:nowa0402:20210524141506p:plain
こんにちは。のわです。
今回は、Javaの配列についてまとめたいと思います。


最初に配列の基本的なルールについてまとめます。
先に今回のポイントを記述します。

 ・配列定義時は要素数・または要素を明確にする
 ・変数宣言に要素数を入れない

実際のコードを見ながら確認していきます。



配列の生成方法にはいくつかパターンがあります。

public class Main {
	public static void main(String[] args) {
   
   // パターン1 配列インスタンスを生成後に要素を代入する
   int[] array1 = new int[2]; 
   array1[0] = 1;
   array1[1] = 2;
   for(int i : array1) {
       System.out.println(i);
   }
   
   // パターン2 配列インスタンス生成と同時に要素を代入する
   int[] array2 = new int[]{3,4};
   for(int i : array2) {
       System.out.println(i);
   }
   
   // パターン3 パターン2を簡略化したもの
   int[] array3 = {5,6};
   for(int i : array3) {
       System.out.println(i);
   }
   
   //パターン4 配列変数を宣言してから、配列インスタンスを生成
   int[] array4;
   array4 = new int[]{7,8};
   for(int i : array4) {
       System.out.println(i);
   }
   
 }
}

コードの解説です。
このコードでは、4つのパターンで配列を生成しています。
生成した配列に要素を入れ、for文で一個ずつ取り出して出力するものです。

記述方法はそれぞれ違いますが、やっていることは一緒です。



なお、配列を記述する際に使われる『[]』大カッコですが、変数名のあとにつけても大丈夫です。
Java以外の言語から来た人でも、柔軟にコードをかけるようにしている為だそうです。

public class Main {
	public static void main(String[] args) {
      
   // パターン5 パターン3の大カッコを変数のあとにつける
   int array5[] = {9,10};
   for(int i : array5) {
       System.out.println(i);
   }
   
 }
}

ここで注意したいのが
どのパターンも『配列インスタンス生成時、要素数・または要素が確定している』ことです。
つまり、配列インスタンスを生成するとき
『要素数がいくつ入っているか不明だとコンパイルエラー』になります。


実際のNGコードでみてみます。

public class Main {
	public static void main(String[] args) {
   
   // NGパターン1 配列宣言時に要素数が確定していない
   int[] arrayNg1 = new int[];

 }
}

このコードでは配列インスタンス生成時に素数を確定させていません
そのため、コンパイルエラーになります。

もう一つ別の例をみてみましょう

public class Main {
	public static void main(String[] args) {
   
   // NGパターン2 要素数と要素を同時に定義している
   int[] arrayNg2 = new int[2]{1,2};

 }
}

このパターンは配列インスタンス生成時に要素数と要素どちらも定義しています。
配列インスタンス生成時は『要素数または要素どちらかを明確にする』ことになっています。
そのため、どちらも定義しているとコンパイルエラーになります。



次に、ちょっと特殊なコードを紹介します。

public class Main {
	public static void main(String[] args) {
   
   // パターン6 要素数が0の配列を生成する その1
   int[] array6 = new int[0];
   
   // パターン7 要素が無い配列を生成する その2
   int[] array7 = {};
   
 }
}

この配列は要素数が0、要素が無い配列を生成しています。
一見するとコンパイルエラーになりそうです。


こちらのコード、実はコンパイルが通ります。
なぜなら
『要素数が0と明記されている配列』
『要素が無いと明記されている配列』

であり、配列定義の要件を満たしているからです。

ただし、この配列はなんの意味も持ちませんけど...



次に、別なNGコードです。

public class Main {
	public static void main(String[] args) {
   
   // NGパターン3 配列変数側に要素数を入れている
   int[2] arrayNg3 = {5,6};

 }
}

このNGパターンは配列宣言側に要素数を入れています。
変数宣言側は『私はこういった型です』といった宣言をするものです。
そのため、変数宣言側に具体的な数値をいれるとコンパイルエラーになります。




次に多次元配列についてまとめます。
多次元配列は『配列の中にさらに配列がある』状態です。
実際にコードを見てみましょう。

public class Main {
	public static void main(String[] args) {
   
   // 多次元配列パターン1
   int[][] arrays1 = new int[2][3];
   arrays1[0] = new int[]{1, 2, 3};
   arrays1[1] = new int[]{4, 5, 6};
   for(int[] i : arrays1) { //1次元目の配列を取り出す
        for(int ii : i) { //2次元目の配列を取り出す
            System.out.println(ii);
        }
   }

   // 多次元配列パターン2
   int[][] arrays2 = new int[][]{{7, 8, 9}, {10, 11, 12}};
   for(int[] i : arrays2) { 
        for(int ii : i) { 
            System.out.println(ii);
        }
   }
   
 }
}


多次元配列も変数宣言の[]大カッコはどこに置いても大丈夫です

public class Main {
	public static void main(String[] args) {
   
   // 多次元配列パターン3 大カッコの場所が変わった
   int[] arrays3[] = new int[2][3];
   arrays3[0] = new int[]{1, 2, 3};
   arrays3[1] = new int[]{4, 5, 6};
   for(int[] i : arrays3) { 
        for(int ii : i) { 
            System.out.println(ii);
        }
   }

   // 多次元配列パターン4
   int arrays4[][] = new int[][]{{7, 8, 9}, {10, 11, 12}};
   for(int[] i : arrays4) { 
        for(int ii : i) { 
            System.out.println(ii);
        }
   }
   
 }
}


多次元配列の特徴として、
『1次元配列の要素数が決まっていれば2次元要素数は不明でもOK』というルールがあります。
それが次のコードです。

public class Main {
	public static void main(String[] args) {
   
   // 多次元配列パターン5 生成時に1次元だけ宣言しておく
   int[] arrays5[] = new int[2][];
   arrays5[0] = new int[]{1, 2, 3};
   arrays5[1] = new int[]{4, 5, 6};
   for(int[] i : arrays5) { //1次元目の配列を取り出す
        for(int ii : i) { //2次元目の配列を取り出す
            System.out.println(ii);
        }
   }

 }
}


上記コードの場合、1次元配列の要素数だけ先に決め
その後で2次元配列の要素を入れています。


なお、その逆はコンパイルエラーになります。

public class Main {
	public static void main(String[] args) {
   
   // NG多次元配列パターン 生成時に2次元だけ宣言しておく
   int[] arraysNg[] = new int[][3];

 }
}




今回は配列についてまとめました。
 おさらいです
 ・配列生成時は『要素数または要素が決まっている』状態にする。
 ・要素数0、要素が無い配列を作成することも可能
 ・多次元配列は『1次元配列の要素数が決まっている』ことが生成の条件


JavaSilverの勉強をしていて一番理解が足りていない箇所だと痛感しまとめてみました。
配列を理解したい方への助けになれば幸いです。


今回も最後まで読んでいただきありがとうございました!!