Java演算子とは?種類と使い方を図解でわかりやすく解説

この記事では、Javaの演算子の種類・使い方・よくある落とし穴まで体系的に解説します。

Zettoのライタープロフィール

演算子を曖昧なまま学習を進めると、==equals() の使い分けを間違えたり、整数除算の落とし穴にハマったりと、バグの原因が特定できずに時間を浪費しやすいです。

この記事を読めば、Javaの演算子の種類・正しい使い方・初心者がハマる落とし穴まで、把握できます。

ぜひ参考にしてみてください。

目次

Java演算子とは?役割と種類を把握しよう

Java演算子の種類

Javaの演算子について、まず役割と種類の全体像を解説します。

  • 演算子がプログラムで果たす役割
  • Javaで使う演算子の種類と分類一覧

ひとつずつ見ていきましょう。

演算子とは

演算子とは、値に対して「処理」を指示する記号のことです。

たとえば a + b と書いたとき、+ がその演算子です。演算子があるから、Javaは「aとbを足す」という処理を実行できます。

プログラムの中で演算子が担う役割は大きく3つあります。

  • 計算:数値の足し引き・掛け算・割り算・余りを求める
  • 比較:2つの値が等しいか、大きいか小さいかを調べる
  • 判断:複数の条件を組み合わせてtrue/falseを返す

この3つがあって初めて、「〇〇という条件なら処理Aを実行する」という分岐処理が書けます。演算子はif文・while文といった制御構造と切っても切れない関係にあります。

Javaで使う演算子の種類一覧

Javaの演算子は、役割ごとにグループ分けされています。

主要な演算子の種類は以下の通りです。

種類記号の例役割
算術演算子+・-・*・/・%四則演算と余りの計算
代入演算子=・+=・-=・*=・/=変数への代入と同時計算
比較演算子==・!=・<・>・<=・>=2つの値を比べてtrue/falseを返す
論理演算子&&・||・!条件を組み合わせる
インクリメント/デクリメント++・–1加算・1減算
ビット演算子&・|・^・~ビット単位の演算
シフト演算子<<・>>・>>>ビットを左右にずらす
三項演算子?:条件式を1行で書く
Zetto

演算子の種類は多く見えますが、日常的によく使うのは算術・代入・比較・論理の4種類です。まずここを固めれば、あとは実践で自然に身につきますよ。

Java基本演算子の使い方【算術・代入・比較・論理】

基本演算子の使い方

Javaで最もよく使う4種類の演算子の使い方を解説します。

  • 算術演算子(+・-・*・/・%)の基本と注意点
  • 代入演算子(=・+=・-=・*=・/=)の使い方
  • 比較演算子(==・!=・<・>・<=・>=)の読み方と使い方
  • 論理演算子(&&・||・!)と短絡評価の仕組み

順番に見ていきましょう。

算術演算子(+・-・*・/・%)の基本と注意点

算術演算子は、数値の計算を行う演算子です。

5種類あり、使い方はシンプルです。

int a = 10;
int b = 3;

System.out.println(a + b); // 13(足し算)
System.out.println(a - b); // 7(引き算)
System.out.println(a * b); // 30(掛け算)
System.out.println(a / b); // 3(割り算)
System.out.println(a % b); // 1(余り)

%(パーセント記号)は「剰余演算子(じょうよえんざんし)」と呼ばれ、割り算の余りを返します。「10 ÷ 3 = 3 余り 1」なので、10 % 31 です。

この演算子は実務でもよく使います。「偶数か奇数かを判定する」「3の倍数かどうかを確認する」など、if文と組み合わせる場面が多いです。

整数同士の割り算で小数が出ない理由

算術演算子の中で、特に注意が必要なのが /(割り算)です。

Javaでは、整数型(int型)同士の割り算をすると、小数部分が切り捨てられます。

int a = 7;
int b = 2;
System.out.println(a / b);        // 3(3.5ではなく3になる)
System.out.println((double) a / b); // 3.5(キャストで解決)

「7 ÷ 2 = 3.5」のはずが、3 が返ってきます。これはint型同士の計算結果がint型になるというJavaの仕様です。

僕自身、実務案件でこの仕様を知らずに計算結果がズレてしまい、テストで引っかかったことがあります。小数が必要な場合は、型キャスト(かたきゃすと:データ型を変換する操作)で (double) を付けることで解決できます。

代入演算子(=・+=・-=・*=・/=)の使い方

代入演算子は、変数に値を入れる(代入する)ための演算子です。

= が基本ですが、+=-= などの「複合代入演算子」を使うとコードを短く書けます。

