【Java復習1日目】サンプルコードから学び直すJava入門①

# サンプルコード(Hello, World)

```java:Hello.java
class HelloWorld {
    public static void main(String[] args) {
        String msg = "Hello, World!";

        // 標準出力ストリームを経由したコンソール表示
        System.out.println(msg);
    }
}
```

## System.out
`コンソール画面`と結びつく、`標準出力ストリーム`(=`Standard Output Stream`)。

### ストリーム
`コンソール画面`を含む、**外部とのデータの入出力**を行う仕組み。

***

# サンプルコード1(Scanner)

```java:InputNotExpected1.java
import java.util.Scanner;

class InputNotExpected1 {
    public static void main(String[] args) {
        // Scannerオブジェクト
        Scanner stdIn = new Scanner(System.in);

        System.out.print("Int x: ");
        // ユーザ入力を促し、変数xに代入
        int x = stdIn.nextInt();

        System.out.print("String y: ");
        // ユーザ入力を促し、変数yに代入
        String y = stdIn.next();

        System.out.print("String z: ");
        // ユーザ入力を促し、変数zに代入
        String z = stdIn.nextLine();
        
        System.out.println();

        System.out.println("x = " + x);
        System.out.println("y = " + y);
        System.out.println("z = " + z);
    }
}
```

```java:実行結果
Int x:          // <- nextInt()は改行文字をカウントしない
                // 
  1             // <- nextInt()は空白文字をカウントしない、ユーザの改行入力によって改行される
String y:       // <- next()は改行文字をカウントしない
                // 
  a  b  ;       // <- 最初のカウント文字(=a)をカウントし(後述)、ユーザの改行入力によって改行される
String z:       // <- 自動でスキップされ(スキャン範囲内にカウントするべき文字が既に存在するため)、println()によって1行分改行される
x = 1           // 実行結果: x = 1
y = a           // 実行結果: y = a
z =   b  ;      // 実行結果: z =   b  ;
```

## サンプルコード1から学ぶnext()メソッド
`Scanner.next()`および`Scanner.next<T>()`メソッドは、`区切り文字`(=`空白`・`タブ`・`改行`)を**カウントしない**(=`ノーカウント文字`)。
また、`カウント文字`が登場し、**次に**`ノーカウント文字`**が登場するまで**、`カウント文字列`を保持する。

さらに、`スキャン`範囲内の`ストリーム`に、**既に**`カウント文字`**が含まれている場合、文字の入力を受け付けない**。

# サンプルコード2(Scanner)

```java:InputNotExpected2.java
import java.util.Scanner;

class InputNotExpected2 {
    public static void main(String[] args) {
        // Scannerオブジェクト
        Scanner stdIn = new Scanner(System.in);

        System.out.print("Int x: ");
        // ユーザ入力を促し、変数xに代入
        int x = stdIn.nextInt();

        System.out.print("String y: ");
        // ユーザ入力を促し、変数yに代入
        String y = stdIn.nextLine();

        System.out.print("String z: ");
        // ユーザ入力を促し、変数zに代入
        String z = stdIn.nextLine();
        
        System.out.println();

        System.out.println("x = " + x);
        System.out.println("y = " + y);
        System.out.println("z = " + z);
    }
}
```

```java:実行結果
Int x:                         // <- nextInt()は改行文字をカウントしない
                               // 
  1                            // <- nextInt()は空白文字をカウントしない、ユーザの改行入力によって改行される
String y: String z:   a  b  ;  // <- "String y: "が自動でスキップされ(カーソルが存在する行に改行文字が含まれるため)、ユーザの改行入力によって最終的に改行される
                               // <- println()によって改行される
x = 1                          // 実行結果: x = 1
y =                            // 実行結果: y = (改行文字)
z =   a  b  ;                  // 実行結果: z =   a  b  ;
```

## サンプルコード2から学ぶnextLine()メソッド
`スキャナ`の`カーソル`**が存在する行**をカウントする。

また、`スキャン`範囲内の`ストリーム`に、**既に**`カウント対象`(=`改行文字`を含む)**が含まれている場合、文字の入力を受け付けない**。

## Scanner
`プリミティブ型`と`String型`のテキストを読み込むメソッドを定義するクラス。

### 定義

```java
// Scannerオブジェクトの生成
Scanner​(InputStream source)
// パラメータ
// source: スキャンを実行する入力ストリーム

// <T>型データの入力を読み込む
// -> 値が不適切である場合はInputMismatchExceptionが発生
<T> Scanner.next<T>()

// 区切り文字より前の入力を読み込み、スキャナのカーソルを現在の行のままにする
String Scanner.next()

// 1行分の入力を読み込み、スキャナのカーソルを次の行に送る
String Scanner.nextLine()
```

## System.in
`キーボード`と結びつく、`標準入力ストリーム`(=`Standard Input Stream`)。

***

# サンプルコード(final変数)

```java:Circle.java
import java.util.Scanner;

class Circle {
    public static void main(String[] args) {
        // 円周率を表すfinal変数
        final double PI = 3.14159265359;

        Scanner stdIn = new Scanner(System.in);

        System.out.print("radius: ");
        double x = stdIn.nextDouble();

        double area = x * x * PI;
        System.out.println(area);
    }
}
```

## final変数
`読み込み専用`(=`イミュータブル`)な変数。
`読み書き可能`(=`ミュータブル`)な変数と区別するため、**大文字**で記述する。

***

# サンプルコード(乱数)

```java:Rand.java
import java.util.Random;

class Rand {
    public static void main(String[] args) {
        // Randomオブジェクト
        Random rand = new Random();

        // 0-14のint型乱数
        int num = rand.nextInt(15);

        System.out.println(num);
    }
}
```

## Random
`種`(=`シード`)に対して`線形合同法`によって生成された`疑似乱数`を生成するクラス。

### 定義

```java:Randomオブジェクトの生成
// シードを指定せずRandomオブジェクトを生成
// -> 他のRandomオブジェクトと異なるシード値が割り当てられる
Random()

// シードを指定してRandomオブジェクトを生成
Random(long seed)
// パラメータ
// seed: シード値
```

### 疑似乱数の生成メソッド

|`Random`クラスメソッド|型|範囲|
|:--|:--|:--|
|`nextBoolean()`|`boolean`|`true`/`false`|
|`nextInt()`|`int`|`int`型の表現可能範囲|
|`nextInt(int bound)`|`int`|0 ≦ x < bound|
|`nextLong()`|`long`|`long`型の表現可能範囲|
|`nextDouble()`|`double`|0.0 ≦ x < 1.0|
|`nextFloat()`|`float`|0.0 ≦ x < 1.0|

***

# 用語集

|用語|内容|
|:--|:--|
|式(expression)|`変数`・`リテラル`・`変数`や`リテラル`を演算子で結合したもの|
|識別子(identifier)|`変数`・`メソッド`・`クラス`などに付与する名前|