プログラムの流れとデータについて（値と変数）（プログラミング入門 with Groovy）

#はじめに
この記事は、[プログラミング入門 with Groovy](http://qiita.com/saba1024/items/2bce044e54f450f8b549)の1部です。

#プログラムの流れ
さて、[前回Groovyのインストールと簡単なプログラムを実行しました。](http://qiita.com/saba1024/items/66c7154608ed52363e8f)
今回からもう少し具体的なプログラムの説明に入ってきます。

再度Groovyコンソールを起動して、以下のコード（プログラム）を入力してください。
Groovyコンソールって何？という方は[前回の記事](http://qiita.com/saba1024/items/66c7154608ed52363e8f)を参照してください。

```groovy
println "Hello World"
println 123
println "aaa"
```

このプログラムを実行すると、上から順番に"Hello World", "123", "aaa"と画面に表示されたと思います。
この**上から順番に実行される**というのがプログラムの大前提です。
どんなプログラムでも、原則上から順番に実行されます。この原則はどんなに巨大なプログラムでも変わりません。

#プログラムの値
さて、**値**とは何でしょう？
コレはプログラムが処理をする対象となるものです。

また以下のコードをGroovyコンソールに入力して実行してみてください。

```groovy
println 1 + 2
```

これを実行すると、結果として**3**と表示されます。
何でも無いようなことですがコレは凄いことですね。私達は今**3**だなんていう文字はどこにも入力していません。
それにも関わらずGroovy（プログラム）は1と2という、プログラムから見て処理の対象となる値から、**3**という結果を導き出したわけですね。
今回の場合は1と2という数値が**値**となるわけですね。

## 値の種類
さて、鋭い方はお気づきかもしれませんが、今までのサンプルコードでは、値が**ダブルクォーテーション(")**で囲まれているものと囲まれていないものがあることに気づいたかもしれません。
例えば以下のプログラム。

```groovy
println "123"
println 123
```

これを実行しても、2つの123という文字が画面に表示されるだけです。
でも実はこの2つの値は**全く異なるものなのです。**

それでは以下のコードを実行してみてください。

```groovy
println "1" + 2
```

なんだまた足し算かよ、結果は3でしょ？と思いそうなところですが、実行結果はなぜか**12**になります。
なぜこんなことが起こるのでしょうか？
それは、1という値がダブルクォーテーションで囲まれた結果、**文字列**として扱われたためです。
プログラムの世界では、値には様々な種類が存在しており、その中でも一般的なのが、ダブルクォーテーションで囲まれた**文字列**と呼ばれるものと、整数をそのまま書いた**数値**と呼ばれるものです。
すこしややこしいですが、整数をダブルクォーテーションで囲むと、その整数は**数値**ではなく、**文字列になります。**
Groovyでは、**文字列**と別の値の間で足し算を行うと、別の値も**文字列**として扱って、単純に**文字列同士をくっつけます。**
そのため、以下のコードは全て結果が**12**になります。

```groovy
println "1" + 2
println 1 + "2"
println "1" + "2"
```

プログラミングに関する書籍やニュース、ブログなどでは、文字列扱いの整数を**数字**と読んで、**数値**とは違うタダの**文字列扱いの数字ですよ**、という意味合いで使い分けをしています。
といっても日本語の問題なので、実際に読む記事などの文脈から判断する必要が当然有ります。

#変数
さて、プログラムに置ける重要な概念として**変数**というものがあります。
数学の授業などで聞いたことがあるのではないでしょうか？
数学と聞いて身構える必要はありません。非常に簡単です。
以下のコードを入力して、実行してみてください。

```groovy
def hoge = 123
println hoge
```

どうですか？実行結果として**123**が表示されましたか？
初めて出てきたキーワードが3つ有りますね。
まず`def`。これはGroovyにおいて変数の宣言をするものです。この`def`の後に半角スペースを1個以上開けて変数名を宣言します。
次に`hoge`。これが実際の変数になります。このhogeという名前は実は何でもOKです。aaaでもbbbで大丈夫。こういったサンプルプログラムではよくこの`hoge`が用いられます。
最後に`=`ですね。コレは、`=`の右側の値を、左側の変数に入れるよ、という意味になります。算数だと左辺と右辺が等しい、という意味なのでちょっと意味合いが異なりますね。

今までなんとなく書いてきた`println`ですが、コレはGroovyが持っているコマンドで、右側の値を画面に表示するというものです。
今回はhogeが指定されていますね。`println`は賢いので、右側に指定されたものが変数だということを知っています。なのでその中身である**123**を画面に表示してくれたわけですね。

まとめると、`def`キーワードで`hoge`という変数を準備して、その中に**123**という値を格納した、ということになります。
ちなみにちゃんと計算で使うことも出来ます。

```groovy
def hoge = 123
println hoge + 1
```

実行結果は**124**になります。
すでに学んだ通り何か文字列があると。。。？

```groovy
def hoge = "123"
println hoge + 1
```
実行結果は**1231**になります。
数値でも文字列でも、defキーワードで宣言された変数に格納できることが解ると思います。
なお、実はこの変数なのですが、値と同様プログラミング言語や、Groovy自体にも様々な種類が存在しています。
と言っても別段難しいことではないので追々勉強していきます。

##なんで変数なんて必要なの
こういった疑問を持たれた方は現実的な視点を持っておられる方です！
変数には様々な役割、メリットが有りますので一言では説明しづらいのですが、例えば、ある数値の2乗を求める計算を考えてください。
2乗なので、計算式は*同じ数値 x 同じ数値*にになりますね。
ちなみにプログラムでは掛け算は`*（アスタリスク）`という記号を用います。

```groovy
println 5 * 5
```

実行結果は当然25になりますね。
ではコレを6の2乗にしたい場合はどうでしょう？
単純に数値を変えるだけでOKですよね。

```groovy
println 6 * 6
```

しかしコレだと、2つの5という数値を手動で修正する必要があったわけです。短い上にたった2つなので今の所それでも問題ありませんが、コレが大きなプログラムになってくると、一体どこまで値を修正しなければならないのか、という問題が出てきます。
そこで変数の出番です。
変数を使えば、計算などでその変数を利用することが出来ます。

```groovy
def hoge = 5
println hoge * hoge
```

実行結果は当然25になり、もし6の2乗を求めたい場合は、`def hoge = 5`を`def hoge = 6`に変えるだけです。実際の計算処理自体を修正する必要は無いわけですね！

具体的にもっと便利/必要な場面というのは、実際にプログラムを書いていく上でわかってきますのでとりあえずは便利なんだな〜という感覚で捉えておいてもらえれば大丈夫だと思います。


#演算子
Groovyに限らず、一般的なプログラミング言語では、計算のために以下の演算子が用意されています。

|演算子|意味|
|:--|:--|
|+|足し算|
|-|引き算|
|*|掛け算|
|/|割り算|
|%|剰余|

掛け算とわり算の演算子が普通の算数とは少し違いますね。
剰余ってなんだ？という話ですが、コレは割り算に似ていて、わり算の余りを求めるものです。
例えば、`4 / 5`、普通に算数すれば答えは0.8ですね。小数点を使わないのであれば、**0と余り4**になりますね。
剰余はずばりその**余り4**を求めるものです。
なので、`println 4 % 5`を実行すると、その余りである**4**が表示されます。

#計算の順番
番外編的な扱いですが、Groovyでより複雑な算数をしてみましょう。
と言っても普通の算数のルールと同じです。

例えば算数で`5 * (2 +10) / 3`というような計算をする必要がある場合、答えは20になります。
Groovyでコレを実現しようとすると。。。そのまま実行するだけです。

```groovy
println 5 * (2 +10) / 3
```

Groovyでも一般的なプログラミング言語でも、算数のルールに則って、計算式は左から順番に計算されます。
そして、掛け算、割り算は足し算とひき算よりも先に計算されます。ただしカッコ（）を使うことでその優先順位をある程度制御できる。
全て算数の計算ルールと同じですね。

#まとめ
今回は、プログラムの流れと、その中で使う値と変数という概念をまとめました。
ついでに計算で利用する演算子と、計算の順番も学びました。
コレですでに複雑な計算をプログラムを使って計算できるようになりましたね！