こんにちは、コイキングです。
本記事では'データ型'について、説明したいと思います。
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