はじめに
+= や *= といった複合代入演算子は、
「書き方が短くなる便利なやつ」というイメージが強いですが、
実は 暗黙の型変換が絡むため、落とし穴が多い ところでもあります。
特に Java Bronze の試験でもよく問われるポイントで、
実務でも「なんでこの値になるの?」と混乱しがちな部分です。
この記事では、やさしく・実務寄りに
複合代入演算子の仕組みと注意点を整理していきます。
まずはコードを確認
byte a = 10;
a = (byte) (a + 5); // 通常の加算(キャストが必要)
a += 5; // 複合代入(キャスト不要)
int x = 10;
x += 1.5; // OK(暗黙の型変換)
System.out.println(x); // 11(小数点以下が切り捨てられる)
String s = "Hello";
s += 123; // 文字列結合になるコードのしくみを解説
複合代入演算子は「暗黙のキャスト」をしてくれる
通常の a = a + 5 は、計算結果が int になるため byte に戻すにはキャストが必要です。
byte a = 10;
a = (byte) (a + 5); // キャスト必須しかし a += 5 は OK。
a += 5; // 暗黙のキャストが入るJava が内部で
「計算 → 元の型に戻す」
という処理を自動でやってくれます。
ただし「値が壊れる」可能性は普通にある
byte a = 120;
a += 10; // オーバーフローして値が壊れる複合代入はキャストを省略できるだけで、
安全になるわけではありません。
実務でも「+= したら値が変になった」という相談はよくあります。
+= は「型を変える」ことがある
int x = 10;
x += 1.5;1.5 は double ですが、 x += 1.5 は double → int の暗黙キャスト が入ります。
結果:
x = 11(小数点以下が切り捨て)
通常の書き方だとエラーになります。
x = x + 1.5; // コンパイルエラー複合代入だけ特別扱いされるため、
「なんでこれ通るの?」と混乱しがちです。
String の += は「文字列結合」になる
String s = "Hello";
s += 123;これは
s = s + 123;
と同じ意味で、
文字列結合として扱われます。
実務ではログ出力やデバッグでよく使われる書き方です。
あわせて知っておきたいポイント
計算式の型は「大きい型に寄せられる」
byte a = 1;
byte b = 2;
byte c = (byte) (a + b); // a + b は int複合代入だけが特別扱いされる理由はここにあります。
+= は「キャストを省略できる」だけで安全ではない
short s = 30000;
s += 10000; // 値が壊れるキャストが省略されるだけで、
オーバーフローは普通に起きます。
実務では「意図しない型変換」がバグの原因になる
特に以下のケースは要注意:
- int に double を += して小数が消える
- byte / short のオーバーフロー
- String の += が大量にあるとパフォーマンス低下(StringBuilder 推奨)
使うときに気をつけたいこと
- 複合代入は暗黙のキャストが入ることを理解しておく
- キャストが省略されるだけで安全ではない
- byte / short の += は特に危険
- int += double は小数が消える
- String の += は便利だが多用すると遅い
実務では「+= は便利だけどクセがある」と覚えておくと安心です。
まとめ
複合代入演算子(+= など)
- 暗黙のキャストが入る
- 通常の
a = a + bと挙動が違う - オーバーフローは普通に起きる
- String の += は文字列結合になる
注意すべきポイント
- byte / short の計算は int になる
- int += double は小数が切り捨てられる
- パフォーマンス面では StringBuilder を検討

複合代入演算子は、短く書ける便利な記法ですが、 「暗黙のキャストが入る」という特徴を知っておくと 一気に理解が深まります。
Java Bronze の試験でも、実務でも、 ここを押さえておくと“型の罠”に強くなれます。
あなたの学びが、次のステップにつながりますように。

短く書けるけど、ちょっとクセがあるんだって。
+= の裏側で何が起きてるか、知ってると安心だよ。

コメント