はじめに
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 は元の住所のままです。
実務イメージ
- 「家の住所を書いた紙をコピーして渡す」
- コピー先の紙を捨てても、家そのものは変わらない
- ただし紙に“別の住所”を書き直したら、指す家が変わる
あわせて知っておきたいポイント
参照型は「同じオブジェクトを共有しがち」
特に List や Map など 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
Java のデータ型は、最初は抽象的に感じる部分ですが、 「値を持つのか」「住所を持つのか」 この2つを軸にすると一気に理解が進みます。
実務でもこの違いを意識しておくと、 「なぜか値が勝手に変わってる…」というバグを避けられます。 あなたの学びが、次の一歩につながりますように。

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

コメント