【Java】基本データ型(プリミティブ型)と参照型
- 作成日:2022/02/08
Javaの型についてまとめました。
型の種類
Javaには大きく分けて「基本データ型」と「参照型」という2つの型があります。 基本データ型はプリミティブ型とも呼ばれます。
基本データ型にはint型やbooleanなど8種類あります。その8種類以外は全て参照型です。
基本データ型 | 参照型 |
---|---|
boolean | 左以外のすべて |
byte | |
char | |
short | |
int | |
long | |
float | |
double |
ちなみに、独自に作成したクラスも参照型です。
仕組み
「基本データ型」と「参照型」の仕組みについて簡単に解説しておきます。 これら2つはメモリの確保の仕方が異なります。
基本データ型はデータのサイズが決まっているので、コンピュータはメモリをどれくらい確保したら良いのかわかります。 基本データ型の変数はスタック領域という所に必要な分だけメモリを確保します。
一方で、参照型はサイズが可変なので、コンピュータはメモリをどれくらい確保したら良いのか、宣言の時点ではわかりません。 そのため、コンピュータはヒープ領域という所にデータを保存します。 そして、スタック領域にはヒープ領域のアドレス(参照値)を保存します。
基本データ型はスタック領域に直接データを保存するのに対して、参照型はスタック領域にアドレスを保存しており、実際のデータは別の場所(ヒープ領域)にあります。
参照型は「アドレスを参照するので参照型と呼ばれる」と理解すると覚えやすいかもしれませんね。
基本データ型(プリミティブ型)
基本データ型の特徴は以下のようになります。
- データのサイズが決まっている
- 型名は全て小文字
- メソッドをもたない
- nullを代入できない
より詳しく解説していきます。
データのサイズが固定
基本データ型はサイズが決まっており、以下のような特徴があります。
基本データ型 | 種類 | サイズ | 値 |
---|---|---|---|
boolean | 真偽値 | 1ビット | TrueかFalse |
byte | 整数 | 8ビット | -128~127 |
char | 文字 | 16ビット | 0~65,535 |
short | 整数 | 16ビット | -32,768~32,767 |
int | 整数 | 32ビット | -2,147,483,648~2,147,483,647 |
long | 整数 | 64ビット | -9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
float | 浮動小数点 | 32ビット | ±3.40282347E+38~ 1.40239846E-45 |
double | 浮動小数点 | 64ビット | ±1.79769313486231570E+308~±4.94065645841246544E-324 |
例えば、int型で変数宣言をしたらコンピュータはその時点で32ビットのメモリを確保するので、 int型はその範囲内で収まる値しか変数に格納できません。 もちろん、サイズが多いほうがより広範囲のデータを表現できます。
あと、型名は全て小文字です。
メソッドをもたない
基本データ型はデータのみなのでメソッドを持ちません。
例えば、参照型のString型は文字列の長さを取得するlength()メソッドや文字列を比較するequals()などの様々なメソッドを持ちます。
しかし、基本データ型はメソッドをもたないためデータを操作することがでません。値のみです。
参照型
参照型の特徴は以下のようになります。
- 型名の1文字目は大文字(Stringなど)
- メソッドをもてる
- 変数名を定義するときはインスタンスを生成する
参照型は先頭文字が大文字です。独自で定義したクラスも参照型です。ただし、その場合クラス名は全て小文字でもエラーにはなりませんが、 クラス名の先頭文字は大文字にするのが一般的です。
では、その他の項目を詳しく解説していきます。
メソッドをもてる
参照型は変数を操作するメソッドをもてる特徴があります。 例えば、以下のソースコードだと7,8行目でString型のメソッドを使っています。
class TestClass {
void test() {
String tmp="abcdefg";
System.out.println(tmp.length());
System.out.println(tmp.equals("abc"));
}
}
7行目で文字列長を調べるlengthメソッド、8行目で文字列を比較するequalsメソッドを使っています。
このように、参照型で宣言した変数はメソッドをもつことができるので、何かと便利な機能を備えているのです。
インスタンスを生成する
参照型を使うときはnew演算子でインスタンスを生成します。 以下のソースコードの16行目がインスタンス生成です。
class TestClass {
void test() {
String tmp="abcdefg";
System.out.println(tmp.length());
System.out.println(tmp.equals("abc"));
}
}
public class App {
//main関数
public static void main(String[] args) {
TestClass tmp = new TestClass();
}
}
TestClassは独自に定義したクラスなので、参照型クラスです。 そのため、16行目の右辺が実行された時、コンピュータはメモリ内のヒープ領域にデータ(インスタンス)を生成し、 さらにスタック領域にそのインスタンスのアドレスを格納します。
そして、そのアドレスを変数tmpに代入しているのが16行目の処理です。 このように、参照型の変数を使うときはインスタンスを生成する必要があります。
new演算子を使わないインスタンス化
参照型はインスタンス化が必要と書きましたが、全ての参照型がnew演算子を使いインスタンス化するわけではありません。
例えば、先ほど紹介したString型も参照型ですが、new演算子を使っていないことに気がついたでしょうか。先ほどのソースコードを一部抜粋します。
void test() {
String tmp="abcdefg";
}
String型は少し特別で、文字列を指定して代入すると、コンピュータが勝手にインスタンスを生成してくれるのです。 そして、変数tmpにはインスタンス(abcdefgという文字列データ)のアドレスが格納されます。
このように、インスタンス化する方法はnewだけでないので覚えておくと良いでしょう。 ちなみに、「String tmp= new String("abcdefg");」と記述してもエラーにはなりませんが、推奨されていません。