第一章：猿でも分かるScala!

## 前説

ご覧頂きありがとうございます。

これをご覧になっているアナタ様はきっと

【Scala Scallar Scalest】になりたいんですよね。

分かりますよ。。。こいつ、何を言ってんだと。。

でも、、、

- 「Scala書けます」って言ってみたい
- 「やっぱ時代はオブジェクト指向&関数型言語だよね」って言ってみたい
- 「10ステップ書いてるけどそれ1ステップでいけるよ」って言ってみたい
- 「Scalaの事は俺に任せろ」って言ってみたい

そうです、やっぱかっこEよね。Scala。

動機が不純？いやいや。

何事もかっこ良くないと。

心も体も脳ミソもイケメソでいきましょう。

挫折しそうになったらもう1度、上記「言ってみたい」気持ちを復唱しましょう。

前置きが長くなりましたが、一緒に最上級のScalestになりましょう。

私もScala初心者なので、「猿でも分かるScala」を目指して執筆して行きたいと思います。

それでは、宜しくお願いします！！

# 本編
## 環境構築
### Scalaをwindows7にインストール！
- ここ見ると一目瞭然！
    - http://qiita.com/f81@github/items/8d67fb3f211fb3e149db#1-1

### ScalaをMACにインストール！
- まずJavaをインストールしてね！
    - http://www.oracle.com/technetwork/java/javase/downloads/index.html
- Scalaをインストール
    - http://www.scala-lang.org/download/
        - scala-2.10.4(2014/03/31時点)
    - ダウンロードしたらおそらく、下記ディレクトリにあるよね？
        - /Users/XXX/Downloads/scala-2.10.4.tgz
    - 解凍！！
        - Finderでダブルクリックしちゃうか、コマンド(tar zxvf scala-2.10.4.tgz)で。
    - 確認！

```
export SCALA_HOME=/Users/XXX/Downloads/scala-2.10.4
export PATH=$PATH:$SCALA_HOME/bin
scala

scala> 
```
     
## 必殺「Hello World」の術
まずはやっぱり、「Hello World」でしょ。

って方は下記を見てくれれば、理解出来るよ！

- http://qiita.com/f81@github/items/8d67fb3f211fb3e149db#1-2

## Scalaの良い所
### 互換性
- ScalaをコンパイルするとJVMマシンバイトコードになる、つまりJVM上で動作する
- って事は既存のJavaプログラムと容易に連携が可能となる
- Javaプログラムから、scalaプログラムをコールする事も出来る

### 簡潔性
- ScalestからするとJavaと比べて半分のステップ数で済む

```java:MyClass.java

class MyClass {
  private int age;
  private String name;
  public MyClass(int _age, String _name) {
    this.age = _age;
    this.name = _name;
  }
}
```

```scala:MyClass.scala

class MyClass(var age: Int, var name: String) {}
```

### 高水準
高水準・・・・ちょっとすぐに理解出来ない言葉が出ました。詳しく書きますね。

これを見ているアナタ様はきっと、人のソース(Java前提)を読んで改修した経験があると思います。

クラス名、メソッド名、変数名から、何を書いてるのか理解出来るプログラムであればまだ良いですが

Java覚えたての人のソースを見ると、恐ろしい変数名、メソッド名があると思います。

(筆者は「sasaki」というクラスを見た事があります。もちろんauthorはsasakiさんでしたw)

何が言いたいかというと、1からプログラムを組む事よりも、他人が書いたソースコードを読み

理解し、改修し、機能追加し・・・という機会が多いと思います。

そこでコードが複雑すぎて理解が浅い、という事になると・・恐ろしい失敗、バグが待っていますよね。

しかも複雑なソースコードこそ、ミスが許されない重要な機能、ソフトウェアだったりしますよね。

しかーし！！！！

Scalaは、設計・利用するインターフェイスの抽象レベルを上げる事が可能なのです。

これが「高水準」という意味です。

具体例は下記に。

例えば特定の文字列(hoge)に数値が含んでいるか知りたいプログラムを参考にします

下記の例だと、「abcde3fg」の中に数字の3が含んでるのでtrueになりますね。

```java:Test.java

boolean hogeHasNum = false;
String hoge = "abcde3fg";
for (int i = 0; i < hoge.length(); i++) {
	if (Character.isDigit(hoge.charAt(i))) {
		hogeHasNum = true;
		break;
	}
}
```

これをScalaで書くと(もっと完結に書けるかも)

```scala:Test.scala

var hoge = "abcde3fg"
val hogeHasNum = hoge.exists(_.isDigit)
```

まず簡潔、そして見慣れればJavaコードより理解しやすくなると思いませんか？

Scalaコードであれば全体として複雑さが緩和されミスをする危険を減らせます。

Javaコードではループで1文字ずつ処理して文字列を扱っていますが

Scalaコードのこの例ではexistsでfor文の役割を果たし、

_(アンダースコア)でhogeにある文字列の1文字ずつ取り出し、isDigitで判断しています

ScalaではJavaにない、かゆい所に手が届く関数が数多く用意されてます。

### 型推論
これは時と場合によるので絶対良いというわけではありませんが

いちいち型書かなくても分かるわい！って短気で損気な型には使えるかな。

- 型書かないやーつ

```
val message = "Hello"
```

- 型書くやーつ

```
val message:String = "Hello"
```

んー・・・・何かあんまり良さが伝わらないのでもう一個！！

- 型書くやーつ2

```
val x: HashMap[Int, String] = new HashMap[Int, String]()
```

- 型書かないやーつ2

```
val x = new HashMap[Int, String]()
```

おーー何となく短くなったし、見苦しさも無くなったかな。

## まとめ
何となく、Scala良いかも！って思ってもらえましたかね？

今回は筆者の心の言葉ばっかりやん！っていう雰囲気もありますが

こんな感じで楽しく、一歩ずつ、進んで参りたいと思います。

さぁーって、次回の投稿は？

- 実際にコマンドラインでScala叩いてみよう！
- var、valの違いって何だろ？
- Scalaの演算子

の三本です！

次回投稿もまた見てくださいね！

じゃんけん、ぽん！

うふふふふふふ