KotlinはJavaのプリミティブ型に当たるデータ型を持ちません。しかし、同等な記述が基本データ型を用いて出来ます。
Kotlinにおいて、基本データ型がどのように扱われているのか、まとめます。
※環境:Android Studio Giraffe | 2022.3.1 Patch 1
Kotlin 1.8.10
Kotlinの基本データ型
KotlinはJavaのプリミティブ型に当たるデータ型を持ちません。ただ、一対一に対応する基本データ型があります。Javaのラッパークラスに似ています。
両者を比べると表のようになります。
| Java | Kotlin |
提供方法 | システム組み込み | ライブラリ |
扱われ方
(メモリーの格納方法) | 値のまま直接保持
・符号なし整数
・2の補数による整数
・UTF-16 コード
・IEEE 754準拠の浮動小数点数 | オブジェクト
・プロパティを実装
・関数を実装
|
データ型の種類 | byte
short
int
long
float
double
boolean
char | Byte
Short
Int
Long
Float
Double
Boolean
Char |
※Javaはオブジェクトを作るプリミティブ型のラッパークラスも存在する |
※基本データ型はStringも含まれますが、表はJavaのプリミティブ型に関連するデータ型へ限定しています。
基本データ型はオブジェクト
Kotlinの基本データ型はソースコードとバイトコードで振る舞いが異なります。
ソースコードレベルはオブジェクトです。しかし、バイトコードレベルはJavaのプリミティブ型です。

Kotlinコンパイラーが一対一に対応する基本データ型の仲立ちを行っています。
基本データ型の振る舞い
例えば、次のようなソースコードを考えます。整数22を定義して、+3を行うプログラムです。
var _value: Int = 22
_value += 3
Log.i(TAG, "value = ${_value}")
バイトコード
バイトコードは整数22を値のまま、PUSHやPOPを行ったり、+3の演算を行ったり、することが確認できます。
整数22は特定の(メモリ上の)格納先やその参照先を持ちません。すべての処理は、ローカル変数(レジスタ)やスタック(PUSH/POP先)など、VM(バーチャルマシン)の内部リソースで完結しています。
これはプリミティブ型の振る舞い方です。
L0
LINENUMBER 8 L0
BIPUSH 22 -> 整数22をスタックへPUSH
ISTORE 0 -> ローカル変数0へスタックからPOP
L1
LINENUMBER 9 L1
ILOAD 0 -> ローカル変数0をスタックへPUSH
ICONST_3 -> 整数3をスタックへPUSH
IADD -> スタックから2つPOP、両者を加算、答えをスタックへPUSH
ISTORE 0 -> ローカル変数0へスタックからPOP
L2
LINENUMBER 10 L2
LDC "TypeChecker"
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
LDC "value = "
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ILOAD 0
INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
INVOKESTATIC android/util/Log.i (Ljava/lang/String;Ljava/lang/String;)I
POP
ちなみに、上記のバイトコードをデコンパイルすると、単純にJavaのプリミティブ型へ置き換えただけのソースコードになります。
int _value = 22;
_value += 3;
Log.i("TypeChecker", "value = " + _value);
ソースコード
ソースコードは整数22をオブジェクト(Int型のオブジェクト)として、プロパティを参照したり、関数を実行したり、できます。
そして、整数22のインスタンスの参照値が変数(_value)へ代入されたように、扱うことが出来ます。
これは、オブジェクトの振る舞い方です。

