第6章：Scalaのプリミティブ型を語る

今回も型だYO, YO！
プリミティブ型について語ってみる。
データ型としては基本だけど、重要だからね！

# プリミティブ型とは
__基本型__ という表現もするけど、 __プリミティブ型__ の方が一般的かな？
そもそもの __プリミティブ型__ の定義をWikipediaで見てみよう。

> プリミティブ型（プリミティブがた）とは、計算機科学において、プログラミング言語によって提供されるデータ型であり基本的な要素である。対する語は複合型という。言語やその実装に依存して、プリミティブ型がコンピュータメモリ上のオブジェクトと一対一対応のときもあれば、そうでないときもある。組み込み型もしくは基本型とも呼ぶ。プリミティブ型の種類は、使用されているプログラミング言語に依存する。例えばC言語では、文字列は複合データ型だが、BASICやその派生言語ではプリミティブ型である。

クロージャよりはわかりやすいけど、やっぱり難しいかな。。。

> プログラミング言語によって提供されるデータ型

この文だけ読むと、プログラミング言語が予め用意してくれている型のようだね。
ということは、言語を調べれば具体的にわかるかもしれない？

# Javaの世界のプリミティブ型
ということで、まずはJavaの世界のプリミティブ型を見てみよう！
[ここ](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)に記述されているよ。
この時点で、言語が宣言しているモノとわかるね。

Javaのプリミティブ型は、以下な感じとなる。

+ 文字型
+ 符号付整数型
+ 浮動小数点型
+ 真偽値型

これら以外は参照型となります。
参照型は、 __オブジェクト型__ と呼んでも良いですね。

個人的には

+ インスタンスの参照を意識したい場合に、 __参照型__
+ 型そのモノを意識したいときに、 __オブジェクト型__

と使い分けることが多いです。

ところでJavaの成果でのプリミティブ型・参照型の大きな違いはメモリ管理だ。
スタック領域・ヒープ領域って聞いたことあるかな？
ここの使い方が変わってくるよ。
この話はこれ以上しないから、興味があったら調べてみてね。

## Javaのプリミティブ型の例
ではソースコード上で実際に記述できる型を見てみよう。

|種別|型|サイズ|例|オブジェクト型|
|:-----|:-----|:-----|:-----|:-----|
|文字|char|2バイト|'A', '\u0041', 'あ'|Character|
|符号付整数|byte|1バイト|127, -128|Byte|
||short|2バイト|32767, -32768|Short|
||int|4バイト|2147483647, -2147483648|Integer|
||long|8バイト|9223372036854775807L|Long|
|浮動小数点数|float|4バイト|1.2f, 1.2e2f|Float|
||double|8バイト|1.2, 1.2e2|Double|
|真偽値|boolean|1ビット|true, false|Boolean|

上記の表に __オブジェクト型__ というカラムを追加しています。
Javaのプリミティブ型の各型に対応するオブジェクト型です。
__Wrapperクラス__ ってやつですね。

# Scalaのプリミティブ型
では次にScalaのプリミティブ型を見てみよう。
実は __Scalaにはプリミティブ型が存在しない__ んだ。
なぜなら、Scalaは全て __オブジェクト__ だからね。

でもJavaのプリミティブ型に対応する、プリミティブ型相当の型が存在しているんだ。

## Scalaのプリミティブ型相当の例
では、Javaのプリミティブ型がどのように対応付けできるか
マッピングを見てみよう！

|Javaでの型|Scalaでの型|サイズ|例|
|:-----|:-----|:-----|:-----|
|char|Char|2バイト|'A', '\u0041', 'あ'|
|byte|Byte|1バイト|127, -128|
|short|Short|2バイト|32767, -32768|
|int|Int|4バイト|2147483647, -2147483648|
|long|Long|8バイト|9223372036854775807L|
|float|Float|4バイト|1.2f, 1.2e2f|
|double|Double|8バイト|1.2, 1.2e2|
|boolean|Boolean|1ビット|true, false|

また、Javaでの表にもあって冗長だけど、サイズと例を記述しておいたよ。

サイズなんかもJavaと同じなので、Javaプログラマーなら違和感なく使えると思う。

## String型
文字列型です。
Javaではもちろんプリミティブ型ではないし、Scalaでも違うけど
基本型であるから記述しました。

先の表で書いたけど、 __Charのシーケンス__です。
シーケンス、知っているようで微妙だったので調べてみた。
このコンテキストだと __連続(しているもの)__ とか __並び__ がしっくりくるね。

# リテラル
今回の最後は __リテラル__ だ！

リテラルとは、ソースに値を直接書く書き方だよ。
`new`でインスタンス化を行わない略記と言えるね。
JavaScriptだとオブジェクトリテラルなんてのがあるよね。

各リテラルをソースに纏めておくので、試してみてね。
コップ本のパクリじゃないか！という突っ込みはなしだよ。

```scala:Literal.scala
object Literal {
  def main(args: Array[String]){
    // 整数リテラル
    // 10進数
    val dec = 24
    println("dec:" + dec)

    // 16進数
    val hex = 0x24
    println("hex:" + hex)

    // Long
    val prog = 35L
    println("prog:" + hex)

    // 浮動小数点数リテラル
    val big = 1.2
    println("big:" + big)

    val bigger = 1.2e2
    println("bigger:" + bigger)

    val biggerStill = 1.2e45
    println("biggerStill:" + biggerStill)

    val little = 1.2f
    println("little:" + little)

    // 文字リテラル
    val a = 'あ'
    println("a:" + a)
    
    // 文字列リテラル
    val name = "田沢 慎一郎"
    println("name:" + name)
    
    val sentence = """|Test test
    |test "test"""".stripMargin
    println("sentence:" + sentence)
    
    // 真偽値リテラル
    val bool = true
    println("bool:" + bool)
    
    // シンボルリテラル
    val s = 'synbolA
    println("s:" + s.name)
  }

}
```

    $ scalac Literal.scala

    $ scala Literal
    dec:24
    hex:36
    prog:36
    big:1.2
    bigger:120.0
    biggerStill:1.2E45
    little:1.2
    a:あ
    name:田沢 慎一郎
    sentence:Test test
    test "test"
    bool:true
    s:synbolA

シンボルリテラルについては説明が必要ですが、別の章で説明することにします。

# まとめ
今回は

* Scalaにはプリミティブ型存在しない
* Javaのプリミティブ型に相当する型が存在する

ことについて語ってみたけど、どうだった？
Javaプログラマーなら、 __Wrapperクラス__ で考えると違和感なく使えると思うよ。


__プリミティブ型__を __体で感じてくれたかな？__