Java配列

# 配列
初心者向けの配列の説明です。

## 1．配列とは
- プログラムの中で同じ型の値を複数まとめて記憶しておく機能のことです
- 配列を使うと、たくさんのデータを処理する複雑なコードをすっきりと記述できます

## 2．配列の用意
配列を扱うための用意を行います。

### 作業１.配列を扱う変数（配列変数）を用意する
-  **配列変数** とは配列を扱う変数のことです
- この配列変数を用意することを**配列の宣言**と言います

### 作業２.値を格納するハコ（配列の要素）を用意する
-  **配列の要素** とは値を格納する配列のハコのことです
- ハコを用意する作業のことを **配列要素の確保** と呼びます
-  **`new`** という演算子を使って `[]` 内に指定した数だけ配列のハコを用意できます
-  **`int`** 型の配列を作成した直後は、すべての要素が自動的に初期値 **`0`** で初期化されます

▼ソースコードの例は、価格を複数持つための配列の取り扱いです。

```java
int[] price; // int型の配列変数の宣言

// int型の値を5つ記憶出来る配列要素を"new"という演算子を使って確保
price = new int[5];
```

上記のソースコードは、イメージでは以下のようになります。
![画像＿配列ハコ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/d9f7604e-8542-ab33-21c5-f6efff1fe9ef.png)
※5つのハコがある配列変数 `price` を用意

## 3. 配列変数への値の代入
配列の各要素に値を個別に代入する方法を説明します。
配列を宣言して要素を確保したので、次は値を格納しましょう。
プログラムの実行中に必要な値を代入することで、配列の各要素を利用することができます。

▼用意した配列変数にそれぞれの価格を入れます。

```java
// 配列要素に1つずつ値を代入して配列に値を記憶させる
price[0] = 180; // 1番目のハコ
price[1] = 260; // 2番目のハコ
price[2] = 322; // 3番目のハコ
price[3] = 500; // 4番目のハコ
price[4] = 750; // 5番目のハコ
```

上記のソースコードは、イメージでは以下のようになります。
![画像＿配列ハコ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/0ade7316-d5b9-0d77-8983-466ab56efd46.png)
- `[]` 内の番号は、**添字（index）** と呼ばれ、配列のハコを特定できます
- **Java**の配列要素の添字は **`0`** からスタートします
- 配列に値を記憶させるには、添字の箇所に要素番号を指定して値を代入します

しかし、これが例えば100個以上のデータを記憶させるとなった場合、沢山の配列要素が登場してコードが冗長になり、読みにくくなってしまいます。

```java
price[0] = 180;
price[1] = 260;
price[2] = 322;
price[3] = 500;
// ...
//price[4] から price[109] まで省略
// ...
price[110] = 350;
//  このように、100個以上の配列の要素に値を代入しなければなりません
```

ひとつひとつ配列の要素に代入する記述量を減らすために、配列の初期化というものがあります。

## 4．配列の初期化
**配列の初期化**では、**配列の宣言・要素の確保・値の代入を同時に行うこと**ができます。
これにより、簡潔にコードが書けます！

```java
// 5つの配列要素を初期化
int[] price = { 180, 260, 322, 500, 750 };
```

配列の初期化を使って、コード量を減らすことが出来ました。

注意点は、配列の初期化の場合だと要素数の指定をしていません。
また、 **`new`** という演算子も使用していません。  
`{}` 内の値の数だけ自動的に配列の要素が確保されます。

## 5．配列の活用編
配列は繰り返し文と一緒に使うと、とても便利です。  
繰り返し文を使って、複数の商品の値段を出力するコードを見てみましょう！

```java
class Price1 {
    public static void main(String[] args) {

        int[] price = { 180, 260, 322, 500, 750 };

        // 繰り返し文を使って配列の要素を出力
        for (int i = 0; i < 5; i++) {
            System.out.println((i + 1) + "番目の価格は" + price[i] + "円です。");
        }
    }
}
```

**実行結果**
>![画像＿実行結果1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/10c5cc0b-8e55-a9bb-7226-31f2d3eeaf4f.png)

このように、繰り返し文を使って配列変数の要素を出力することでコードが簡潔になり、可読性も向上しています。

## 5．配列変数のしくみ

さらに詳しく配列変数について見てみましょう。  

配列変数は **`new`** という演算子を使って要素を確保する以外にも **代入演算子** を使って代入することが出来ます。

```Java
class Price2 {
    public static void main(String[] args) {
        int[] price1;
        price1 = new int[3];

        System.out.println("price1を宣言しました。");
        System.out.println("配列要素を確保しました。");

        // 配列に値を代入
        price1[0] = 180;
        price1[1] = 260; 
        price1[2] = 322;

        // 配列変数price2だけ用意
        int[] price2;
        System.out.println("price2を宣言しました。");

        // 配列変数price2に配列変数price1を代入
        price2 = price1;
        System.out.println("price2にprice1を代入しました。");

       for (int i = 0; i < 3; i++) {
           System.out.println("price1がさす" + (i + 1) + "番目の価格は" + price1[i] + "円です。");
        }

        for (int i = 0; i < 3; i++) {
            System.out.println("price2がさす" + (i + 1) + "番目の価格は"+ price2[i] +"円です。");
        }
    }
}
```

**実行結果**
>![画像＿実行結果2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/7928c1ec-e79c-07de-d1f4-ab24fd33e4bc.png)

`price2` の値は `price1` と同じものが出力されます。  
配列変数はこのように **別の配列変数を代入することもできる** のです。  
ただ、注意として `price1` の値を変更した場合には `price2` の値も変更されてしまいます。  
つまり、代入された左辺の配列変数が、右辺の配列変数のさしている配列をさすようになります。  
**一方の配列変数の変更はもう一方にも及ぶ** という仕組みがあることを理解しておきましょう。

![画像＿配列ハコ３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/e232d23a-9c3e-1b5a-ff04-e79a069f8e99.png)

## まとめ
配列を使うと、同じ種類の多くのデータをまとめて管理することが出来ます。  
配列のしくみはJavaには欠かせないものになるので、まずは簡単な例からトライしてみましょう！