プログラム初心者に贈るJavaプログラミング

# Let's enjoy Java programing

# Javaプログラミング　キホンのキ！

※ちなみに構文とは文法、書式。つまり書き方のルール、守らないとコンパイラさんが激オコ。

# ソースコードとは

プログラムを記述したファイル。

# コンパイラ

コンパイラはソースコードをコンピュータが理解できる形に翻訳してくれるプログラムのこと。

翻訳して実行できる状態にすることをコンパイルと言います。
## 一番簡単なJavaのプログラム

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

# 構文

## {}　（中かっこ）

これで囲われた中身を「ブロック」と言います。
ブロックは処理単位を区切るためのもので、交通整理のカラーコーンのようなものです。

## ;　（セミコロン）

プログラムの命令を区切るものです。

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

の場合はコンソールに「Hello, World!」という文字を出力するという命令の終わりに入れます。
以下のように複数行に分けて書くこともできるため必ずしも行末に入れるわけではないことに注意してください。

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

# 解説

## クラス

```java
public class Hoge {
〜
}
```


学校のクラス分けみたいに一定の処理をひとまとめにしたもの

### 言葉の意味

| 単語 | 意味 |
| ------ | ------------------------------------------------------- |
| public | 外から見える |
| class | クラスを作ります |
| Hoge | 名前は「Hoge」です（このときファイル名は「Hoge.java」） |

## メソッド


```java
public static void main(String[] args) {
～
}
```


メソッドは処理をクラスの中でもう少し小分けにするためのもの。
クラスの中の役割分担、保健委員とか体育委員とか。

| 単語 | 意味 |
| ------------- | ------------------------------------------------------ |
| public | 外から見える |
| static | 静的な（Newしなくても使える、詳しくは今後） |
| void | 戻り値を返さない |
| main | 名前は「main」 |
| String[] args | 「args」という名前で、文字列の配列を引数として受け取る |

## 別のメソッドの例

```java
public static int piyo(int counter) {
    int localCounter = counter + 1;
    return localCounter;
}
```


| 単語 | 意味 |
| ----------- | ----------------------------------------------------------- |
| public | 外から見える |
| static | 静的な（Newしなくても使える、詳しくは今後） |
| int | int型の変数を返す（これがvoidじゃないとreturnが必要になる） |
| piyo | 名前は「piyo」 |
| int counter | 「counter」という名前で、int型の変数を引数として受け取る |



## 引数（パラメータ、Param）

先のメソッドの説明で登場した「引数」とは、そのメソッドに値を渡したいときに指定するものです。

引数はメソッド名の後の()カッコ内で宣言しているためメソッドの{}中かっこ内で宣言する必要はありません。

## 戻り値

メソッドが呼び出し元に返す値のことです。

以下の場合、数字の「1」が戻り値として変数Aに入ります。

```java
public static void main(String[] args) {
    int A = hoge();
}

public static int hoge() {
    return 1;
}
```

## 処理命令

コンピュータに対して「これをやれ！」と指示をするための文。

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

| 単語 | 意味 |
| -------------------- | ------------------------------ |
| System.out.println() | コンソールに文章を表示しなさい |
| "Hello, World!" | 文字列 |

# 変数

## 変数の作り方

型名 変数名 = 初期値;

## 例

### 数値（int型）

```java
int num = 1;
```

| 単語 | 意味 |
| ---- | ------------------- |
| int | int型の変数を作る |
| num | 「num」という名前で |
| = | 右の値を左へコピー |
| 1 | 整数 |

### 文字列（String型）

```java
String text = "higepiyo";
```

| 単語 | 意味 |
| ---------- | ------------------------------------------------------ |
| String | String型の変数を作る |
| test | 「text」という名前で |
| = | 右の値を左へコピー |
| "higepiyo" | ダブルクォーテーションではさまれた文章は文字として扱う |

# 配列変数

## 配列変数の作り方

型名 変数名[] = {初期値1,初期値2,初期値3,....};

## 例

### 数値（int型）

```java
int num[] = {1,2,3};
```

| 単語 | 意味 |
| ------- | ----------------------------------------------- |
| int | int型の変数を作る |
| num[] | 「num」という名前で、添え字がつく（配列として） |
| = | 右の値を左へコピー |
| {1,2,3} | 整数の配列 |

以下のような書き方も可能。

```java
int[] num;
num = new int[3];
num[0] = 1;
num[1] = 2;
num[2] = 3;
```


### 文字列（String型）

```java
String text[] = {"hoge","piyo","fizz"};
```

| 単語 | 意味 |
| -------------------- | ------------------------------------------------ |
| String | String型の変数を作る |
| text[] | 「text」という名前で、添え字がつく（配列として） |
| = | 右の値を左へコピー |
| "hoge","piyo","fizz" | 文字列の配列 |

