Javaプログラミングを学ぶ上で、避けては通れない非常に重要な要素が「演算子」です。

演算子は、変数や値に対して計算を行ったり、値を比較したり、論理的な条件を判断したりするために使用されます。

Javaには多種多様な演算子が用意されており、これらを正しく理解し使いこなすことは、効率的でバグのないプログラムを記述するための第一歩となります。

本記事では、Javaで利用可能な演算子の全種類から、演算の優先順位、そして実戦で役立つ使い方のポイントまで、初心者の方にも分かりやすく徹底的に解説します。

Javaの演算子とは

Javaにおける演算子(Operator)とは、特定の処理(計算や比較など)を指示するための記号のことです。

そして、その演算の対象となる値や変数のことを被演算子(オペランド)と呼びます。

例えば、a + b という式において、+ が演算子であり、ab が被演算子です。

Javaの演算子は、扱う被演算子の数によって「単項演算子(1つ)」「二項演算子(2つ)」「三項演算子(3つ)」に分類されることもあります。

これらを組み合わせることで、複雑なアルゴリズムやロジックを組み立てていくことになります。

算術演算子(基本的な計算)

算術演算子は、数値の足し算、引き算、掛け算、割り算など、数学的な計算を行うために使用されます。

最も頻繁に利用される演算子群です。

基本的な算術演算子の一覧

演算子意味
+加算(足し算)a + b
-減算(引き算)a - b
*乗算(掛け算)a * b
/除算(割り算)a / b
%剰余(割り算の余り)a % b

インクリメント・デクリメント演算子

変数の値を1増やしたり1減らしたりするための特殊な演算子です。

  • ++(インクリメント):値を1増やす
  • --(デクリメント):値を1減らす

これらには、記述する位置によって「前置」と「後置」の違いがあり、評価されるタイミングが異なるため注意が必要です。

Java
public class ArithmeticSample {
    public static void main(String[] args) {
        int a = 10;
        int b = 3;

        // 基本的な算術演算
        System.out.println("a + b = " + (a + b)); // 13
        System.out.println("a % b = " + (a % b)); // 1 (10 / 3 の余り)

        // インクリメントの比較
        int x = 5;
        System.out.println("後置: " + (x++)); // 5が出力された後に6になる
        System.out.println("現在のx: " + x);   // 6

        int y = 5;
        System.out.println("前置: " + (++y)); // 6になった後に出力される
    }
}
実行結果
a + b = 13
a % b = 1
後置: 5
現在のx: 6
前置: 6

代入演算子(値の格納)

代入演算子は、変数に値を格納するために使用されます。

単純な代入だけでなく、算術演算と組み合わせた「複合代入演算子」もよく使われます。

代入演算子の種類

  • =:右辺の値を左辺の変数に代入する
  • +=:左辺の値に右辺の値を足して代入(a = a + b と同義)
  • -=:左辺の値から右辺の値を引いて代入
  • *=:左辺の値に右辺の値を掛けて代入
  • /=:左辺の値を右辺の値で割って代入
  • %=:左辺の値を右辺の値で割った余りを代入

複合代入演算子を使用すると、コードを簡潔に記述できるだけでなく、左辺の評価が一度で済むというメリットがあります。

比較演算子(値の比較)

比較演算子は、2つの値を比較し、その結果をboolean型(true または false)で返します。

主に if 文や while 文などの条件分岐や繰り返し処理で使用されます。

演算子意味使用例
==等しいa == b
!=等しくないa != b
>より大きいa > b
<より小さいa < b
>=以上a >= b
<=以下a <= b

参照型の比較における注意点

Javaにおいて、== 演算子は「値そのもの」を比較します。

しかし、Stringなどの「参照型」の場合、==メモリ上のアドレス(参照先)が同じかどうかを比較してしまいます。

文字列の内容が同じかどうかを判定したい場合は、演算子ではなく equals() メソッドを使用するのが鉄則です。

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

System.out.println(s1 == s2);      // false (インスタンスが異なるため)
System.out.println(s1.equals(s2)); // true (文字列の内容が同じなため)

論理演算子(条件の組み合わせ)

論理演算子は、複数の条件を組み合わせたり、条件を反転させたりする場合に使用します。

  • &&(論理積 / AND):全ての条件が true の場合に true
  • ||(論理和 / OR):いずれかの条件が true の場合に true
  • !(論理否定 / NOT):true なら falsefalse なら true に反転

ショートサーキット(短絡評価)の仕組み

&&|| は「ショートサーキット」という特性を持っています。

例えば A && B において、Aが false であれば、Bの結果に関わらず全体は false になるため、Bの判定はスキップされます

同様に A || B において、Aが true であれば、Bの判定は行われません。

これは、Bの部分に重い処理やエラーの可能性がある処理(nullチェックなど)を記述する際に非常に重要な挙動です。

Java
String text = null;
// textがnullの場合、ショートサーキットにより右辺のlength()は実行されないため安全
if (text != null && text.length() > 0) {
    System.out.println("文字が入っています");
}

ビット演算子

ビット演算子は、数値を2進数(ビット列)として扱い、ビット単位で操作を行う演算子です。

