今回も型だ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だとオブジェクトリテラルなんてのがあるよね。
各リテラルをソースに纏めておくので、試してみてね。
コップ本のパクリじゃないか!という突っ込みはなしだよ。
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クラス で考えると違和感なく使えると思うよ。
__プリミティブ型__を 体で感じてくれたかな?