検索

キーワード


【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

  • 公開日:2020-10-05 16:50:11
  • 最終更新日:2021-01-25 16:35:46
【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。

システムエンジニアとして駆け出したばかりですが、

初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。


プログラム初心者✅にも、プログラムに興味がある人✨も、

短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!


プリミティブ型と参照型

プログラム開発では型を持った変数を使ってデータのやり取りをしますが、

データ型によって仕様が異なるので注意が必要です!

今回はデータ型の違いについてしっかりと説明していこうと思います!


データ型を理解するうえで大切な『変数・オブジェクト指向』が理解できていない方は、

この記事の最後【学習前の事前知識】値の取り扱いで確認できます。

リンクになっていますので飛びましょう!


プリミティブ型

プリミティブ型は数値や文字などの値をそのまま格納することが可能なデータ型です。

このプリミティブ型にはいつくかの種類があり、

それぞれ格納できるデータと範囲が決まっているので確認しましょう。

プリミティブ型一覧


- プリミティブ型変数の宣言(初期化)と操作

プリミティブ型にはそのまま値を代入することができ、

演算子( = + - * / ? 等 )と組み合わせて操作することが可能です。

◆サンプルコード

public class Test {
	public static void main(String args[]) {

		//booleanの宣言(初期化)と操作
		boolean b = true;
		if(b==true) {
			System.out.println("等しい");
		}else {
			System.out.println("等しくない");
		}

		//intの宣言(初期化)と操作
		int i = 100;
		int j = 50;
		int k = i+j;
		System.out.println(k);

		//doubleの宣言(初期化)と操作
		double d = 1.00;
		double e = 0.5;
		double f = d+e;
		System.out.println(f);
	}
}

◆出力結果

等しい
150
1.5

演算子と組み合わせる操作であればプリミティブ型で十分です。

しかしながら、そのままではインスタンス化できないので、

メンバ変数(フィールド)の参照や加工処理機能(メソッド)を実行することができません。


そこを補うために実装された『ラッパークラス』というものが用意されています。

詳しい説明は、【Java】ラッパークラスについての紹介!の記事で紹介しています。


参照型

参照型変数は値そのものを保持しているのではなく格納場所(アドレス)をデータとして持っています。

値のアドレスを参照して値を取得します。参照型は「クラス型」とも呼ばれています。

また、参照先のアドレスのことを「ポインタ」と呼びます。

Javaで参照型変数を宣言して初期化するには代入するためのインスタンス(オブジェクト)を用意する必要があります。

- 参照型の宣言(初期化)と操作

インスタンス生成にはnew演算子を使用するのが基本的なやり方です。

(参照:例外『特殊な参照型』)

参照型 変数 = new クラス名();
参照型 変数 = new クラス名(引数);
ex)Tokyo t = new Tokyo();
   Tokyo t = new Tokyo("TOKYO");


クラスオブジェクトについては以下の記事から確認できます。

参考記事リンク:【Java】 クラスの基本を紹介!


- 特殊な参照型(クラス型[String型、ラッパークラス]、配列型)

上記の説明では、参照型変数にnew演算子を使用して生成したインスタンスを代入する方法を説明しましたが、

それ以外にもインスタンスを生成して参照型変数に代入できるものがいくつかあります。


例えば、String型ではnew演算子を使わずに文字列(文字列リテラル)を直接代入することができたり、

独自の記述によって初期化ができる参照型変数がいつくか存在します。

これは追加機能の実装により便宜的な機能が追加されたなど理由は様々です。

new演算子以外にも参照型変数に代入するインスタンスの生成方法がいくつかありますので確認していきましょう。

String型

String 変数名 = "文字列";
ex.) String s = "HelloWorld";

""(ダブルクォーテーション)で囲われた文字列を「文字列リテラル」と呼びます。

Stringオブジェクトはこの文字列リテラルを書くだけで作成することができるのです!

ソースの中で、"文字列"を書くだけでString型のオブジェクトがメモリ上に自動的に作られる様、

機能が施されています。


ラッパークラス

プリミティブ型に対応するラッパークラスを用いた変数は参照型の変数になります。

new演算子を使ったインスタンス化をすることはできますが、推奨されていません。