主に低レイヤーの処理やフラグ管理、パフォーマンスが極めて重視される場面で使用されます。

  • &:ビット論理積(両方のビットが1なら1)
  • |:ビット論理和(どちらかのビットが1なら1)
  • ^:ビット排他的論理和(ビットが異なれば1)
  • ~:ビット反転(0を1に、1を0に)
  • <<:左シフト(ビットを左にずらす。2倍、4倍といった計算に相当)
  • >>:右シフト(符号を維持して右にずらす)
  • >>>:無符号右シフト(符号に関わらず空いたビットに0を詰める)

日常的な業務アプリケーション開発では使用頻度は高くありませんが、画像処理やプロトコル解析などでは必須の知識となります。

条件演算子(三項演算子)

Javaで唯一の三項演算子で、if-else 文を1行で簡潔に記述できるものです。

構文: 条件式 ? 式1 : 式2

条件式が true なら「式1」を返し、false なら「式2」を返します。

Java
int score = 85;
String result = (score >= 80) ? "合格" : "不合格";
System.out.println(result); // 合格

多用しすぎると可読性が下がるため、単純な値の切り替えなどに限定して使用するのが一般的です。

型比較演算子(instanceof)

instanceof は、オブジェクトが特定のクラスやインターフェースの型であるかどうかを判定するために使用されます。

Java
Object obj = "Hello";
if (obj instanceof String) {
    System.out.println("これは文字列です");
}

最近のJava(Java 16以降の標準仕様)では、「instanceof のパターンマッチング」が導入され、以下のように判定と同時にキャストを行うことが可能になりました。

Java
if (obj instanceof String s) {
    // ここですでにsはString型として扱える
    System.out.println(s.toUpperCase());
}

演算子の優先順位と結合規則

式の中に複数の演算子が含まれている場合、どの演算から実行するかは「優先順位」によって決まっています。

また、優先順位が同じ場合にどちらから計算するかを「結合規則」と呼びます。

演算子の優先順位一覧(高い順)

優先順位演算子の種類演算子結合規則
1括弧、配列、フィールド() [] .左から右
2単項演算子++ -- + - ! ~右から左
3乗除・剰余* / %左から右
4加減+ -左から右
5シフト<< >> >>>左から右
6比較< <= > >= instanceof左から右
7等価== !=左から右
8ビット論理積&左から右
9ビット排他的論理和^左から右
10ビット論理和|左から右
11論理積&&左から右
12論理和||左から右
13条件演算子?:右から左
14代入= += -= *= /= %= &= ^= |= <<= >>= >>>=右から左

基本的には数学のルール通り「掛け算・割り算は足し算・引き算より先」ですが、比較演算子や論理演算子が絡むと複雑になります

意図した順序で計算させたい場合や、可読性を高めたい場合は、積極的に () を使用してグループ化することが推奨されます。

実践で役立つ使い方のポイント

演算子を扱う上で、特に間違いやすいポイントや、Java特有の挙動について解説します。

1. 整数同士の割り算に注意

Javaでは、整数(int型など)同士で割り算を行うと、結果も整数になります。

小数点以下は切り捨てられるため注意してください。

Java
int a = 5;
int b = 2;
System.out.println(a / b); // 2.5ではなく2が出力される

// 小数点まで求めたい場合は、どちらかをdoubleにキャストする
System.out.println((double)a / b); // 2.5

2. 文字列結合における「+」演算子

+ 演算子は、数値の加算だけでなく、文字列の結合にも使用されます。

オペランドのどちらかが文字列であれば、もう一方も文字列に変換されて結合されます。

Java
System.out.println("合計: " + 10 + 20);   // "合計: 1020" になる
System.out.println("合計: " + (10 + 20)); // "合計: 30" になる

このように、結合順序によって結果が変わるため、計算部分には括弧をつける習慣をつけましょう。

3. 浮動小数点数の計算精度

floatdouble を使った演算では、誤差が生じることがあります。

これはコンピュータが数値を2進数で管理しているためです。

金融計算など、厳密な精度が求められる場面では、演算子ではなく BigDecimal クラスを使用する必要があります。

4. 論理演算子の使い分け

&| はビット演算子ですが、実は boolean 型に対しても使用可能です。

ただし、これらは「ショートサーキット」を行いません。

基本的には &&|| を使用し、特別な理由(両方の式を必ず評価したい場合など)があるときのみ単一の記号を使用します。

まとめ

Javaの演算子は、単純な計算から複雑な条件分岐まで、プログラムのあらゆる場所に登場する基本要素です。

今回紹介した算術演算子、代入演算子、比較演算子、論理演算子の4グループは、日常的な開発で最も頻繁に利用されます。

特に以下の3点は、バグを防ぐために常に意識しておきましょう。

  1. 優先順位に迷ったら括弧 () を使う
  2. 文字列の比較には == ではなく equals() を使う
  3. 論理演算子ではショートサーキットの挙動を理解する

演算子を正しく理解することで、ソースコードはより短く、読みやすく、そして正確なものになります。

まずは基本となる算術演算と比較演算から使いこなし、徐々にビット演算やパターンマッチングなどの高度な機能へとステップアップしていきましょう。