29
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-07-29

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

プリミティブ型とは

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

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

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

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

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

Javaの世界のプリミティブ型

ということで、まずはJavaの世界のプリミティブ型を見てみよう!
ここに記述されているよ。
この時点で、言語が宣言しているモノとわかるね。

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だとオブジェクトリテラルなんてのがあるよね。

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

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クラス で考えると違和感なく使えると思うよ。

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

29
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?