こんにちは、コイキングです。
本記事では'データ型'について、説明したいと思います。
1.データ型とは?
変数がどの様なタイプのデータかを示すのがデータタイプと言えます。
Javaでデータ型は大きく 'プリミティブ型'と'参照型' に分けられます。
2. プリミティブ型
プリミティブ型は 変数に値の実体が格納される データ型です。
因みに '変数に格納される値の実体'をリテラル と言います。
Javaでプリミティブのデータ型は8つありまして、詳しくは以下の表を参考にしてください。
※ Javaのプリミティブデータ型
データの分類 | データ型 | メモリー空間 | 値の表現範囲 | 解説 |
---|---|---|---|---|
整数 | byte | 1 byte | -128 ~ 127 | 整数データを入れられるデータ型、最も多く使われているのはint型 |
short | 2 byte | -32,768 ~ 32,767 | ||
int | 4 byte | -2,147,483,648 ~ 2,147,483,647 | ||
long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,808 | ||
浮動小数点数 | float | 4 byte | 1.4E-045 ~ 3.4E+038 | 浮動小数点数データを入れられるデータ型、最も多く使われているのはdouble型 |
double | 8 byte | 4.9E-324 ~ 1.8E+308 | ||
文字 | char | 2 byte | 0 ~ 65,535のユニコード文字 | シングルクォーテーション('')で囲むユニコード文字1個を入れられるデータ型 |
論理 | boolean | 1 byte | true 又は false | 真(true)か偽(false)の値が入れられるデータ型 |
同じデータ類のデータ型が複数存在する理由
整数データの場合、データ型がbyte, short, int, long4つ存在します。
結論から言いますと、データ型が複数存在する理由はメモリー空間の効率良く使うためです。
例えると整数データを入れるための'変数a'があると仮定してみましょう。
また変数aに代入する値は絶対に127を超えないという条件がある状態で、変数aのデータ型をlongにしたら、変数aが占めるメモリー空間は8 byteになります。
longの代わりに変数aのデータ型をbyteにしたら、変数aが占めるメモリー空間は1 byteになります。longにしたら占めるメモリー空間が8倍も多くなるのですが、今の時代のハードウェアでは変数1個2個ぐらいはあまりメモリ問題にはならないと思います。しかし、変数を数百、数千個を使うのであればメモリーの無駄使いになり、メモリーリークになりがちです。
各データ型別で変数を宣言して、初期化してみる
// 変数宣言
short short1;
int int1;
long long1;
float float1;
double double1;
char char1;
byte byte1;
boolean boolean1;
// データ型別値代入
byte1 = 1;
short1 = 1;
int1 = 2;
long1 = 4L;
float1 = 0.4f;
double1 = 0.4;
char1 = 'a';
boolean1 = true;
3.参照型
参照型はJavaの1) ライブラリ又は2)プログラマーが直接実装したクラスやインターフェースを変数のデータ型にすることを言います。
参照型がプリミティブ型と違い、変数にリテラルが格納されるのではなく、インスタンスのメモリー住所の値が格納されます。
'new'オペレーターを使い、インスタンスを生成し、インスタンスのメモリー住所の値を参照型の変数に格納できます。
1) ライブラリクラス
// [クラス名] [変数名] = new [コンストラクター()];
Object object = new Object();
System.out.println(object); // java.lang.Object@{Heapのメモリー住所}
2) プログラマーが実装したクラス
TestDataType tdt = new TestDataType(100, "test");
System.out.println(tdt); //basic.TestDataType@{Heapのメモリー住所}
class TestDataType{
int testInt;
String testStr;
public TestDataType(int testInt, String testStr) {
this.testInt = testInt;
this.testStr = testStr;
}
}
※Stringクラスはプリミティブ型の様に値を直接代入する事ができます。
// StringリテラルはHeapの"String Constant Pool"に入る
String str1 = "string1";
// 'new'オペレーターを使うとHeapにインスタンス生成
String str2 = new String("string2");
※例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_03_DataType.java
※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/75?category=1068655