はじめに
プログラミングにおいてデータ型の選択は重要です。
どのような場面でどんなデータ型を選択するかでプログラムの挙動が変わってしまうこともあるため、使用する主なデータ型を整理しました。
データ型が重要な理由
データ型は、正確性・効率性・可読性・保守性・互換性の観点から重要です。
例えば、正確性について、データ型が、変数や値がどのような種類のデータを扱うかを明確にすることによって、型不一致によるエラーの防止やデータの整合性の保証を行なうことができます。
また、メモリの使用量を最適化するためにも重要です。異なるデータ型は、メモリ内で異なるサイズを占めます。
例えば、整数型(int)は通常、4バイトまたは8バイトを占めますが、文字型(char)は通常、1バイトを占めると言った具合です。
データ型の種類
データ型には大きく、「プリミティブ型」と「参照(オブジェクト)型」が存在します。
プリミティブ型
最も基本的なデータ型で、単一の値を直接的に表現するために使用されます。
主な特徴
- 単一の値
・プリミティブ型は、1つの値だけを保持 - メモリ効率
・メモリ上で直接的に値が格納されるため、処理が高速
・メモリサイズが固定されている - 不変性
・多くの言語で、プリミティブ型の値は変更できない(イミュータブル) - 使用メモリ
・スタックメモリを使用するのが一般的
・値そのものをスタックメモリに格納する - データの変更
・値をコピーして使用するため、元の値に影響を与えない(値渡し)
プリミティブ型一覧
データ型 | 用途 | 例 (言語) |
---|---|---|
整数型 | 整数を表現 |
int (Java) number (JavaScript) |
浮動小数点数型 | 小数を含む数値を表現 |
float (Java) number (JavaScript) |
文字型 | 単一の文字を表現 |
char (Java) str (Python) |
真偽値型 | 真偽値を表現 |
boolean (Java) bool (Python) |
文字列型 | テキストデータを表現 |
String (Java) str (Python) |
参照(オブジェクト)型
参照型はメモリ上のオブジェクトを参照することでデータを扱います。
プリミティブ型と異なり、値そのものがスタックメモリに格納されていません。
スタックメモリにはそのオブジェクトが格納されている場所を示す参照(オブジェクトの場所を示すメモリアドレス)が格納されています。具体的なオブジェクトはこの参照が指し示すヒープメモリに格納されています。
したがって、スタックメモリ上の参照を通じて、ヒープメモリに格納されているオブジェクトにアクセスします。
また、プリミティブ型ではないものは全てオブジェクトと呼ばれます。
主な特徴
- オブジェクトを参照する
・参照型の変数は、メモリ上のオブジェクトの場所(アドレス)を保持します。 - 複雑なデータ構造
・複数の値やメソッドをまとめて扱うことができます。 - 動的メモリ管理
・オブジェクトはヒープメモリに格納され、必要に応じて確保・解放されます。
・メモリ量が固定されていないため、ランタイムで必要な量のメモリを確保します。 - 使用メモリ
・ヒープメモリ(データそのものを保存)
・スタックメモリ(参照を保存) - データの変更
・参照を共有するため、元の値に影響がある
参照(オブジェクト)型一覧
データ型 | 用途 | 例 (言語別) |
---|---|---|
配列 | 同じ型のデータを複数保持 |
int[] (Java) list (Python) |
リスト | 可変長のデータ集合を表現 |
ArrayList (Java) list (Python) |
辞書 | キーと値のペアを管理 |
HashMap (Java) dict (Python) |
セット | 重複のないデータ集合を表現 |
HashSet (Java) set (Python) |
クラスのインスタンス | オブジェクト指向プログラミングで使用 |
Person (Java, Python, JavaScript) |
関数 | 関数をオブジェクトとして扱う |
Function (Java) function (Python) |
プリミティブ型・参照(オブジェクト)型の比較
比較項目 | プリミティブ型 | 参照型 |
---|---|---|
データの保存場所 | スタック(stack)に直接値を保存 | ・ヒープ(heap)にデータを保存 ・その参照(アドレス)をスタックに保持 |
主なデータ型 | ・数値(int, float など) ・真偽値(boolean) ・文字(char)など |
・配列(Array) ・オブジェクト(Object) ・関数(Function)など |
値のコピー | 値そのものをコピー(値渡し) | 参照(アドレス)をコピー(参照渡し) |
データの変更 | コピーした変数を変更しても元の値に影響なし | コピーした変数を変更すると元のデータも変わる |
※データの比較には注意が必要です。
プリミティブ型では、データそのものが格納されているため、比較演算子によってデータの比較ができます。
一方、参照(オブジェクト)型はデータの場所を示すメモリアドレスが格納されているため、メモリアドレス、つまり同じ場所にあるかどうかを比較することになってしまい、比較演算子によるデータそのものの比較はできません。
デフォルトでは比較できないため、別の方法を使うことで比較が可能になります。
まとめ
データ型には大きく分けてプリミティブ型とオブジェクト型の2種類あり、それぞれに役割やデータの扱い方が異なります。適切なデータ型を選択できるようにしていきましょう!
最後までお読みいただき、ありがとうございました。
参考
https://zenn.dev/tigrebiz/articles/1c06ef9f24e521
https://medium-company.com/java-%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3%82%A3%E3%83%96%E5%9E%8B-%E5%8F%82%E7%85%A7%E5%9E%8B/
https://androidkoko.com/java/type.html
https://freelance-jak.com/technology/java/1175/