意外と誰も教えてくれないIntelliJ IDEAの使い方(基本から応用まで)

# はじめに
IntelliJ IDEAを使い始めた初心者さん向けになるサイトとか記事は少ないなぁと思い書こうと思った次第。

少し本題とは外れて小話を。
IntelliJ IDEAを使い始めて「日本語化できないの？」という人をちらほら見かけますが、英語は怖いものではありません。
IntelliJ IDEAで使われている多くの英文は中学生でもWeb辞書片手に読める程度です。
例えばこのトップ画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/63e23b68-180e-fd6c-bcd6-46fd8807814c.png)
一番下の`Check out from Version Control`はバージョン管理システムを触ったことがなければ難しいかもしれませんがほかはある程度意味がわかるはずです。
> 大抵の初心者さんは最初の起動時に出てくる`Tip of the Day`を見て幻滅するという噂を聞きますが、これはその名の通り`今日の豆知識`です。豆知識なんているときに覚えればOK!

(どうせJavaのStackTraceも英語だし多少の英語力をつけるという意味でなれるのがおすすめです)

以下の記事内、基本的にJavaを主言語として扱います。(IDEAはJava IDEなので)
適度に読み替えてね。

# 使い方
インストール、JDK導入などは他の記事をどうぞ。

## プロジェクト作成
起動すると`Welcome to IntelliJ IDEA`ウィンドウが表示されます。(多少項目が多かったり少なかったりするのは気にしなくてOK)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/63e23b68-180e-fd6c-bcd6-46fd8807814c.png)
`Create New Project`を選択すると`New Project`ウィンドウが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/7e2a52a8-83b2-706b-51ff-95763efedd94.png)
> 上の`Project SDK`に何も選択されていない場合は選択するか、`New...`をクリックしてJDKのフォルダを選択してください。

`Additional Libraries and Frameworks`は何も選択せず`Next`をクリックします。

> 他の言語で開発を行う場合は基本的に`Plugin`を導入します。するとこの`New Project`の左メニューに言語名が(大抵は)増えるのでそこから選びましょう。

画面が変わり、このような画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/998b71b0-c1f0-72f9-879d-3b44965e44a9.png)
今回は`Create project from template`にチェックを入れ`Java hello World`を選択します。

`Next`をクリックし`Project name`, `Project location`に好きな値を入力しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/360f1416-fe44-7c7a-d661-628d8e0c1c9a.png)
`Finish`をクリック！
> `Directory Does Not Exist`が表示されたら`OK`をクリック。
(フォルダ無いけど作っていい？って聞かれてます)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/334bb771-d2dd-e6be-4cb2-89fd1ebbb510.png)

こんな画面が出てきたらプロジェクト作成完了です。

> 左下の![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/2641d130-9e04-450b-08fe-19bb7e66fa21.png)をクリックすると使いやすさが倍増します。

## ファイルの編集
### ショートカット
便利なショートカットを(一部)紹介

|Windows|Mac|はたらき|働き|
|:---|:---|:---|:---|
|Alt + Enter|Option + Return|空気を読んでくれる|インテンションアクションとクイックフィックスを表示|
|Ctrl + Space|Ctrl + Space|いい感じに補完を出す|ベーシックコード補完|
|Ctrl + Alt + L|Command + Option + L|フォーマット|コードを再フォーマット|
|Ctrl + Alt + O|Command + Option + O|使ってないインポートを消したりまとめたりする|インポートを最適化|
|Ctrl + P|Command + P|メソッド引数の情報を再表示|パラメータ情報(メソッド呼び出しの引数内)|
|Ctrl + B|Command + B|その(変数/メソッド)の最初に書かれている場所へ移動|宣言に移動|
|Ctrl + 矢印キー|Command + 矢印キー|いい感じにカーソルを移動|構文に沿ってカーソルを移動|
|Shift + Alt + 矢印キー|Option + Shift + 矢印キー|行ごと移動|キャレット位置の行を移動|
|Ctrl + Q|Command + Q|ドキュメント表示|クイックドキュメント検索|
|Ctrl + D|Command + D|行コピー|現在の行を複製|
|Ctrl + Y|Command + Y|行削除|キャレット位置の行を削除|
|Ctrl + Shift + /|Command + Option + /|選択範囲をコメント(化/解除)|ブロックコメントでのコメント/アンコメント|
|Ctrl + /|Command + /|カーソルの行をコメント(化/解除)|行コメントでのコメント/アンコメント|
ちょっと多くなっちゃった...(並びは個人的によく使う順です

### Live Template
エディタウィンドウに`sout`と入力し`Tab`を押してみましょう。
![out.gif](https://qiita-image-store.s3.amazonaws.com/0/114420/1444e486-4cf9-7ec6-7a4c-5ad59488f97c.gif)
これがLive Templateです。
`File|Settings|Editor|Live Templates`に他にも多くのLive Templateが追加されています。

### Postfix Completion
例えば`int[] intArr = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};`という配列があり、これをforですべて参照したい場合
`intArr.for`と入力し`Tab`を押してみましょう。
![out.gif](https://qiita-image-store.s3.amazonaws.com/0/114420/22d8161a-f9e3-11f4-5068-885ca483e00c.gif)
これがPostfix Completionです。
`File|Settings|Editor|General|Postfix Completion`に他にも多くのPostfix Completionが追加されています。

> Live TemplateとPostfix Completionはめっちゃ便利なので積極的に使おう

## プラグイン導入
プラグインを導入することで対応する言語を増やしたり機能を追加することができます。
`File|Settings|Plugins`から開くことができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/083518e2-938e-4ff0-543c-b1b1fa6b883a.png)
検索欄に調べたいプラグインを入力するとインストール済みのものが検索できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/ab75549b-324f-f3e6-ca09-3a1897ecb3f1.png)
`Search in repositories`をクリックすることでインストールしていないプラグインを検索でき、`Install`をクリックして簡単にインストールできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/bcaacdec-f9d7-d34b-bd4e-79ad232d1a63.png)


