Java勉強会(社内用) #001

課会用にJavaの触りについてまとめてみました。

#1. 今回の目的
Javaの導入部分について理解する。（私の知識はそこまでしかありません...）

#2. 環境構築
Javaを始める方法は2通りあります。
1. 統合開発環境(Eclips)を導入する
2. オンライン開発環境([paiza.IO](https://paiza.io/ja))を利用する

今回は入門書程度のことしかやらないので後者の「[paiza.IO](https://paiza.io/ja)」を使いましょう。
インストール不要でJavaを試すことができます。

以下プログラム実行までの手順を記します
>###1.中段左の「コード作成を試してみる（無料）」ボタンでエディタ画面へ
![スクリーンショット 2019-07-25 02.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157886/c3e20201-227a-d43c-a2f3-7ca64d013a63.png)

>###2.左上のメニューから「Java」をクリックでJavaのエディタに
![スクリーンショット 2019-07-25 02.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157886/42f15957-d818-38b0-4c89-f1eab512b7be.png)

>###3.左下「実行(Ctrl-Enter)」ボタンをクリックでプログラムを実行
![スクリーンショット 2019-07-25 02.30.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157886/5167fcf2-dbe1-dc3b-9917-de4dbf6b1c30.png)


（詳しくは割愛しますが、もしEclipsを使う場合は以下のリンクを参照してください。）
[今すぐ設定できる！Javaの開発環境の構築方法(Windows編)【初心者向け】](https://techacademy.jp/magazine/9039)
#3. Javaの特徴
1. JavaはJVMと呼ばれる仮想環境で動く
→プラットフォームに依存せず、JVMが搭載されたコンピュータならどこでも動かせる(ガラケーのiアプリ,EZアプリなんかもJavaアプリケーション)

2. Javaはオブジェクト指向プログラミングをサポートしている
→オブジェクト指向プログラミングをサポートしているだけで、それを活かすかはプログラマー次第

#4. オブジェクト指向
Javaはオブジェクト指向プログラミング言語だ！なんて言われてますが、
学生時代C言語しか習わなかったので、オブジェクト指向？なんのこっちゃ！って感じでした。
~~っていうか今もなんのこっちゃです。１年目の開発では意識する必要がなかったので...~~

オブジェクト指向はデータと処理をセットにした「オブジェクト」で物事を表す手法で、
オブジェクトを組み合わせてプログラミングすることが「オブジェクト指向プログラミング」と呼ばれます（たぶん）

オブジェクト指向プログラミングの原則と呼ばれるのが
1. 独立性 
→ カプセル化・・・オブジェクトのデータにアクセスできる範囲を限定し、直接アクセスされないようにする仕組み
2. 再利用 
→ 継承・・・プログラム（変数やメソッド）を引き継いで使うための仕組み
3. 拡張性
→ ポリモーフィズム・・・呼び出し方法を変えずに異なる使い方をするための性質。継承したプログラムの中身を書き換える「オーバーライド」や同じ名前で引数の異なるメソッドを作ることができる「オーバーロード」という仕組みがこれにあたる。


これらの要素がそろっているのがオブジェクト指向プログラミングの特徴です。

#5. 基本的な使い方とか
最低限必要なものをいくつか紹介します

##5.1 標準出力
まずは文字を出力するプログラムを作ってみましょう。
Javaのプログラムはファイル名と同じ名前のクラスとmainメソッドが最低限必要です。
メソッド⇒関数のこと。
基本の形は以下になります。
**返却型 メソッド名(仮引数){
}**
クラス⇒メソッドをまとめたもの。
基本の形は以下になります。
**class クラス名{
}**

```java:main.java
import java.util.*; //インポート文です

class Main { //クラスの宣言
    public static void main(String[] args) { //メインメソッドの宣言
        System.out.println("Hello"); //Helloと出力します
    }
}
```
```:出力結果
Hello
```

「import java.util.*;」はjava.utilパッケージの全てのクラスをインポートするための文です。
パッケージ=>クラスをまとめるための仕組み
インポート=>そのパッケージを参照するための仕組み
java.utilパッケージは標準で備わっているパッケージで、
使用頻度の高いクラスが入っています。とりあえず書いておけば困りません。

mainメソッドは**「public static void main(String[] args)」**と記載する決まりがあり、
守らないとコンパイルエラーが発生してしまいます。


「System.out.println」はSystemクラスのoutフィールドにあるprintlnメソッドを呼び出すという意味になります。

##5.2. 変数
先程のプログラムではメソッドに直接文字列を渡しましたが、
次は変数を使って文字列を渡してみましょう。

```java:main.java
import java.util.*;

class Main {
    public static void main(String[] args) {
        String greeting;
        greeting = "Hello";
        System.out.println(greeting);
    }
}
```
```:出力結果
Hello
```
変数の宣言は
**型 変数名;**
という形で行います。
代入は
**変数 = 代入したい値**
で行えます。  
型には標準で提供されているものと自作のものとがあり、
今回のような標準の型は基本型（プリミティブ型）と呼ばれます。

今回使うものだけ紹介すると、

|型     |使い道   |
|:-:    |:-:     |
|int    |整数    | 
|double |浮動小数|
|char   |文字    |
|String |文字列   |
|boolean|真偽値   |

また、変数名の命名には以下の決まりがあります
1. 数字、英字（大文字小文字）、「_」(アンダーバー)、「＄」（ドル）のみが使える
2. 先頭文字に数字は使えない
3. 予約語（Javaで意味を持つ言葉）は使えない。基本型の名前とかifとか。

##5.3. 配列
次は配列を使ってみましょう。
配列は複数の要素を使うための仕組みです。
配列は
**型[] 変数名 = new 型[配列のサイズ];**
で宣言し、
**変数名[インデックス]**
でアクセスできます。インデックスは先頭の配列から何個後ろかを示す整数値です。
(ex. １番目の配列なら先頭の0個後ろなので 変数名[0] でアクセス)


```java:main.java
import java.util.*;

class Main {
    public static void main(String[] args) {
        String[] list = new String[2];
        list[0] = "１つ目の配列";
        list[1] = "２つ目の配列";
        
        System.out.println(list[0]);        
        System.out.println(list[1]);
    }
}
```
```:出力結果
１つ目の配列
２つ目の配列
```

##5.4. List
Listはサイズを自由に変更できる配列です。

宣言は以下のように行います。
**ArrayList<型> 変数名 = new ArrayList<型>();**

追加は
**変数名.add(追加したい要素);**

要素へのアクセスは
**変数名.get(インデックス);**
で行います。

```java:main.java
import java.util.*;

class Main {
    public static void main(String[] args) {
    ArrayList<String> array = new ArrayList<String>();
        array.add("１つ目の配列");
        array.add("２つ目の配列");
        
        System.out.println(array.get(0));        
        System.out.println(array.get(1));
    }
}
```
```:出力結果
１つ目の配列
２つ目の配列
```

##5.5. for文
指定した回数繰り返すための構文です。
以下のような形です。
**for(初期化;条件;更新部){
　繰り返すプログラム
}**

```java:main.java
import java.util.*;

class Main {
    public static void main(String[] args) {

        for(int i = 0;i < 2; i++){
            System.out.println((i+1)+"回目の呼び出しです");
        }
    }
}
```
```:出力結果
1回目の呼び出しです
2回目の呼び出しです
```

###5.5.1. 拡張for文
またfor文の応用形で拡張for文という構文もあります。
配列やリストのすべての要素を呼び出したいときに使われます。
以下のように使います。
**for(型 変数名:配列やリスト){
　繰り返すプログラム
}**

```java:main.java
import java.util.*;

class Main {
    public static void main(String[] args) {
        String[] list = new String[2];
        list[0] = "１つ目の配列";
        list[1] = "２つ目の配列";
        for(String s : list){
            System.out.println(s);
        }
    }
}
```
```:出力結果
１つ目の配列
２つ目の配列
```

##5.7. while文
while文もfor文と同じく繰り返しのための構文ですが、初期化部はループの前に、更新部はループ内に記載するところが異なります。
以下のような形です。
**初期化部
while(条件式){
　繰り返すプログラム
　更新部
}**

```java:main.java
import java.util.*;

class Main {
    public static void main(String[] args) {
    int i = 0; 
        while(i < 2){
            System.out.println((i+1)+"回目の呼び出しです");
            i++;
        }
    }
}
```
```:出力結果
1回目の呼び出しです
2回目の呼び出しです
```

##5.8. if文
if文は式の値が真になった場合実行されます。
以下の用な形で用います。
**if(条件式){
　真になった際に実行される文
}
else if(条件式){
　真になった際に実行される文
}
else{
　真になった際に実行される文
}**
else if文は複数使うことができます。

if文が偽であればelse if文の判定に、
else if文が偽であればelse文が実行されます。

```java:main.java
import java.util.*;

class Main {
    public static void main(String[] args) {

        for(int i = 0;i < 3; i++){
            if(i < 1){
                System.out.println(i+"は1未満です");
            }
            else if(i < 2){
                System.out.println(i+"は1以上2未満です");
            }
            else{
                System.out.println(i+"は2以上です");
            }
        }
    }
}
```
```:出力結果
0は1未満です
1は1以上2未満です
2は2以上です
```