[day: 5]Javaの基本をまとめました

# Javaの基本をまとめました
Javaの基本構文を確認できるチートシートとして作成しました。
## 出力
```java
System.out.println("Hello World");

//文字列と数値を一緒に出力すると数値は文字列に自動変換される
Ststem.out.println("私は" + 20 + "歳です");
//私は20歳ですが出力される
```

## コメントアウト
```java
// コメントアウト
```

## データ型
文字列や整数などの型をデータ型という
文字列: String
整数：  int

## 変数
### 変数の定義

```java
//データ型変数名の順番で宣言する
String name;

//変数に値を代入する
name = "佐藤";

//佐藤が出力される
System.out.println(name);
```

### 変数の初期化
変数の定義と代入は同時に行うことができる。

```java
//Stringのデータ型で変数名nameに佐藤の値を代入
String name = "佐藤";

//佐藤が出力される
System.out.println(name);
```

### 変数の再定義と再代入
再定義は不可能

```java
//変数numberを定義
int number = 1;

//もう一度変数numberを定義するとエラーになる
int number = 1;
```
再代入は可能

```java
//numberの値は1
int number = 1;

//numberの値は2(値が上書きされている)
number = 2;
```
### 自己代入
```java
//numberに1を代入
int number = 1;

//元の値である1を利用して、さらにそこに1を足した数をnumberに再代入する
number = number + 1;

//2が出力される
System.out.println(number);
```
この書き方には省略形がある

```java
number += 1;  //number = number + 1;
number -= 1;  //number = number - 1;
number *= 1;  //number = number * 1;
number /= 1;  //number = number / 1;
number %= 1;  //number = number % 1;
```
### キャスト
求める型が変数の型と異なるときに強制的に型を指定することができる。これを`キャスト`と呼ぶ。

```java
int number1 = 1;
int number2 = 2;
System.out.println((double)number1 / number2);
//(double)をつけたnumber1は強制的に1.0に変換される
``` 
## 条件分岐
### if
if文の基本形

```java
if(条件式1){
  条件式1がtrueなら実行する処理
} else if(条件式2){
  条件式2がtrueなら実行する処理
} else {
  上記の条件が全てfalseなら実行する処理
}
```
### switch
switch文の基本形
`break`はswitch文を抜け出すために必要な記述。これが無いと全ての処理を実行してしまう。

```java
switch (処理){
  case 値1:
    処理の戻り値が値1なら実行する処理
    break;
  case 値2:
    処理の戻り値が値2なら実行する処理
    break;
  default:
    どのcaseにも当てはまらない場合に実行する処理
    break;
}
```
## 繰り返し処理
### while
whileの基本形
条件がtrueで有る限り処理を繰り返し行うことができる。
条件はいつかはfalseになるように設定しないと無限ループしてしまう。

```java
while(条件){
  条件がtrueなら実行する処理
}
```

記述例
変数numberの値が100以下ならばそのnumberを出力する繰り返し処理

```java
int number = 1;

while(number <= 100){          //numberが100以下ならtrueを返す
  System.out.println(number);  //numberの値を出力
  number ++;                   //numberに1を足す
}
```

## for
forの基本形

```java
for(変数の定義; 条件; 値の更新){
  条件がtrueなら実行する処理
}
```
記述例
変数numberの値が100以下ならばそのnumberを出力する繰り返し処理

```java
for(int number; number <= 100; number ++){
  System.out.println(number);
}
```

### 繰り返し処理の強制終了
繰り返し処理の中で`if文`と`break`を使うことで特定の条件になったら処理を終了させることができる。

```java
//numberの値が100以下ならnumberを出力する繰り返し処理
for(int number = 1; number <= 100; number ++){
//条件分岐でnumberの値が5ならば繰り返し処理を強制終了させる
  if(number == 5){
    break; //繰り返し処理の強制終了
  }
}
```

### 特定の繰り返し処理をスキップ
繰り返し処理の中で`if文`と`continue`を使うことで特定の値の場合の処理をスキップできる。

```java
//numberの値が100以下ならnumberを出力する繰り返し処理
for(int number = 1; number <= 100; number ++){
//条件分岐でnumberの値が5ならば処理をスキップしつつ繰り返し処理を続行する
  if(number == 5){
    continue; //次のループを開始する
  }
  System.out.println(number);
}
//今回の処理では値が5の場合のみ出力されない
```    
## 配列
値をまとめて配列として変数に代入することができる。
その際にデータ型は配列を表すために`[ ]`がつくことに注意。
また、値は`{ }`で囲んで、それぞれの値は`,`で区切られる。
`[ ]`と`{ }`を間違えないように注意する。

```java
//数字の配列であるnumbersを定義する
int[] numbers = {1, 2, 3, 4, 5};
```

