【Java Silver】2次元配列 length 解説

Java silver se11の試験対策で黒本を解いていた際のlenthの動きをまとめました。

:::note
初心者向け
:::

# 2次元配列 length
◼︎ 黒本 第12章 総仕上げ問題① 

```
80.次のプログラムをコンパイル、実行したときの
   結果として、正しいものを選びなさい。
  （1つ選択）
```

```java: 問題80
public class Test {
  public static void main(String[] args) {
     String[][] arrays = new String[2][];
     array[0] = new String[2];
     array[1] = new String[5];
     int i = 97;
     for (int a = 0; a < array.length; a++) {
       for(int b = 0; b < array.length; b++) {
         array[a][b] = "" + i ;
         i++;
       }
     }
     for (String[] tmp : array) {
       for(String s : tmp) {
         System.out.print(s + "");
        }
       System.out.println();
     }
   }
}
```

```
A. 97 98
   99 100 null null null
B. 97 98
   99 100 101 102 103
C. コンパイルエラーが発生する
D. 実行時にNulIPointerExceptionがスローされる
E. 実行時にArrayindexOutofBoundsExceptionが
   スローされる
```
<font color="red">**答え: A**</font>

# 1行ずつ解説
```java: 問題80 解説
public class Test {
//Testという名前のパブリッククラスを定義
  public static void main(String[] args) {
  /* プログラムのエントリポイントであるmainメソッドを定義
  　プログラムはここから開始 */
     String[][] arrays = new String[2][];
     /* arrayという名前の2次元配列を宣言
        2列の配列を持つが、まだ各行の配列は
        決まっていない
     */
     array[0] = new String[2];
     //arrayの0行目に2列の配列を割り当て
     array[1] = new String[5];
     //arrayの1行目に5列の配列を割り当て
     int i = 97; //整数変数iを97(文字コードa)で初期化
     for (int a = 0; a < array.length; a++) {
     //外側のforループ 各行の列数だけ繰り返す
       for(int b = 0; b < array.length; b++) {
       //内側のforループ 条件がarray.lengthになっている
       /* 各行の配列array[a].lengthを使う必要がある
       　　2列名以降が初期化されずnullのままになる */
          array[a][b] = "" + i ;
          //array[a][b]に文字列としてiの値を代入
          i++;
          //iをインクリメントして次の文字コードにする
       }
     }
      for (String[] tmp : array) {
      //拡張forループを使ってarrayの各行をtmpに取り出す
        for(String s : tmp) {
        //拡張forループを使って各行の各要素をsに取り出す
           System.out.print(s + "");
           //各要素String sを出力
        }
        System.out.println();
        //各行を出力した後に改行する
      }
   }
}
```


### nullが出力される理由
arrayの0行目は2列、1行目は5列だが、内側のforループがarray.lengthを条件にしているため、各行の列数を正しく処理出来ていない
そのため以下のように配列の一部のみが初期化され、他はnullのままとなる
•array[0][0]とarray[0][1]には値が入るが、それ以外の列は初期化されない
•array[1][0]とarray[1][1]にも値が入るが、それ以外の列array[1][2]、array[1][3]、array[1][4]は初期化されずnullのまま
そのため出力結果は以下のようになる

<font color="#39FF14">**97 98
99 100 null null null**
</font>

# 拡張for文と通常のfor文の違い
### 通常のfor文
ループの初期化・条件・更新部分を自分で指定する
```java: 例文
for (int i = 0; i < array.length; i++) {
     System.out.println(array[i]);
}
```
・int i = 0;で初期化
・i < array.length;が条件
・i++で更新

### 拡張for文
コレクションや配列の全ての要素に対して
繰り返し処理を行うために使う
```Java: 例文
for (String element : array) {
     System.out.println(element);
}
```
arrayの各要素をelementとして順に取り出す
### それぞれの違い
•拡張for文はシンプルで読みやすいが、インデックス(位置)にアクセス出来ない
•通常のfor文は柔軟でインデックスの操作が可能

### 文字コードと文字
コンピュータでは、文字を数値（文字コード）で表す。たとえば、‘A’の文字コードは65

```Java:
char ch = 65; // 文字コード65に対応する文字 'A'
System.out.println(ch); // 'A'が出力される
```


文字から文字コードへの変換
文字を数値に変換する場合、キャスト（型変換）を使う
```Java: 
char ch = 'A';
int code = (int) ch; // 'A'を整数に変換
System.out.println(code); // 65が出力される
```
### 配列の読み方
1次元配列

1次元配列は単純なリストのイメージ
```Java:
int[] array = {1, 2, 3, 4};
System.out.println(array[0]); // 1
System.out.println(array[1]); // 2
```
•array[0]は最初の要素。
•array[1]は2番目の要素。

2次元配列

2次元配列は行と列を持つ表のようなイメージ
```Java:
int[][] array = {
    {1, 2, 3},
    {4, 5, 6}
};
System.out.println(array[0][0]); // 1
System.out.println(array[1][2]); // 6
```
•array[0][0]は1行目の1列目の要素。
•array[1][2]は2行目の3列目の要素。