【Java開発環境構築】macOSにHomebrewでOpenJDK 11（Java 11）をインストールする

#目的

Javaの学習を始めたばかりで概要を理解したい、ローカル開発環境を構築したい。

OS：macOS Mojave バージョン10.14.6
テキストエディタ：Visual Studio Code（以下VSCode）

#Javaの概要

大規模なシステム（金融機関の会計システムなど）や携帯端末向けアプリケーションなど、様々な開発に利用されている言語。

##①Write Once, Run Anywhere（一度書けばどこでも動く）
JavaのプログラムはOS上で直接動くのではなく、`JVM（Java Virtual Machine：Java仮想マシン）と呼ばれる実行環境上で動く。`
だから、`OSとの間に依存関係がなく`、プログラムを作る時にWindowsやMacといったOSの違いを気にする必要がない。

Java言語を使用したプログラム作成、実行の流れは以下になる。

>1.Java言語で決められたルールに従って書かれたソースファイルを作成。
>　↓ コンパイル（javacコマンド = javaのcompiler）
>2.クラスファイルになる。（JVMが解釈出来るファイルが生成される）
>　中間ファイルであるクラスファイルは、バイトコードと呼ばれる実行可能なバイナリで記述される。
>　↓実行（javaコマンド）
>3.JVM上で実行される
>　バイトコードはOSにインストールされたJVMが解釈して実行してくれる。
>

後述のOpenJDKをインストールする事で、javacコマンド、javaコマンドを使用する事が出来るようになり、プログラムが実行されるようになる。 



##②オブジェクト指向
オブジェクト指向は、大規模開発におけるこのようなさまざまな問題を解決するために作られた考え方。

プログラムの機能や役割を区別して、それぞれを部品として組み合わせる事で一つのプログラムを作成する。

原則としては以下がある。

>1.独立していて（カプセル化）
>　出来るだけ他のプログラムに干渉しないようにする仕組み。
>2.再利用性が高く（継承）
>　同じような振る舞いをする部分はまとめてしまい（親クラス）、まとめた物を再利用する（子クラス）事でコードの重複を減らせる。
>3.拡張しやすい（ポリモーフィズム）
>　同じ振る舞いをする部分は共通化しつつも、違う振る舞いにしたい部分は目的に合わせて変えられる。
>


#開発環境の構築

Javaの開発環境は、JDK（Java SE Development Kit）を使用して構築します。
Oracle JDK、OpenJDKなど様々ある。

今回はJDKを使用する為にターミナルで以下のインストールを行います。
・Homebrew
・homebrew-cask
・homebrew-cask-versions
・OpenJDK 11

##Homebrewのインストール

macOS 用パッケージマネージャである、Homebrewのインストールからします。
`Homebrewを使うとオープンソースソフトウェアをターミナルからインストール、アンインストールが出来るようになります。`

**[Homebrewの公式](https://brew.sh/index_ja)**

```:Terminal
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
==> The following existing directories will be made group writable:
/usr/local/bin
/usr/local/include
/usr/local/lib
/usr/local/share
/usr/local/share/doc
/usr/local/share/man
〜以下略〜
```
インストールの最中に、`PCのパスワードを２回聞かれるので入力`してください。

```:Terminal
$ brew --version
Homebrew 2.2.15
Homebrew/homebrew-core (git revision aafb6c8; last commit 2020-05-08)
```
`Homebrewのインストール完了!`

##homebrew-caskのインストール

次にHomebrewの拡張コマンドであるhomebrew-caskをインストールします。
`ターミナルからGUIアプリをインストール出来るようになります。`

ブラウザでアプリをダウンロードして、ダウンロードフォルダのdmgファイルを展開して、
Applicationフォルダに移動させて...っていう流れが不要になる。

**[homebrew-caskのGitHub](https://github.com/Homebrew/homebrew-cask)**

```:Terminal
$ brew cask
==> Tapping homebrew/cask
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 437237 (delta 2), reused 0 (delta 0), pack-reused 437230
Receiving objects: 100% (437237/437237), 196.54 MiB | 79.00 KiB/s, done.
Resolving deltas: 100% (309524/309524), done.
〜以下略〜
```
今回はパスワードは聞かれません。

```:Terminal
$ brew --version
Homebrew 2.2.15
Homebrew/homebrew-core (git revision aafb6c8; last commit 2020-05-08)
Homebrew/homebrew-cask (git revision 9fc819; last commit 2020-05-08)
```

`homebrew-caskのインストール完了！`


##homebrew-cask-versionsのインストール

バージョンを指定してインストールすることが可能になる。（複数バージョン管理が出来るようになる）

**[homebrew-cask-versionsのGitHub](https://github.com/Homebrew/homebrew-cask-versions)**


```:Terminal
$ brew tap homebrew/cask-versions
Updating Homebrew...
==> Tapping homebrew/cask-versions
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask-versions'...
remote: Enumerating objects: 73, done.
remote: Counting objects: 100% (73/73), done.
remote: Compressing objects: 100% (61/61), done.
remote: Total 225951 (delta 39), reused 19 (delta 12), pack-reused 225878
Receiving objects: 100% (225951/225951), 58.32 MiB | 79.00 KiB/s, done.
Resolving deltas: 100% (155423/155423), done.
Tapped 151 casks (198 files, 64.6MB).
```

今回もパスワードは聞かれません。

`homebrew-cask-versionsのインストール完了！`


##OpenJDK 11のインストール

いよいよOpenJDK 11をインストールします。
現在のJavaのversionを確認します。

```:Terminal
$ java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
```

そして、以下コマンドを入力。

```:Terminal
$ brew cask install java11
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
aws-cdk                 gitlab-runner
==> Downloading https://download.oracle.com/java/GA/jdk11/9/GPL/openjdk-11.0.2_o
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'java11'.
==> Installing Cask java11
==> Moving Generic Artifact 'jdk-11.0.2.jdk' to '/Library/Java/JavaVirtualMachin
Password:
java11 was successfully installed!
```

今回はパスワードは1度だけ聞かれるので入力してください。

```:Terminal
$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

$ javac -version
javac 11.0.2
```

`OpenJDK 11のインストール完了！`


##コンパイル→実行 が出来るか確認してみる

Java作業用フォルダを作成して、VSCodeを開く。
そのフォルダ内に、Hello.javaというファイルを作成する。

>java_practice
>　　└  Hello.java

今回はターミナルにHello Worldと出力させる。

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

冒頭で説明した通り、
ソースファイルをjavacコマンドでコンパイルしてクラスファイルを作成。

```:Terminal
$ javac Hello.java
$ ls
Hello.java     Hello.class ←作成された！
```
>java_practice
>　　├　Hello.java
>　　└　Hello.class　←作成された！


クラスファイルをjavaコマンドで実行してHello Worldを出力する。
`.classの拡張子はつけない。`

```:Terminal
$ java Hello
Hello World ←出力された！
```

無事実行されました。お疲れ様でした！