配列には`インデックス番号`が付与される。
これは配列に入っている値の順番を意味しており、`0`からスタートする。
例えば配列の1番目の要素のインデックス番号は0である。
配列のインデックス番号を指定することで特定の値を取り出すことができる。

```java
int[] numbers = {1, 2, 3, 4, 5};

//配列numbersの1番目の要素を指定する
System.out.println(numbers[0]);
//1が出力される
```
### 拡張for
配列用の繰り返し処理として拡張for文が用意されている
拡張for文の基本形

```java
//数字の配列であるnumbersを定義
int[] number = {1, 2, 3, 4, 5};

//numbersの要素を順番に一つずつnumに代入しながらforで繰り返し処理を行う
//forの処理は配列の要素の数だけ行う
for(int num: numbers){
  System.out.println(num);
}
//結果として配列にある全ての値が出力される
```
## メソッド
### メソッドの定義
メソッドは処理をまとめたもの。
必ずclassの中に定義すること。
呼び出すことでそのメソッドでまとめられた処理を実行することができる。
`return`で戻り値を指定することで呼び出し元に値を返すことができる。

メソッド定義の基本形

```java
public static 戻り値のデータ型 メソッド名(データ型 引数名){
  実行する処理
  return 戻り値として返す値
}
```
### メソッドのオーバーロード
原則として同じメソッド名を定義することはできない。これはどのメソッドを実行すれば良いのかわからなくなってしまうためである。
引数の型や数が異なるのであれば同じメソッド名を定義することができる。
## クラス
クラス名は大文字から始める。
クラスを定義するファイルは`クラス名.java`とする。
他のクラスのメソッドを呼び出す際には`クラス名.メソッド名()`とする。
クラスはオブジェクト指向の概念であるオブジェクトの設計図。
その設計図から作られた子どもがインスタンスと呼ばれる。

```java
class Main{
  public static void main(String args[]){
    //UserクラスのsayHello()メソッドの呼び出し
    User.sayHello()
  }
}
```
### ライブラリ
他の人が作ったクラスをライブラリという。
ライブラリを活用することで開発の幅が広がる。
#### インポート
ライブラリを使用できるようにファイルに読みませること。
元々すでにJava自体が読み込んでいて使用できるようになっているクラスもある。

```java
//LocalDateクラスを読み込む
import java.LocalDate

class Main{
  //省略
}
```
## オブジェクト指向
現実世界のモノは情報と振る舞いを持っている。
それを表現するためにクラスを定義している。
※詳しくは別の資料を参考にしてください。この記事ではJavaの基本文法のチートシートに重きをおきます。

### インスタンスの生成
```java
//Personクラスのインスタンスをpersonという名前で生成
Person person = new Person();
```

### インスタンス
#### インスタンスフィールド
インスタンスが持つ情報を`インスタンスフィールド`

```java
//インスタンスフィールドの定義
public String name;
```

```java
//インスタンスフィールドに値をセットする
person.name() = "佐藤";
```
##### this
`this`を使用する自身が持つインスタンスフィールドの値にアクセスできる。

```java
class Person {
  //インスタンスフィールドにnameをセット
  public String name;
  //コンストラクタを定義
  Person(String name){
    //インスタンスフィールドのnameに引数で受けとたnameを代入
    this.name = name;
  }
}
```
##### コンストラクタ
インスタンスの生成時に実行される処理を定義できる。
定義の基本形

```java
class Person {
  クラス名(引数のデータ型 引数){
    処理
  }
}
```

`this()`を使用すると別のコンストラクタを呼び出すことができる。
これを利用することでコンストラクタで重複する部分を共通化することができる。

```java
//別のコンストラクタを飛び出して、このコンストラクタで定義できる。
this(引数, 引数);
```
#### インスタンスメソッド
インスタンスが持つ振る舞いを`インスタンスメソッド`と呼ぶ。
インスタンスメソッドはクラスに定義しているが、実際はインスタンスに属している。
`static`はいらない

```java
public void hello(){
  System.out.println("hello");
}
```

```java
//インスタンスメソッドの呼び出し
person.hell();
```
### クラスフィールド
インスタンスフィールドはインスタンスに属する値ですが、クラスに属するクラスフィールドも定義できる。
インスタンフィールドと異なり`static`が必要になるので注意。
クラスフィールドの基本形

```java
class Person {
  public static データ型　クラスフィールド名;
}
```

クラスフィールドへのアクセスは`クラス名.クラスフィールド名`で行う。

```java
クラス名.クラスフィールド名
```
### カプセル化
書き換えて欲しく無いものを隠すことができる。
クラスの外からアクセスできないようにするには`private`を指定することで実現できる。
クラスの外からアクセスできるようにするには`public`を指定する。
### ゲッター
privateで指定した値を安全に取り出すためにメソッドとして定義したもの。
`getフィールド名`とするのが一般的。
### セッター
privateで指定した値を外から書き換えるために定義するメソッドのこと。
`setフィールド名`とするのが一般的。