int x = 10;

x += 5;  // x = x + 5 と同じ → x は 15
x -= 3;  // x = x - 3 と同じ → x は 12
x *= 2;  // x = x * 2 と同じ → x は 24
x /= 4;  // x = x / 4 と同じ → x は 6
x %= 4;  // x = x % 4 と同じ → x は 2

x += 5 は「xの現在の値に5を足して、xに代入する」という意味です。繰り返し処理(ループ)の中でカウンタを増やしたり、合計値を積み上げたりする場面で頻繁に使います。

比較演算子(==・!=・<・>・<=・>=)の読み方と使い方

比較演算子は、2つの値を比べてtrue(真)またはfalse(偽)を返す演算子です。

if文やwhile文の条件として毎回登場します。

int a = 5;
int b = 10;

System.out.println(a == b);  // false(aとbは等しいか?)
System.out.println(a != b);  // true(aとbは等しくないか?)
System.out.println(a < b);   // true(aはbより小さいか?)
System.out.println(a > b);   // false(aはbより大きいか?)
System.out.println(a <= b);  // true(aはb以下か?)
System.out.println(a >= b);  // false(aはb以上か?)

注意点として、等しいかどうかの比較は = ではなく == を使います。= は代入、== は比較という使い分けを間違えると、コンパイルエラーや意図しない動作の原因になります。

論理演算子(&&・||・!)と短絡評価の仕組み

論理演算子は、複数の条件を組み合わせる演算子です。

主に3種類あります。

boolean isAdult = true;
boolean hasTicket = false;

System.out.println(isAdult && hasTicket); // false(AND:両方trueでないとfalse)
System.out.println(isAdult || hasTicket); // true(OR:片方でもtrueならtrue)
System.out.println(!isAdult);             // false(NOT:反転する)

&&(アンド)は「かつ」、||(オア)は「または」、!(エクスクラメーション)は「ではない」という意味です。

論理演算子には短絡評価(たんらくひょうか)という重要な動作があります。

&& の場合:左側がfalseなら右側は評価しない。|| の場合:左側がtrueなら右側は評価しない。

たとえばこんなコードです。

String s = null;
if (s != null && s.equals("Java")) {
    System.out.println("Javaです");
}

s != null がfalseの時点で、&& の右側の s.equals("Java") は実行されません。もし短絡評価がなければ、nullに対して equals() を呼び出してしまい、NullPointerException(ぬるぽいんたーえくせぷしょん:nullのオブジェクトを操作しようとしたときに起きるエラー)が発生します。

短絡評価は実務でも活用する重要な仕組みなので、ここで押さえておきましょう。僕自身も実務ではよく使っています。

Zetto

算術・代入・比較・論理の4つは、Javaを書く上で毎回登場します。特に論理演算子の短絡評価は試験でも実務でも問われるポイントなので、しっかり理解しておくと後々楽になりますよ。

インクリメント・デクリメントと演算子の優先順位

優先順位と増減演算子

少し踏み込んだ演算子の知識をお伝えします。

  • 前置(++i)と後置(i++)の動作の違い
  • 演算子の優先順位と括弧を使った安全な書き方
  • ビット演算子・シフト演算子の役割と実務での使い所

一つずつ解説していきますね。

前置(++i)と後置(i++)の動作の違い

インクリメント演算子 ++ は変数を1増やす、デクリメント演算子 -- は変数を1減らす演算子です。

記号を変数の前に書くか後ろに書くかで動作が変わります。

// 前置インクリメント
int i = 5;
System.out.println(++i); // 6(先に1加算して、その値を返す)

// 後置インクリメント
int j = 5;
System.out.println(j++); // 5(現在の値を返してから、1加算する)
System.out.println(j);   // 6(加算済みの値)

前置(++i)は「先に加算してから使う」、後置(i++)は「使ってから加算する」という動作の違いがあります。

単独で i++ だけ書くような場面では結果が同じですが、代入式や出力の中で使うと差が生まれます。

演算子の優先順位と括弧を使った安全な書き方

複数の演算子が混在するとき、どちらを先に計算するかは「優先順位」で決まります。

数学と同じで、掛け算・割り算は足し算・引き算より先に計算されます。

int result = 2 + 3 * 4; // 2 + 12 = 14(*が先に計算される)

Javaの演算子は大まかに以下の順で優先されます(上ほど優先度が高い)。

  • ++--!(単項演算子)
  • */%(乗除算)
  • +-(加減算)
  • <><=>=(比較)
  • ==!=(等値比較)
  • &&(論理AND)
  • ||(論理OR)
  • =+=(代入)

