01.はじめての Scala　Scala基礎コース

# 目次

* 【講義】はじめての Scala
* 【講義】Scala とは
* 【実習】JVM のインストール
* 【実習】パッケージ管理システムと Scala の実行環境 sbt のインストール
* 【講義】sbt とは
* 【実習】sbt を動かしてみる
* 【実習】Scala の実行

# 【講義】はじめての Scala

今回は、Scala というプログラミング言語を動かすための環境を作成して、実際に Scala を使った簡単なプログラムを作る。

# 【講義】Scala とは

**Scala** は、2003 年にスイス連邦工科大学のMartin Odersky 教授によって開発されたプログラミング言語で、日本語では「スカラ」と読む。
Martin Odersky 教授は Java 5 で導入された機能であるジェネリクスの開発者であり、彼の書いた Java コンパイラは JDK 1.3 の頃から標準搭載されている。
そういう意味で、Java との縁も深い人だ。

**Java** というプログラミング言語は、1995 年に登場した言語で、20 年以上の歴史の中で多くの実績や既存のライブラリのほとんどを利用できるため、非常に多くの現場で使える言語。

Scala は、**オブジェクト指向プログラミング** と **関数型プログラミング** の両方ができる特徴を持っている。
また Scala は、オブジェクト指向や関数型プログラミングというものの他に、非同期プログラミング、並行・並行処理を得意としている。

Scala は Java を動かすための Java Virtual Machine (JVM) という仮想マシン上で動くため、様々なデバイスの様々な OS 上で動かすことができるという特性を持っている。

# 【実習】JVM のインストール

スキップ

# 【実習】パッケージ管理システムと Scala の実行環境 sbt のインストール

スキップ

# 【講義】sbt とは

そもそも sbt とは何なのか。

**sbt** は、Scala で書いたコードを、JVM 上で動かすためのバイトコードに変換するためのツール。

Scala はプログラミング言語で書いたコードをバイトコードを言われるファイルに1回変換して、それを Java Virtual Machine (JVM) 上で実行する。
この工程のことを **コンパイル** と呼ぶ。
Scala や Java のようにコンパイルに必要なプログラミング言語を **コンパイラ型言語** と呼ぶ。

複数のコードをコンパイルし、動く状態にすることを **ビルド** という。
sbt とは、このビルドをするためのツール。
Scala や Java で開発する場合は sbt などのビルドツールを使うことで、複数の Scala のバージョンを取り扱えたり必要なライブラリを自動的にダウンロードできたりするなどのメリットがある。

# 【実習】sbt を動かしてみる

sbt を実行するためにフォルダを作成して、早速 Scala の対話実行環境である REPL (Read eval pring loop) を起動しよう。

REPL は入力したコードを評価して実行し、その評価した結果を表示する。

```:Terminal
$ cd ~
$ mkdir -p workspace/scala-study
$ cd workspace/scala-study
$ sbt console
...
Welcome to Scala 2.12.14 (OpenJDK 64-Bit Server VM, Java 1.8.0_292).
Type in expressions for evaluation. Or try :help.

scala> 
```

以上のように表示されて、Scala の REPL が表示される。
以上で、Scala の環境の用意が整った。

まずは、`:help` と入力して Enter キーを入力する。

```scala:Terminal
scala> :help
All commands can be abbreviated, e.g., :he instead of :help.
:completions <string>    output completions for the given string
:edit <id>|<line>        edit history
:help [command]          print this summary or command-specific help
:history [num]           show the history (optional num is commands to show)
:h? <string>             search the history
:imports [name name ...] show import history, identifying sources of names
:implicits [-v]          show the implicits in scope
:javap <path|class>      disassemble a file or class name
:line <id>|<line>        place line(s) at the end of history
:load <path>             interpret lines in a file
:paste [-raw] [path]     enter paste mode or paste a file
:power                   enable power user mode
:quit                    exit the interpreter
:replay [options]        reset the repl and replay all previous commands
:require <path>          add a jar to the classpath
:reset [options]         reset the repl to its initial state, forgetting all session entries
:save <path>             save replayable session to a file
:sh <command line>       run a shell command (result is implicitly => List[String])
:settings <options>      update compiler options, if possible; see reset
:silent                  disable/enable automatic printing of results
:type [-v] <expr>        display the type of an expression without evaluating it
:kind [-v] <type>        display the kind of a type. see also :help kind
:warnings                show the suppressed warnings from the most recent line which had any
```

