あらためてJavaを学習する（その0）

1〜2年前にJavaを学習してから、最近はJavaScript（Node.js）やAWSといった学習がメインでJavaからは久しく離れてました。
最近Java知識が必要になる可能性が出たので、簡単に復習がてら学習を行おう！と思った次第。その備忘録として記事にしています。Qiita初投稿です。

その0では主にJava言語についてと環境構築、Hello Worldをコンソールに表示するまでの内容がメインです。

## Javaの特徴
* OSに依存しない（OS非依存）
* オブジェクト指向
* 静的型付け言語
* JVMによるメモリ管理

※C言語(1972年) → C++(1983年) → Java(1996年) の順番で登場している

## Java実行までの流れ
OS非依存を実現しているのがJava Virtual Machine(`JVM`)
人間が書いたり読んだりできるコード(`高級言語`)は機械側では理解できない。
(機械が理解できるのは0と1の羅列で構成された機械語)

C言語やJava言語といった高級言語を機械語に翻訳することを`コンパイル`と呼ぶ。
また、上記のコンパイルは全文を一括で機械語に翻訳するのに対し、処理順に機械語に翻訳しながら実行するのを`インタプリタ`と呼ぶ。

Javaの場合は少し特殊で、
1. コンパイルした際に**機械語の中間コードを作成する**。これを`バイトコード`と呼ぶ。拡張子は**.class**
2. 実行する際にバイトコードをインタプリタで機械語に翻訳して実行する。（JVMが担当）

なお、JVMはWindowsやLinuxといったOS毎に提供されており、各OS毎の機械語に翻訳される。

## Javaの最新バージョン
最新はJava SE15(2021年2月現在)
学習面では最新ではなくSE8やSE11で十分

## エディション一覧
* Java ME(Micro Edition)  
組み込み機器、モバイル向けのエディション
* Java SE(Standard Edition)  
標準のエディション、Javaを一から学習するならこれ
* Java EE(Enterprise Edition)  
サーバー向け、Web開発はこっち

## Javaのインストール

下記リンク先をスクロールしていくとSE8やSE11がDL可能
※Oracleのアカウント登録(無料)が必要
[Java SE - Downloads](https://www.oracle.com/java/technologies/javase-downloads.html)

画像のOracle JDKをクリック
![Oracle JDKのDL](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/08660398-d1bc-773b-29ca-6c23b03c6532.png)

各OS毎にJDKが用意されており、適宜OSにあったJDKをダウンロードする。
![JDK選択画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/c58d2710-47d3-452f-a400-f35f0c6f358c.png)


### Mac
1. macOS Installer右側にある**jdk-11.0.10_osx-x64_bin.dmg**をクリック
2. Oracleアカウントログインを求められるので、アカウントがない場合はここで新規登録を行う
3. ダウンロードした**jdk-11.0.10_osx-x64_bin.dmg**をクリック
![MacでのJDKインストール画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/e96d6440-2f9e-a2c6-12fe-07e3cbb1c541.png)
4. 画面の指示に従ってインストールを行う
5. ターミナルを開き下記コマンドを順に入力。どちらもバージョン表示されればインストール完了

```
java -version
javac -version
```

### Windows
1. Windows x64 Installer右側の**jdk-11.0.10_windows-x64_bin**をクリック
2. Oracleアカウントログインを求められるので、アカウントがない場合はここで新規登録を行う
3. ダウンロードした**jdk-11.0.10_windows-x64_bin**をクリック
![windowsのjdk画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/4b182973-7caa-2672-0da1-46cd99dd4b7a.png)
4. インストール先など指定がなければそのままインストール
5. インストールが完了したら、**環境変数**の設定を行う
![windows環境変数の設定1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/f00a33a7-414f-e61c-be60-cc0d2ae64de3.png)
6. **詳細設定タブ**の**環境変数**をクリック
![windows環境変数の設定2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/c504deb1-9312-4d6a-2bdf-2d9d7cf61d40.png)
7. **システム環境変数**の**Path**を選択して**編集**をクリック
![windows環境変数の設定3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/432d50a4-97bb-81af-5ac6-32de66ebbc19.png)
8. 新規ボタンを押して`jdkのインストール先¥bin`を登録する  
今回の場合は**C:¥Program Files¥Java¥jdk-11.0.10¥bin**
![windows環境変数の設定4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697106/cdfaabdc-0e4b-6cfb-e5a6-53162d1d86dc.png)

9. コマンドプロンプトを開き下記コマンドを順に入力。どちらもバージョン表示されればインストール完了

```
java -version
javac -version
```

## Hello World
おなじみのサンプルプログラム。

```java:Sample.java
public class Sample {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
```

### コンパイル

```:SE8
takuya@DEV-SERVER:~/workdir/java$ javac Sample.java
takuya@DEV-SERVER:~/workdir/java$ java Sample
Hello World
```

SE11だとソースファイルが１つで完結する場合はコンパイル(javac)せず`java ファイル名.java` で実行可能


```:SE11
takuya@DEV-SERVER:~/workdir/java$ java Sample.java
Hello World
```

## Javaファイルの作り方
もう少しクラスの内容をみていきます。
基本的な(処理を実行する)クラスファイルの記述は下記となります。

```java
class class名 {
    public static void main(String[] args){
        処理を記述;
    }
}
```

### クラスファイル
class名には`ファイルの名前`を指定する。
例）**Sample**.java → class **Sample**
なお、慣習で先頭の文字は大文字にする。
単語の組み合わせになる際は単語毎の先頭文字を大文字にする(`キャメルケース`)

`{` から `}` の間がそのクラスの内容となる。

```java:HogeSampleClass.java
class HogeSampleClass {
    // クラスの内容
}
```

### メインメソッド

```java
public static void main(String[] args){ 
    // 処理1;
    // 処理2;
    //   .
    //   .
}
```
Javaはこのメインメソッドを探して、そこに記述されている処理を順に実行していく。参考書などでは「おまじない」として紹介されがち。
クラスと同じく、`{` から `}` の間がメインメソッドの内容となり、ここに処理を書いていく。

【**おまじない**として紹介される理由】
このメインメソッドを記述する際にあれやこれやと指定しているものにはしっかりと意味がありますが、
これらは学習を進めていく内に「あ〜なるほど」と理解できます。
最初に解説を行うと逆に混乱するため、「まずはこれを書けばJavaは動く。」としたほうが良いのが大きな理由の一つだと勝手に思ってます。

### 処理の記述
プログラムで実行する処理内容を記述する。
処理の最後には`;`(セミコロン)を記述する必要がある。
Sample.javaでは「コンソール画面に"Hello World"を出力せよ」という処理が書かれている。

```java
System.out.println("Hello World");
```

## コメント
一行コメント(`//`)

```java
// コメントだよ
```

複数行コメント(`/* */`)

```java
/* 複数行だよ
 　これもコメントだよ */
```

## まとめ
今回はJavaについてとインストール方法、Javaプログラムのコンパイル〜実行までを行い、ザッとクラスについてもみていきました。