ただし、このオブジェクトの振る舞いはシステムよって付与された仮想的なものであり、実態はバイトコードのようなプリミティブ型であることに注意してください。
関連記事:
KDocのドキュメント記述例を紹介します。 KDocを使えばKotlinのソースコードに書いたコメントからドキュメントを作成することが出来ます。後々、クラスの再利用を考えているなら、ドキュメントを残して再利用性を高めておきましょう! ...
Kotlinは関数を変数に代入したり、引数で受け渡したりできます。 関数を第一級オブジェクトで扱えるためです。 これにより、関数を使った処理の委譲が容易になりました。ArrayOf#forEach( )がその典型的な例です。 以上のような操作で必要となる「関数オブジェクト」について、まとめます。 ...
クロージャ(Closure)は新しい概念ではなく、関数型プログラミングに古くから存在していました。 手続き型やオブジェクト指向プログラミングにも、だいぶ前から採用が進んでいます。 Kotlinもクロージャが使える言語の1つです。 ...
Androidのアプリを作成しているとSAM変換が頻繁に登場します。 プログラムが簡素に記述できることから、プログラマーに好評なようです。 Kotlinが関数を第一級オブジェクトとして扱える恩恵です。 しかし、私はSAM変換に出合うと、いつもプログラムの論理が把握できなくて戸惑います。なので、苦手です。あまり好きではありません。 苦手を克服するために、もっとSAM変換の理解を深めたいと思い、まとめてみました。 ...
近頃の携帯端末はクワッドコア(プロセッサが4つ)やオクタコア(プロセッサが8つ)が当たり前になりました。 サクサク動作するアプリを作るために、この恩恵を使わなければ損です。 となると、必然的に非同期処理(マルチスレッド)を使うことになります。 JavaのThreadクラス、Android APIのAsyncTaskクラスが代表的な手法です。 Kotlinは上記に加えて「コルーチン(Coroutine)」が使えるようになっています。 今回は、このコルーチンについて、まとめます。 ...
Android Studio Giraffe(2023.07)になって、ビルドスクリプトの推奨がKotlin DSLになりました。 この機会に、ビルドスクリプトと記述言語についてまとめます。 ※環境:Android Studio Giraffe | 2022.3.1 :Android Gradle Plugin 8.1.0 :Gradle 8.0 ...
Kotlinにおいて、各クラスのインスタンスに自動生成されるequals()関数は、classとdata classで比較対象に違いがあります。 紛らさしいので、まとめます。 ※環境:Android Studio Giraffe | 2022.3.1 Patch 1 Kotlin 1.8.10 ...
継承を行うことなく新しい機能(関数やプロパティ)をクラスへ追加する「拡張機能」についてまとめます。 何処にでも手軽に定義できるため、とても重宝する仕組みですが、乱用するとプログラムが無法地帯になるので、管理は重要です。そのために、十分な理解が必要になります。 ちなみに、Android Jetpackは、この「拡張機能」を活用して作られた部分が多くあります。「拡張機能」無くして、成り立たないシステムです。 ※環境:Android Studio Hedgehog | 2023.1.1 Patch 1 Kotlin 1.8.10 ...
スコープ関数はKotlinの標準ライブラリで提供されています。 そのことから、Kotlinを特徴付ける重要な構文であることが分かります。 ただし、「プログラムの動作を定義する構文」ではなく、「プログラムのコードの品質を上げる構文」です。 同様な動作はスコープ関数を使わなくても記述できます。しかし、スコープ関数を使えばスマートな(洗練された)記述になります。 積極的に使いたいと思いますが、applyとlet以外はあまり使う機会がありません。また、稀にwithなどが登場すると、コードの流れが理解できずに戸惑います。 ですので、スコープ関数について、まとめました。 ※環境:Android Studio Hedgehog | 2023.1.1 Patch 2 Kotlin 1.9.0 Compose Compiler 1.5.1 ...
Kotlinで利用可能なJSONライブラリーには「GSON, Jackson, Moshi, Kotlin Serializationなど」があります。 始めの3つはJavaがベースです。その中のMoshiは、拡張機能によりKotlinとの親和性が高められています。 Kotlin SerializationはJSON以外(Protobuf, CBOR, Hocon, Properties )のフォーマットも扱えます。フォーマットを扱うというよりも、シリアル化の機能を重視したライブラリーのようです。 プログラム間でデータを受け渡す際に用いるのであれば、Kotlin Serializationが最も適しているかも知れません。 Kotlin Serializationに興味を引かれますが、後の機会に置いといて... 今回は、Moshiについて、まとめます。 ※環境:Android Studio Ladybug Feature Drop | 2024.2.2 Kotlin 2.0.0 Moshi 1.15.2 ...
MoshiでJSONをパース(JSONの記述⇔データクラスのオブジェクト)する場合に、一般クラスは未対応です。 例えば、データクラス以外の、ユーザ定義のクラスはパース出来ません。 対応させるためには、そのクラスのカスタムJsonAdapterを作成します。 そして、相互変換する方法をプログラマー側で定義します。 カスタムJsonAdapterの作成方法をまとめます。 ※環境:Android Studio Ladybug Feature Drop | 2024.2.2 Kotlin 2.0.0 Moshi 1.15.2 ...