以上のように表示される。
これは REPL 上のコマンドを説明したもの。

今後使っていく可能性が髙いコマンドとしては、コードを貼り付けることができる `:paste` や REPL を終了させる `:quit` 、REPL で宣言した変数や関数などをリセットする `:reset` などがある。

ここで一旦 `:quit` して、REPL を終了させよう。
なお、REPL の終了には時間がかかる場合もある。
また、二度目以降立ち上げる時にはダウンロードは行われず、`workspace/scala-study` で sbt console と実行するだけで大丈夫。
なお、`:quit` で終了できないような場合には、 Ctrl + c または Ctrl + d で強制的に REPL を終了させることもできる。

それでは、先ほど作った `workspace/scala-study` フォルダの中身を確認してみよう。
`target` というフォルダができているのがわかる。

Scala というプログラミング言語はコンパイラ型言語だと紹介した。
この `target` フォルダの中には、バイトコードと呼ばれる JVM 上の命令が書かれたバイナリファイルが出力される。
これは Scala のソースコードがコンパイルされた結果作成されたファイル。

以上からわかるとおり、`sbt console` コマンドを利用して REPL を立ち上げる際には、その直下の `target` フォルダにコンパイル結果が出力されるため、どこで実行するかが重要になる。

# 【実習】Scala の実行

では、再度 REPL を立ち上げてみよう。

```
sbt console
```

以上のコマンドを利用して、sbt を立ち上げる。

```
scala>
```

以上のように REPL のプロンプトが表示されれば成功。

それでは、簡単な計算をやってみよう。

```
scala> 25 + 25
res0: Int = 50
```

以上のように表示される。

次に、

```
scala> res0 + 100
res1: Int = 150
```

以上のように表示される。

Scala の REPL では入力の結果を `res` とインデックスの数値で表される変数に自動的に代入する。
ここでは、25 + 25 の結果が `res0` という変数に割り当てられ、50 という値を持つ `res0` に 100 を足した 150 という結果が、`res1` という変数に割り当てられた。

また `res0` を説明する情報として、int という文字列が表示されている。
これは変数の **型** の情報。
int は英語で ineger すなわち整数の意味なので、今回の場合 res0 の結果の値が変数の方であることを表している。

なお、C や Java などの言語では型を変数の前に書くが、Scala では型を変数の後ろに書く。

従って、

```
res0: Int = 50
```

は、変数 `res0` が Int という型つまり整数で、値は 50 であるという意味の表示。

この REPL は今後 Scala を学んでいく上でよく利用するので、Scala の記法で疑問に思うことがあった際には、すぐに REPL を起動して実際にコードを書いてみて確認してみよう。

# まとめ

* Scala は、オブジェクト指向プログラミングと関数型プログラミングの両方の性質を持つ
* Scala は、コンパイラ型言語であり JVM 上で動く
* Scala は、Java の運用経験やライブラリを利用できる

# 挑戦

## 初級

```scala:Terminal
scala> 8327 * 9874
res0: Int = 82220798
```

## 中級

```scala:Terminal
scala>  def fizzBuzz(n: Int) {
     |    if (n % 15 == 0) {
     |      println("FizzBuzz")
     |    } else if (n % 3 == 0) {
     |      println("Fizz")
     |    } else if (n % 5 == 0) {
     |      println("Buzz")
     |    } else {
     |      println(n)
     |    }
     |  }
fizzBuzz: (n: Int)Unit

scala> (1 to 100).foreach(fizzBuzz)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

## 上級

```scala:Terminal
scala> def printCount(n: Int): Unit = {
     |   println(n)
     |   printCount(n + 1)
     | }
printCount: (n: Int)Unit

scala> printCount(0)
0
1
2
...
638825
...
```