以下のような書き方も可能。

```java
String[] text;
text = new String[3];
text[0] = "hoge";
text[1] = "piyo";
text[2] = "fizz";
```

# 演算子

演算子とは足し算引き算などの算術や代入、比較などの命令。
おおざっぱに言うと+(たす)とか-(ひく)とか=(いこーる)とかの記号。

## 四則演算（＆文字列演算）

| 演算子 | 意味 | 例 | Aの中身 |
| ------ | ------------------------------ | ------------------------ | --------------- |
| + | 足し算（数値）、結合（文字列） | A = 1 + 1、A = "a" + "b" | 2、"ab" |
| - | 引き算 | A = 2 - 1 | 1 |
| * | 掛け算 | A = 2 * 2 | 4 |
| / | 割り算 | A = 6 / 2、A = 10 /3 | 3、3(intの場合) |
| % | あまり | A = 10 % 3 | 1 |

## 代入演算

| 演算子 | 意味 | 例 | Aの中身 |
| ------ | -------------------- | ----- | ------- |
| = | 左から右へ値をコピー | A = 1 | 1 |

## 関係演算

関係演算子は左右を比較するもの。比較して一致したらTrue(真偽値)を返す

| 演算子 | 意味 | Aの中身 | 例 | 結果 |
| ------ | ------------------ | ------- | -------------- | ----------- |
| == | 左右が同じ | 1 | A == 1、A == 2 | True、False |
| != | 左右が同じじゃない | 1 | A == 1、A == 2 | False、True |
| &gt; | 左のほうが大きい | 1 | A &gt; 0、A &gt; 1 | True、False |
| &gt;= | 左が右以上 | 1 | A &gt;= 0、A &gt;= 1 | True、True |
| &lt; | 右のほうが大きい | 1 | A &lt; 0、A &lt; 1 | False、True |
| &lt;= | 右が左以上 | 1 | A &lt;= 0、A &lt;= 1 | True、True |

## 論理演算

if文の条件を複合条件(Aが○○かつBが××のとき、みたいなの)にしたい場合に用いる

| 演算子 | 意味 | 例 |
| ------ | ---------------------------------- | ------------------ |
| &amp;&amp; | かつ、両方とも条件を満たす場合 | A == 1 &amp;&amp; B == 2 |
| ｜｜ | または、どちらかが条件を満たす場合 | A == 1 ｜｜ B == 2 |

※｜｜は本来は半角

# if 分岐

## もし、○○ならば××しなさい。

```java
int hoge = 1;
if (hoge == 1) {
    System.out.println("ほげは1です。");
}
```

# else

## もし、○○ならば××しなさい。○○でないなら△△しなさい。

```java
int hoge = 0;
if (hoge == 1) {
    System.out.println("ほげは1です。");
} else {
    System.out.println("ほげは0です。");
}
```


# for 繰り返し

## 整数0のiを作って、iが10より小さい間繰り返す。一回ごとにiをカウントアップ。

```java
for (int i = 0; i &lt; 10; i++) {
    System.out.println(i);
}
```

## i++　の意味

++は1足すという命令。インクリメントという。
i = i + 1　とほぼ同じ意味。

ただし変数の前につけるのと後につけるので意味が少し変わる。

意味が変わる例

```java
int i = 1;
System.out.println(++i);

結果）2
```

iを表示する前に1を足す

```java
int i = 1;
System.out.println(i++);

結果）1
```


iを表示した後に1を足す





# コメント

プログラムのコメントとは、ソースコードを読みやすくするためのメモ書きです。

また、一時的にプログラムの一部を実行したくない時などにも使います。
これは一般にコメントアウトと言います。（○○の処理をコメントアウトします。といった感じに）

## コメントの種類

### 行コメント

//