Java5.0からプリミティブ型とラッパークラス型の自動変換機能『オートボクシング』が実装され、

値をそのまま代入して初期化する記述ができるようになっています。

ラッパークラス型名 変数名 = 値;
ex.) Boolean b =true;
     Integer i =123;
     Double  d =1.00;

ラッパークラスの詳細は以下の記事で紹介しています!

参考記事リンク:【Java】intとInteger?何が違う?『ラッパークラス』の疑問を解決!!


配列型

配列型変数も参照型変数です。

new演算子を使ったインスタンス生成をすることもできますが、初期化の記述がいくつかあります。

◆要素の個数を指定する初期化

要素の型名 配列変数名 = new 要素の型名[要素の個数];
ex.)boolean[] b=new boolean[2];
    int[] i = new int[3];
    double[] d =new double[5];

◆配列を指定する初期化

要素の型名[] 配列変数名 = new 要素の型名[]{要素1,要素2,要素3,要素4.....};
ex.)boolean[] b=new boolean[] {true,false};
    int[] i =new int[] {1,12,123};
    double[] d =new double[] {1,1.0,1.00,1.000,1.0000};

※『new 要素の型名』は省略可能
    boolean[] b_e={true,false};
    int[] i_e ={1,12,123};
    double[] d_e ={1,1.0,1.00,1.000,1.0000};


- 参照型の比較

参照型の比較を行う場合は、equalsメソッドを使います。

値そのものではなく格納場所(アドレス)をデータとして持っているので、

==演算子を使用すると正しい比較ができません。

そのため参照型ではクラスの中に比較用のメソッドが実装されています。


Stringクラスのequalsメソッドは以下の記事で紹介しています。

参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索



データ渡しの違い

プリミティブ型変数と参照型変数では、データ保持の仕様が異なるので値を渡すときには注意が必要です。

変数での取り扱い

プリミティブ型の変数の場合は、

値を変数間でやり取りする際に持っている値をコピーして渡します。

よって元の変数に格納されている値は、渡した先で変更を加えても影響はでません。

⇒これを『値渡し』と呼んでいます!


参照型の変数の場合は、

値をそのまま保持しているのではなく、メモリ上のポインタ(アドレス)の情報を持っています。

値をやり取りする際にそのポインタ(アドレス)の情報を渡すので、

渡した先で値の変更が為された場合は、元の値も同じように変更されます。

⇒これは『参照渡し』と呼ばれています!


この違いを以下で確認しましょう。

◆サンプルコード

public class Test {
	public static void main(String[] args) {

		//値渡しの例
		int i = 123;
		int i1 = i;
		//値の変更
		i1 = 0;

		System.out.println("【プリミティブ型】");
		System.out.println("元の値:"+i);
		System.out.println("渡した先の値"+i1);


		//参照渡しの例
		int[] il = { 1, 12, 123 };
		int[] il_1 = il;
		//値の変更
		il_1[2] = 0;

		System.out.println("【参照型】");
		System.out.println("元の値:"+il[2]);
		System.out.println("渡した先の値"+il_1[2]);

	}
}

◆出力結果

【プリミティブ型】
元の値:123
渡した先の値0

【参照型】
元の値:0
渡した先の値0


引数での取り扱い

メソッドの引数として値を渡す場合も、

プリミティブ型では『値渡し』参照型では『参照渡し』とデータ型によって違いがあります。


具体的な例は『【Java】 メソッドについて紹介!~メソッド引数(値渡し・参照渡し)~』で紹介しています!

確認しましょう!!



【学習前の事前知識】値の取り扱い

Javaのデータ型を理解するうえで、値の取り扱い方や、変数についての知識が必要になります。

また、オブジェクト指向の知識も必要な要素になります。

この見出しで説明していますので、学習前の方は確認してみてください。

① 値(データ)

プログラムでやり取りする情報を値(データ)と呼びます。

そのデータを一時的に記憶するために用意されているものが変数です。

Javaでは変数の種類や範囲が決められており、データ型という形式で記述します。

変数の宣言

Javaで変数を使用するには変数の宣言を行う必要があります。

宣言することで一時的にデータを記憶する領域が用意されます。型名と変数名を合わせて一つの変数を表します。

型名 変数名;
ex.)int i
    String s