細かい順位をすべて暗記する必要はありません。優先順位に迷ったら、括弧 () を使って計算順序を明示するのが安全です。

int result1 = (2 + 3) * 4; // 20(括弧の中を先に計算)
int result2 = 2 + 3 * 4;   // 14(括弧なしは * が先)

実務でも複雑な条件式には括弧を使うのが一般的です。「優先順位に頼らず、括弧で意図を明示する」習慣が、コードの読みやすさ(可読性)を高めます。

ビット演算子・シフト演算子の役割と実務での使い所

ビット演算子(びっとえんざんし)は、2進数のビット単位で演算を行う演算子です。

主な種類は以下の通りです。

演算子名前動作
&AND両方のビットが1のとき1
|ORどちらかのビットが1のとき1
^XORどちらか一方だけが1のとき1
~NOTビットを反転する
<<左シフトビットを左にずらす(×2相当)
>>右シフトビットを右にずらす(÷2相当)
>>>符号なし右シフト符号ビットを考慮しない右シフト
int a = 0b1010; // 10
int b = 0b1100; // 12

System.out.println(a & b);  // 0b1000 = 8(AND)
System.out.println(a | b);  // 0b1110 = 14(OR)
System.out.println(a << 1); // 0b10100 = 20(左シフト:×2)
System.out.println(a >> 1); // 0b0101 = 5(右シフト:÷2)

業務アプリ開発でビット演算子を使う機会は多くありません。ただ、フラグ管理(複数のON/OFF状態をひとつの整数で管理する方法)やJavaのhashCode計算などで登場します。

フレームワークのソースコードを読むようになると目にする機会が増えるので、「こういう動作をする」という理解は持っておくと役立ちます。

インクリメント・優先順位・ビット演算子を押さえた今とで、演算子の知識がかなり充実してきたと思います。

Mirai

前置と後置でこんなに動作が違うとは思わなかった…!これは気をつけないとバグになりそう。

Zetto

慣れるまでは混乱しやすいポイントです。「迷ったら前置」か「単独で使う」を意識するだけで、バグをかなり減らせますよ。

初心者がハマるJava演算子の落とし穴

落とし穴と試験対策

演算子の落とし穴を解説します。

  • ==とequals()の違い|String比較で必ずハマる罠
  • 整数除算で小数が切り捨てられる落とし穴
  • 前置・後置インクリメントが引き起こすバグ事例

==とequals()の違い|String比較で必ずハマる罠

Javaで最も多くの初心者がつまずく落とし穴が、Stringの比較です。

== でStringを比較すると、思ったように動かないことがあります。

String s1 = new String("Java");
String s2 = new String("Java");

System.out.println(s1 == s2);      // false
System.out.println(s1.equals(s2)); // true

s1s2 も「Java」という同じ文字列を持っているのに、== での比較はfalseになります。

== は「値の中身」ではなく「オブジェクトの参照先(メモリのアドレス)」を比較しているためです。

new String() で作った2つのオブジェクトは別々のメモリ領域に存在するので、参照先が異なってfalseになります。

僕自身、実務に入りたての頃にユーザーのステータス文字列を == で比較していたせいで、条件分岐がまったく機能しないバグを出したことがあります。エラーも出ないので原因特定に時間がかかり、かなり反省しました。

文字列の中身を比べたいときは、必ず equals() メソッドを使います。

整数除算で小数が切り捨てられる落とし穴

算術演算子の章でも触れましたが、改めて整理します。

Javaでは整数型(int・long)同士の割り算は、必ず整数型の結果になります。

System.out.println(5 / 2);           // 2(小数は切り捨て)
System.out.println(5.0 / 2);         // 2.5(double型なので小数が出る)
System.out.println((double) 5 / 2);  // 2.5(キャストで解決)

試験では「この式の結果は何か」という形式で問われます。5 / 2 の答えが 2.5 ではなく 2 だと理解していないと正解できません。

前置・後置インクリメントが引き起こすバグ事例

実際のコードでバグになりやすいパターンを確認します。

// 後置インクリメントの場合
int a = 5;
int b = a++;  // bに5が代入され、その後aが6になる

System.out.println(a); // 6
System.out.println(b); // 5
// 前置インクリメントの場合
int c = 5;
int d = ++c;  // cが先に6になり、dに6が代入される

System.out.println(c); // 6
System.out.println(d); // 6

一見同じに見えますが、代入されるタイミングが異なるため結果が変わります。試験では int b = a++int d = ++c のどちらで代入したかを問う問題が出ます。