スラッシュを2つ続けて書くと、その行のそれ(//)以降がコメントとなります。

```java
// 年齢が17歳のとき
if (age == 17) {``
    // おいおいと言う
    System.out.println("oioi");
}
```

### 複数行コメント
```
/*
～
*/
```

「スラッシュ＋アスタリスク」で始まり「アスタリスク＋スラッシュ」で終わります。
この間すべてがコメントです。

```java
/*
if (age == 17) {
    System.out.println("oioi");
}
*/
```
### JavaDoc
```
/**
～
*/
```
先の2つのコメントとすこし意味合いが変わるのが、このJavaDocと呼ばれるコメントの方法です。
Java言語を始めたばかりではあまり書く機会はないと思いますが。
EclipseやAndroidStadioで自動的に生成されたり、他の人のソースコードを読むうえで登場すると思いますので覚えておきましょう。

このコメントはJavaのプログラムを記述するうえでほかのプログラムと連携するための情報や。
プログラムについての説明など、いわゆるドキュメントを自動的に生成するためのコメントで。
このコメント内にタグを用いて様々な情報を記述し、JavaDocの生成処理を行うとHTMLなどの資料が生成できます。

また、Eclipseなどのツールチップ（マウスオーバーで表示されるメソッドの説明など）の表示にも利用されています。



# 閑話休題

## 「hoge」ってなんぞ？

hogeってよく目にするんですが実は意味はありません。

語源や発祥については不明ですが、いつの間にか定着して先達から面々と受け継がれ、
今日のプログラマー界隈では一般的に「特に意味はないことを意味する言葉」とされています。

「ラ・ヨダソウ・スティアーナ」とか「エル・プサイ・コングルゥ」と一緒ですね。（言いたいだけ）

「hoge」とセットで使われる「piyo」もありますが、
「hoge」と比べて使われることは少なく、故に通じないこともあります。

なお、「hoge」は日本独自のもので、海外では「foo」「bar」などが用いられることが多いそうです。




# paiza.ioを使って動かしてみよう

ブラウザでプログラミングが出来る実行環境「paiza.io」

https://paiza.io

![スクリーンショット 2015-08-22 13.03.10.png](https://qiita-image-store.s3.amazonaws.com/0/86265/205c7fd3-4bfd-5d1e-aef8-3c0db0be1ed4.png)

緑色の「コード作成を試して見る（無料）」というボタンを押します。

![スクリーンショット 2015-08-22 13.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/86265/e0be88ad-99ea-c7be-6cbf-5b8308bb55a3.png)

この画面になったら「C++」を押す。

![スクリーンショット 2015-08-22 13.03.49.png](https://qiita-image-store.s3.amazonaws.com/0/86265/85e349db-3422-a4ab-fc74-c3fc2a0b5e27.png)

言語一覧が出るので「Java」を選択してください。

![スクリーンショット 2015-08-22 13.04.01.png](https://qiita-image-store.s3.amazonaws.com/0/86265/79548e0e-acda-a03e-ebca-7995167dc686.png)

この画面がでたら準備完了です。

# こんにちわ　せかい

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

このプログラムはコマンドラインに「Hello, World!」と文字を表示するというプログラムです。

このプログラムはHello World（ハローワールド）と呼ばれ。  
プログラムの入門で必ずと言っていいほど最初の一歩として取り扱われ、
このプログラムを書き換えながら学習していくことが多いです。

それでは、打ち込んで実行してみましょう。

「Hello, World!」と表示されたでしょうか。  
されていない場合は入力に間違いがありますので打ち間違いや、全角のスペースが入っていないか。  
アルファベットやかっこが全角になっていないか確認してください。

さて、無事にHello Worldが動いたところでもう少しプログラムっぽくしてみましょう。


```java
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = br.readLine();
		String yourName = line;
		System.out.println("Hello, " + yourName);
	}
}
```

このプログラムはあなたの名前を入力して「Hello, 入力した文字列」と表示するプログラムです。

※ paiza.ioの場合は下のほうにある入力タブのところに文字列を入力してください。
Eclipseなどで実行している場合は実行後コンソールに文字列を入力してEnterを押してください。



上記のプログラム中で新たに出てきたちょっと難しい処理があるので簡単に説明します。  
ここではそういうものなのだと雰囲気だけ理解してもらえれば大丈夫です。


```java
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
```

BufferedReaderというのはバッファ(一時的な蓄積)を持ちながら読み込む処理を行うJavaが用意している部品です。
このBufferdReaderの入力としてInputStreamReaderを用いており、
InputStreamReaderはInputStreamを読み込んで文字列に変換する部品です。（InputStreamはバイトコードなのでそのままだと読めないため）  
InputStreamはここではSystem.inで、これは標準入力（コンソールからの入力）を用いています。

つまり1行目は  
コンソール入力(System.in)を文字列に変換しながら（InputStreamReader）蓄積する（BufferdReader）  
という意味です。

2行目は蓄積したBufferdReaderのインスタンスbrから1行読み込みlineという文字列型変数に代入しています。

やってる内容の割にちょっと面倒くさいですね。私もそう思います。

JavaはPerlやRubyなどのスクリプト言語に比べると、文字列処理がちょっと面倒なのは確かですが。
Eclipseのコード補完を使えばそれほど苦にならないと思います。

また、不便だと思ったら自分でよく使う処理をまとめたライブラリを書いたりするのもまた勉強になると思います。



# 演習問題1

0以上1000未満の数字をすべて表示するプログラムを作ってください。


# 解答例


```java
public class Main {
	public static void main(String[] args) {
		for (int i = 0; i < 1000; i++) {
			System.out.println(i);
		}
	}
}
```

# 演習問題2

0以上1000以下の偶数をすべて表示するプログラムを作ってください。


# 解答例


```java
public class Main {
	public static void main(String[] args) {
		for (int i = 0; i <= 1000; i++) {
			if (i % 2 == 0) {
				System.out.println(i);
			}
		}
	}
}
```


# 演習問題3

0以上1000以下の数字すべてとその数字が奇数なら「奇数」、偶数なら「偶数」と表示するプログラムを作ってください。

# 解答例

```java
public class Main {
	public static void main(String[] args) {
		for (int i = 0; i <= 1000; i++) {
			if (i % 2 == 0) {
				System.out.println(i + " 偶数");
			} else {
				System.out.println(i + " 奇数");
			}
		}
	}
}
```

# 以降はもう一歩進んだお話、おまけ

# 文字列比較 equals

今まで比較演算子は==などを使っていましたが、文字列型Stringでは別の方法を使います。

```java
String str = "hoge";
if (str.equals("hoge")) {
～
}
```

このようにString型のequalsメソッドを利用します。  

これはintなどはプリミティブ型のため==で実際の数値を比較しますが、
Stringなどのクラス型では==ではインスタンスが比較され正しい比較が行われないためです。

プリミティブ型、クラス型は以下の資料を参照。

#### 変数と型について

<iframe src="//www.slideshare.net/slideshow/embed_code/key/geG9GIH1W4QjYj" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/nakamine/ss-51939323" title="変数と型" target="_blank">変数と型</a> </strong> from <strong><a href="//www.slideshare.net/nakamine" target="_blank">nakamine</a></strong> </div>

ぶっちゃけよくわかんなかったら今のところは「そういうもんなんだ」って書き方だけ覚えてもOK。

もしも、よくわかんないけど「ちゃんとわからないと嫌だ！」って場合は  
結城浩大先生の「Java言語プログラミングレッスン（下）」に詳しいのでそちらを読んでください。  
つーかこれ読むくらいならJava言語プログラミングレッスンの上下巻読んだほうがよっぽどわかりやすいよ！（本末転倒）




# List

Listとは配列と似た概念ですが配列をもっと使いやすい形にしたクラスです。

例はよく利用されるArrayList

ArrayListの中身が文字列のパターン

```java
ArrayList<String> al = new ArrayList<String>();
al.add("hoge");
al.add("piyo");

for (int i = 0; al.size(); i++) {
	System.out.println(al.get(i));
}

実行結果）
hoge
piyo
```

ArrayListの中身が数字のパターン

```java
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(10);
al.add(20);

for (int i = 0; al.size(); i++) {
	System.out.println(al.get(i));
}

実行結果）
10
20
```


# Map

Mapは他の言語ではディクショナリとも言われ、「Key（索引）とValue（値）」の形式でデータを持ちます。  
データの順番は保障されません（配列やArrayListは入れた順番）。

例はよく利用されるHashMap

```java
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("key1", "hoge");
hm.put("key2", "piyo");
hm.put("key3", "hogepiyo");

for (String key : hm.keySet()) {
	System.out.println(hm.get(key));
}

実行結果）
hoge
piyo
hogepiyo
※並び順は入れ替わってOK
```





# ドキュメントのススメ

http://docs.oracle.com/javase/jp/8/api/

前述のListやMapのようにJavaには便利な機能が最初から用意されています。
これらはAPIと言い使い方がJavaの開発元Oracleが公開している、APIドキュメントに記載されています。

これを読みながらプログラムをかけるようになると一人前（かも）！

# 一応ライセンス表記

クリエイティブコモンズライセンスのCCBYにて提供します。
CCBYの意味は以下の通り。

> 原作者のクレジット（氏名、作品タイトルなど）を表示することを主な条件とし、改変はもちろん、営利目的での二次利用も許可される最も自由度の高いCCライセンス。
http://creativecommons.jp/licenses/#licenses

ですのでもし万が一研修などで使いたい等、ライセンスの範囲で自由に利用頂いて構いません。

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br /><a xmlns:cc="http://creativecommons.org/ns#" href="http://nkm-net.jp/" property="cc:attributionName" rel="cc:attributionURL">仲嶺祐久</a> 作『<span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">プログラム初心者に贈るJavaプログラミング</span>』は<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>で提供されています。<br /><a xmlns:dct="http://purl.org/dc/terms/" href="http://qiita.com/euc_/items/1c1ef42d62cdcbd23421" rel="dct:source">http://qiita.com/euc_/items/1c1ef42d62cdcbd23421</a>にある作品に基づいている。