## 実行・デバッグ
プログラムの実行は赤枠で囲った部分をクリックするだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/408dae4e-92ca-cc26-f728-45f897bd3064.png)

> コード横の![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/1c136c99-8c13-c12a-5f07-3a6b10198942.png)を押すだけで実行できるので便利ですね。
上部の![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/1c136c99-8c13-c12a-5f07-3a6b10198942.png)の横にある![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/0759f899-bff9-bda5-32fe-d7f18577efa4.png)は実行の細かい設定ができます。

### Configuration
画面上部![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/5e8f8c10-aadf-8e5e-6707-9e2a45ee31c7.png)をクリックするか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/9c805695-d0d6-01f3-d024-c6d3b3fb7382.png)の`Edit Configurations`をクリックします。

`Run/Debug Configurations`が表示されます。![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/6c1f053e-42d9-65aa-d5ae-a321a6fe52b7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/027eba64-076e-ec47-e950-4e103d59fa25.png)をクリックし`Application`を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/6d6aead1-fe44-ffd0-402b-7ecef3b05e36.png)
こんな画面が表示されると思います。
この画面の`Main class`に`public static void main(String... args)`が書いてあるClassを指定すれば実行してくれます。(横の`...`で簡単に入力できます)
この画面から環境変数なども設定できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/010a48f9-ec58-9261-5b9e-c561ffafeac1.png)
こんな感じですかね。`OK`をクリックして保存しましょう。

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/027eba64-076e-ec47-e950-4e103d59fa25.png)をクリックしたあと、他のものを選択すれば他の言語なども実行できます

### デバッグ
少しコードを書いてみましょう。

```java:Main.java
public static void main(String[] args) {
	System.out.println("Hello World!");
	int[] intArr = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	for (int i: intArr) {
		System.out.println(i);
	}
	System.out.println("End");
}
```

これを![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/1c136c99-8c13-c12a-5f07-3a6b10198942.png)を押して実行してみると画面下部に

```terminal
Hello World!
0
1
2
3
4
5
6
7
8
9
End
```

と表示されるはずです。

試しにデバッグしてみましょう。
`for`文の中にある`System.out.println`の行の数字の横をクリックすると`Break Point`を設定できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/bb315311-7990-58c2-aeab-48d169dfcfa2.png)
この状態で![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/8b7956ee-a68d-25c9-101d-53a306e4a280.png)をクリックするとデバッグが開始されます。
少し動いて下の画面で止まると思います。(少し解説を書いておきます)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/eb9d1185-1d0d-c061-8c41-aadc81d7d4c8.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/ca057d6a-0f16-40bc-6a30-401781405409.png)をクリックするとプログラムが再開されます。
`Variables`の`i`を見ると変更されていることがわかると思います。
うまく活用して開発速度の向上を狙いましょう。(いい感じのデバッグの活用法はここで解説すると長すぎるので調べてね

## バージョン管理システム
ここでは主にGitを紹介します。
とりあえず有効にしないと始まらないので有効にしましょう。
`VCS|Enable Version Control Integration`をクリックすると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/0d2f610e-86db-f0bc-48ee-4c4c566d2d57.png)
ダイアログが開くので, `Git`を選択し`OK`をクリックしましょう。
これで`Git`が有効になりました。
まずはコミットしてみましょう。`VCS|Commit`をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/f7f4ddcc-d665-0797-af09-365c484b9895.png)
この画面からコミットを行います。
上のようにすると`Main.java`をバージョニングの対象として, コミットメッセージを`:tada: Init commit!`としたことになります。
では`Commit`をクリックしてコミットしましょう。
エディタ下の`Version Control|Log`タブを開いて確認してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/e67ea221-47c6-6ad1-e89f-aa501f767bc6.png)
いわゆる`SourceTree`のように表示されます。
もう一つくらいコミットしてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/d60baaf7-c026-0488-39f7-3a66345314a3.png)
`Hello world!`と表示していた部分を`Hello Java!`に変えてみました。
`Commit Changes`を見るとダイアログ下部に`Diff`が表示されます。
>実はこのDiff画面, ![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/7b9d1531-e410-4688-4b66-704518f60e9a.png)このボタンを押しロックを解除すると`Your version`(ローカルのファイルの状態)が編集できます。

ではコミットしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/3bdc22a2-1b3c-1860-1830-5e54298ee281.png)
いい感じです。
もちろんブランチの切り替えもできます。
画面下部の![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/0d5b83a9-f30c-da32-afc6-586cd94adf2d.png)をクリックするとポップアップが出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/f512bd49-8e93-0ce6-ff8c-3e4b7808459d.png)
`New Branch`をクリックすれば新しいブランチを作成できます。
`test`ブランチを作成してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/2667f59e-ca5e-591d-361a-9e25bf74e935.png)
`OK`をクリックすると画面下部が![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/5b7f3114-eab1-b85d-5af3-e93eef053126.png)に変わり`test`ブランチになったことが確認できます。
ではコミットをしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/efad563c-39b7-500d-8ff0-050f6f562824.png)
`Hello Java!`を`Hello!`だけにしてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/2a3c4c54-5ba1-4211-135d-e87d3ff3eba7.png)

コミットすると`master`と`test`の`HEAD`が変わったことがわかりますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/5b7f3114-eab1-b85d-5af3-e93eef053126.png)をクリックして`local branches|master`に`Checkout`しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/0d5b83a9-f30c-da32-afc6-586cd94adf2d.png)になったらコミットします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/f17dd44a-56a8-fe0a-0a61-3bbe3fecb267.png)
`End`に`Hello`はおかしいので`Start`にしました。
ではコミットします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/385064f8-d2f1-20a4-0a74-11b5a51566ad.png)
ブランチが別れ、`master`のコミットが新しいことがわかりますね。

ではマージしてみましょう。`VCS|Git|Merge Changes`をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/a90b98f3-922d-c54a-3885-268a16c87ba0.png)
`Merge Branches`ダイアログが出ます。今回は`test`をマージするので`test`にチェックをつけ`Merge`をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/f57fe641-76b0-8419-ea80-9f0835071109.png)
おっと！コンフリクトしてしまったようです。`Merge`をクリックして確認してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/594eff57-99c1-8048-03ed-5f2030489274.png)
4行目を`master`でも`test`でも編集していたのでコンフリクトしたようです。
今回は左側の`master`の変更を取りたいので左側の4行目の横にある![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/e06a6041-d04d-6319-12a4-de260111a372.png)をクリックして変更を真ん中の結果に反映しましょう。
右側はいらないので![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/8c377a9e-3a46-6ee5-1d9c-85bc41402c19.png)をクリック。
これでOkみたいです！`Apply`をクリック。

基本的にコマンドを打たずにGUIで操作できるのは便利ですね。(CUIに慣れているときは別です
ですが、コンフリクト解消は誰もが便利と思うはずです。これからはぜひIDEAの`VCS`を活用してください。

## Database(Ultimateのみ)
DatabaseはIntelliJ IDEA Ultimateのみです。Community版にはありません。あしからず。
参考: [Ultimate vs. Community - Compare Editions](https://www.jetbrains.com/idea/features/editions_comparison_matrix.html)

> 今回はSQLiteを利用します。テスト用のデータベースとしてChinook([Github](https://github.com/lerocha/chinook-database))というものを利用します。

ダウンロードした`Chinook_Sqlite.sqlite`をプロジェクトにD&Dしてファイルを追加しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/36163568-1b6d-7056-962b-470d0270e9c3.png)
`Move`ダイアログが出たら`OK`をクリック。`Add File to Git`は`No`でいいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/efbd99fa-53de-4cb5-406c-cbc47a2ed380.png)
追加できました。
右サイドバーより`Database`をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/7b6a5b14-e3d2-1d75-9977-fe48488c1eae.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/829705ea-3f1b-1531-6534-65caf9e08041.png)`|Data Source|Sqlite`を開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/79404c0f-5ee6-481f-79e6-1198527c4fdb.png)

まずは画面下部の`Download missing driver files`をクリックしてJDBCをダウンロードしましょう。
`File`を`Chinook_Sqlite.splite`に変更し`Test Connection`をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/2fb9a8c1-cbb4-6a86-2dbb-a93dd000350f.png)
`Successful`ならOKです。下部`OK`をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/ce8c5f4a-cc1e-c4d5-9a24-36c67d7b3a50.png)
追加された`Chinook_Sqlite.splite`を開いてみるとテーブルの一覧を見ることができます。
また![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/b858492d-4589-ba0f-4a8e-6f6b99301a41.png)をクリックするとSQLクエリの実行を行えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114420/23a810f1-5b01-801f-b09e-18367f22c291.png)
（ここにSQLクエリを入力し、実行できます

# おわりに
途中で力尽きてしまった...

書くことがないのでこれも追加してほしい！をコメントでお待ちしています
質問も気軽にどうぞ

## TODO
### Multi Module Project 
 - `Project Structure`の説明, Moduleの説明
### Android App開発
 - `Android Support`, `Android SDK`導入