【Java】プリミティブ型と参照型をやさしく解説|初心者がつまずくポイントを実務目線で整理

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Java を学び始めると必ず出てくるのが
「プリミティブ型と参照型の違い」 というテーマ。

言葉だけ聞くとむずかしそうですが、
実務では「値そのものを扱うのか」「モノへの住所を扱うのか」
この違いさえつかめれば十分です。

この記事では、やさしく・実務寄りに
この2つの違いを整理していきます。


まずはコードを確認

Java
int a = 10;
int b = a;
b = 20;

String s1 = "hello";
String s2 = s1;
s1 = "world";

System.out.println(a);  // 10
System.out.println(b);  // 20

System.out.println(s1); // world
System.out.println(s2); // hello

コードのしくみを解説

プリミティブ型は「値そのもの」をコピーする

int, double, boolean などのプリミティブ型は
変数に値そのものが入っています。

a = 10
b = a(10がコピーされる)

そのため b を変更しても a には影響しません。

実務イメージ

  • 「数字メモをコピーして渡す」
  • コピー先を書き換えても元のメモは変わらない

参照型は「モノの住所」をコピーする

String, List, Object などの参照型は
変数に入っているのは“データそのもの”ではなく“住所”です。

s1 = "hello"(文字列オブジェクトの住所が入る)
s2 = s1(住所がコピーされる)

ただし今回の例では s1 = "world" と再代入しているため、 s1 が別の住所を指すようになり、s2 は元の住所のままです。

実務イメージ

  • 「家の住所を書いた紙をコピーして渡す」
  • コピー先の紙を捨てても、家そのものは変わらない
  • ただし紙に“別の住所”を書き直したら、指す家が変わる

あわせて知っておきたいポイント

参照型は「同じオブジェクトを共有しがち」

特に ListMap など mutable なオブジェクトは要注意。

Java
List<String> list1 = new ArrayList<>();
list1.add("A");

List<String> list2 = list1;
list2.add("B");

System.out.println(list1); // [A, B]

list1 と list2 が同じオブジェクトを見ている ため、
片方の変更がもう片方にも影響します。

String は特殊(immutable)

String は参照型ですが 変更不可(immutable) のため、
再代入すると新しいオブジェクトが作られます。


使うときに気をつけたいこと

  • 参照型を別の変数に渡すときは「同じものを共有する」ことを意識する
  • 意図せず片方の変更がもう片方に影響するバグが起きやすい
  • 特に List / Map / DTO のコピーは慎重に
  • 必要なら「ディープコピー」「新しいインスタンス生成」を検討する

実務ではこの“共有している感覚”があるかどうかで
バグの発生率が大きく変わります。


まとめ

プリミティブ型

  • 値そのものを持つ
  • コピーしても独立している

参照型

  • オブジェクトの住所を持つ
  • コピーすると同じオブジェクトを共有する
  • String は immutable で例外的に扱いやすい

decopon
decopon

Java のデータ型は、最初は抽象的に感じる部分ですが、 「値を持つのか」「住所を持つのか」 この2つを軸にすると一気に理解が進みます。

実務でもこの違いを意識しておくと、 「なぜか値が勝手に変わってる…」というバグを避けられます。 あなたの学びが、次の一歩につながりますように。

moco
moco

プリミティブは“そのまま”、参照型は“住所”。
これだけ覚えておけば、Java ともっと仲良くなれるよ。

コメント

タイトルとURLをコピーしました