Javaの演算子の演習問題

演習問題

理解を深めるために、演習問題を3つ用意しました。

ぜひ手を動かしながら解いてみてください。

演習問題1

問題

以下のコードを実行したとき、出力される値をそれぞれ答えてください。

int a = 10;
int b = 3;
System.out.println(a / b);
System.out.println(a % b);

解答例

3
1

解説

a / b は整数型同士の割り算なので、「10 ÷ 3 = 3.33…」の小数部分が切り捨てられ 3 になります。a % b は余りを返すので、「10 ÷ 3 = 3 余り 1」の 1 が出力されます。

「Javaの整数除算は小数を切り捨てる」というルールを正確に理解できているかを確認する問題です。

演習問題2

問題

以下のコードの出力結果を答えてください。

int x = 5;
int y = x++;
System.out.println(x);
System.out.println(y);

解答例

6
5

解説

x++ は後置インクリメントなので、「現在の値(5)をyに代入してから、xを1増やす」という順番で動きます。そのため y = 5x = 6 となります。

もし y = ++x と前置にすると、先にxが6になってからyに代入されるため、両方 6 になります。前置・後置の違いを確実に押さえているか確認してみてください。

演習問題3

問題

以下のコードの出力結果を答えてください。

String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

解答例

false
true

解説

s1s2new String() でそれぞれ別のオブジェクトとして生成されています。== は参照先(メモリのアドレス)を比較するため、中身が同じでも参照先が異なる場合はfalseになります。

Zetto

equals() は中身の文字列を比較するため、「Hello」と「Hello」は同じなのでtrueになります。Stringの比較には必ず equals() を使う習慣をつけましょう。

Javaの演算子に関するよくある質問

よくある質問

よくある質問と回答をまとめました。

  • ==とequals()はどちらを使えばいいですか?
  • 演算子の優先順位はすべて暗記する必要がありますか?
  • ビット演算子は実務で使う機会がありますか?

Q. ==とequals()はどちらを使えばいいですか?

Stringの比較には equals() を使うのが基本です。

== はプリミティブ型(int・boolean・charなど、オブジェクトではない基本的な型)の比較と、同一オブジェクトかどうかの確認に使います。

文字列やその他のオブジェクト型の中身を比べるときは equals() を使ってください。

シンプルなルールとして覚えておくと便利です。

  • プリミティブ型(int・booleanなど)==
  • String・配列などのオブジェクト型equals()

Q. 演算子の優先順位はすべて暗記する必要がありますか?

すべて暗記する必要はありません。

基本的な優先順位(*/+- より先、など)を押さえたら、あとは括弧 () を積極的に使って明示するのが実務の流儀です。

複雑な式は括弧でわかりやすく書いた方が、コードの読みやすさも上がります。

Q. ビット演算子は実務で使う機会がありますか?

使う場面は限られますが、ないわけではありません。

実務でビット演算子が登場するのは、主に以下のケースです。

  • フラグ管理:複数のON/OFF状態をひとつの整数で管理したい場合
  • ハッシュ値の計算:JavaのhashCode実装などでよく使われる
  • パフォーマンス重視の低レイヤー処理:2進数レベルで速度を最適化したい場合

業務アプリ開発では日常的に出番があるわけではありませんが、フレームワークのソースコードを読む機会が増えると目にします。「こういう動作をする」という理解で十分です。

Java演算子をマスターして次のステップへ進もう

次のステップへ

この記事では、Javaの演算子の種類・使い方・落とし穴・試験対策までまとめて解説しました。

重要ポイントを振り返ります。

  • 算術演算子:整数同士の / は小数が切り捨てられる点に注意する
  • 代入演算子+= などの複合代入演算子でコードを短く書ける
  • 比較・論理演算子:if文の条件式で毎回使う。短絡評価の仕組みも重要
  • インクリメント:前置と後置で代入タイミングが異なる
  • ==とequals():Stringの比較は必ず equals() を使う

演算子はJavaの基礎の中の基礎です。ここを確実に理解しておくと、if文・for文・while文などの制御構造を学ぶ際にスムーズに進めます。

実際に手を動かして動作確認するのが、理解を深める一番の方法です。この記事のコード例をそのまま自分の環境で動かしてみてください。

Mirai

演算子ってこんなに種類があったんだね。特に ==equals() の違いはびっくりした!

Zetto

そこは本当によく引っかかるポイントですよ。慣れてくると「Stringはいつも equals()」って体が自然に覚えますよ!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次