変数名は命名規則がありますので注意しましょう。

命名規約を遵守し、わかりやすく命名することでプログラムの可読性につながります。

データ型

変数はデータ型によって種類や範囲が決められています。

データ型は二つに大きく分けると、

プリミティブ型(別名:値型/基本データ型)参照型(別名:クラス型/リファレンス型)があります。



② オブジェクト指向プログラミング

データ型の詳しい説明に入る前にオブジェクト指向について紹介しましょう。

オブジェクト指向プログラミングはJavaのデータ型を理解するうえで必要な要素です。

オブジェクト指向とは

オブジェクト指向というのは、プログラムを開発するときに用いる考え方の一つであり、

物や事柄すべてをオブジェクト(部品)として捉えることによって

効率的なプログラム開発の実現を目的として生まれたものです。


Javaはオブジェクト指向の考え方に沿ってプログラムを作りやすいように配慮がなされています。

(これを『オブジェクト指向言語』と呼びます。)

Javaには開発者がより便利に、より効率的に作業ができる様、

  • 継承 
  • インターフェース 
  • インスタンス 
  • カプセル化
  • ポリモーフィズム

などの基本概念を持っていて、プログラムの柔軟性や保守性、再利用性の向上に繋がっています!

その中のインスタンスについて少し紹介をします。

インスタンス

オブジェクト指向プログラミングにおいて、クラスの定義に基づきメモリ上に実体化されたオブジェクトをインスタンスと言います。

わかりやすく言えば「クラスというオブジェクトを複製したもの(部品)」です。


Javaのようなオブジェクト指向言語のプログラミングではクラスのインスタンス化(オブジェクト生成)によって、

そのクラス内のフィールド(メンバ変数)の参照やメソッド(加工処理)を実行することができます。

またクラスからインスタンスを生成することを「インスタンス化」(instantiation)と言います。


Tokyoクラスのインスタンス化をして、Testクラスでメンバ変数の参照やメソッドの実行をしてみましょう。

◆サンプルコード

class Tokyo {
	int population = 14000000;
	String name() {
		return "東京都";
	}
}

public class Test {
	public static void main(String[] args) {

		Tokyo t = new Tokyo(); //インスタンス化
		
		System.out.println(t.population);
		System.out.println(t.name());
	}
}

◆出力結果

14000000
東京都

サンプルコードのようにクラスのインスタンスを生成することによって、

そのクラスのメンバ変数やメソッドを操作することができるので、

オブジェクト指向に沿ったインスタンス生成は非常に便利です。


参照型の変数は、インスタンス(クラスオブジェクト)を代入する事ができる変数で、

この変数を使ってメンバ変数(フィールド)を参照したり加工処理(メソッド)を実行することが可能になります。

また、メソッド呼び出し時の引数に指定する事や、戻り値を代入する事ができます。


一方でプリミティブ型の変数は数値などの値をそのまま保持するための変数です。

メソッドの引数に使う事や戻り値の格納もできますが、参照型の変数とは少し扱いが異なるので注意しましょう。


オブジェクト指向・インスタンスをについてしっかりと理解することは、

プリミティブ型/参照型の違いを知る上で非常に大切なのです!


『値の取り扱い』で扱った内容の参考記事は以下です。

参考記事リンク:【Java】 命名規約        

        【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方              

        【Java】インスタンスについて紹介


【著者】

新人SE・サトウ

読者を始め私自身も知りたい!と思うような知って得するプログラミング知識やIT情報を日々発信中です。
筆者の憧れの人物は、コリン・ファースさん、渡部篤郎さん。
教養のあるカッコいい大人になれるよう、プログラミングを始め興味関心を持ったことを毎日勉強しております !!

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】よく使う日時クラス解説まとめ

【Java】よく使う日時クラス解説まとめ

こんにちは、駆け出しエンジニアの伊藤です。東京ITカレッジのJava研修で学んだ内容を復習も兼ねて記事にしたいと思います。今回は、日付時刻のまとめとして、日付時刻に関する基本的なクラスやメソッド等の概要を紹介していきます。より詳しく知りたい!という方は、リンク先の関連記事をご参考にしてください。Javaやプログラムについて勉強し始めた方の参考になれば幸いです!(eclipseを使用して計算を行って