プログラミングの学習で、Javaの演算子は誰もが通る道です。一見するとただの記号に見えるかもしれませんが、実はプログラムに具体的な計算や比較の指示を出すための重要な役割を持っています。
演算子を使いこなせると、コードがシンプルになり、プログラムが思い通りに動く実感を味わえます。
この記事では、Javaで使われる主要な演算子の種類と使い方を、豊富なサンプルコードと共に解説します。
この記事で学べること
- 基本的な計算を行う算術演算子の使い方
- 条件分岐で必須となる比較演算子・論理演算子の役割
- 計算の順番を決める演算子の優先順位
- コードを効率化する応用的な演算子の知識
Javaの演算子とは?
最初に、Javaにおける演算子の基本的な役割と、なぜ学習する必要があるのかを見ていきましょう。演算子はプログラミングの土台となる部分です。
- この記事で解説する演算子の種類
- Javaプログラミングと演算子の関係
この記事で解説する演算子の種類
この記事では、Javaプログラミングで頻繁に利用する以下の演算子を取り上げます。
分類 | 主な演算子 | 役割 |
---|---|---|
算術演算子 | +, -, *, /, % | 四則演算や余りの計算 |
代入演算子 | =, +=, -= | 変数に値を代入 |
比較演算子 | ==, !=, >, < | 2つの値を比較 |
論理演算子 | &&, ||, ! | 複数の条件を組み合わせる |
Javaプログラミングと演算子の関係
演算子を料理に例えるなら、それは食材(データ)を調理するための調理器具(包丁やフライパン)のようなものです。
例えば、「変数Aの値と変数Bの値を足して、結果を表示する」といった処理は、演算子なしには実現できません。プログラムに意図した動作をさせるため、演算子の正しい使い方を覚える必要があります。
まずは基本!四則演算に使うJavaの算術演算子
ここでは、プログラミングで最もよく使われる計算、つまり四則演算や数値の増減を行う「算術演算子」を解説します。
- 足し算・引き算・掛け算・割り算(+, -, *, /)
- 余りを求める(%)
- 1増やす・1減らす(++, --)
足し算・引き算・掛け算・割り算(+, -, *, /)
Javaの算術演算子は、数学の計算記号とほとんど同じように使えます。
`+` (足し算)、`-` (引き算)、`*` (掛け算)、`/` (割り算)が基本となります。
// 算術演算子の例 int a = 10; int b = 3; System.out.println(a + b); // 足し算 System.out.println(a - b); // 引き算 System.out.println(a * b); // 掛け算 System.out.println(a / b); // 割り算 (int型同士なので小数点以下は切り捨て)
実行結果
13 7 30 3
余りを求める(%)
`%`(パーセント)記号は、割り算の余りを求める剰余演算子です。
例えば、ある数値が偶数か奇数かを判定する際によく利用されます。数値を2で割った余りが0なら偶数、1なら奇数と判断できます。
int num1 = 10; int num2 = 11; // 2で割った余りを表示 System.out.println(num1 % 2); // 10は偶数なので余りは0 System.out.println(num2 % 2); // 11は奇数なので余りは1
実行結果
0 1
1増やす・1減らす(++, --)
変数の値を1だけ増やしたり減らしたりする処理は頻繁に発生します。その際に便利なのがインクリメント(`++`)とデクリメント(`--`)です。
変数の前に置くか(前置)、後ろに置くか(後置)で、値が評価されるタイミングが異なる点に注意が必要です。
// 後置インクリメントの例 int x = 5; System.out.println(x++); // xの値(5)が表示された後、xが6になる System.out.println(x); // xは6になっている // 前置インクリメントの例 int y = 5; System.out.println(++y); // yが6になった後、その値が表示される System.out.println(y); // yは6になっている
実行結果
5 6 6 6
変数に値を入れるJavaの代入演算子
計算結果や特定の値を、変数に格納するために使うのが「代入演算子」です。値を「代入する」という、プログラミングの基本操作を担います。
- 基本の代入演算子(=)
- 計算して代入する複合代入演算子(+=, -= など)
基本の代入演算子(=)
`=`(イコール)は、右辺の値を左辺の変数に代入するための演算子です。数学の「等しい」という意味ではない点に注意しましょう。プログラミングでは、右から左へ値を渡す動きをイメージすると分かりやすいです。
// 変数numberに100を代入する int number = 100; // 変数greetingに文字列を代入する String greeting = "こんにちは"; System.out.println(number); System.out.println(greeting);
実行結果
100 こんにちは
計算して代入する複合代入演算子(+=, -= など)
「変数自身の値を使って計算し、その結果を同じ変数に再代入する」という処理はよくあります。例えば `x = x + 10;` のようなコードです。
このような処理をより簡潔に書くために「複合代入演算子」が用意されています。
int score = 50; // score = score + 10; と同じ意味 score += 10; System.out.println(score);
実行結果
60
他にも様々な複合代入演算子があります。
演算子 | 例 | 同じ意味のコード |
---|---|---|
+= | a += b | a = a + b |
-= | a -= b | a = a - b |
*= | a *= b | a = a * b |
/= | a /= b | a = a / b |
%= | a %= b | a = a % b |
条件分岐の主役!2つの値を比べるJavaの比較演算子
プログラムが状況に応じて動作を変える「条件分岐」には、「比較演算子」が欠かせません。2つの値を比べて、その関係が正しいか(true)、間違っているか(false)を判定します。
- 等しいか・等しくないかを比べる(==, !=)
- 大きいか・小さいかを比べる(>, <, >=, <=)
等しいか・等しくないかを比べる(==, !=)
2つの値が等しいかを調べるには `==` (イコール2つ) を使います。代入の`=`(イコール1つ)と間違えやすい最重要ポイントです。
一方で、等しくないことを調べるには `!=` を用います。
int age = 20; System.out.println(age == 20); // ageは20と等しいので true System.out.println(age != 20); // ageは20と等しくないので false System.out.println(age == 18); // ageは18と等しくないので false
実行結果
true false false
大きいか・小さいかを比べる(>, <, >=, <=)
数値の大小関係を比較するには、数学でもおなじみの不等号記号を使います。
- `>` : 左辺が右辺より大きい
- `<` : 左辺が右辺より小さい
- `>=` : 左辺が右辺以上
- `<=` : 左辺が右辺以下
int myScore = 85; int borderScore = 80; // 合格かどうかを判定 System.out.println(myScore >= borderScore); // 85は80以上なので true
実行結果
true
複雑な条件を作るJavaの論理演算子
「AかつB」や「AまたはB」のように、複数の条件を組み合わせて、より複雑な判定を行いたい場合に「論理演算子」を使います。
- 「かつ」を表すAND(&&)
- 「または」を表すOR(||)
- 「ではない」を意味するNOT(!)
「かつ」を表すAND(&&)
`&&` は、左右の条件が両方ともtrueの場合にのみ、全体としてtrueを返します。一つでもfalseがあれば、結果はfalseです。
例えば、「年齢が20歳以上」かつ「性別が女性」のような条件指定に使えます。
int age = 25; boolean isMember = true; // 2つの条件が両方ともtrueか? System.out.println(age >= 20 && isMember);
実行結果
true
「または」を表すOR(||)
`||` は、左右の条件のうち、どちらか一方でもtrueであれば、全体としてtrueを返します。両方ともfalseのときだけfalseとなります。
例えば、「土曜日」または「日曜日」なら休日、といった判定に利用可能です。
String day = "Sunday"; // "Saturday" または "Sunday" か? System.out.println(day.equals("Saturday") || day.equals("Sunday"));
実行結果
true
「ではない」を意味するNOT(!)
`!` は、条件の結果を反転させます。trueをfalseに、falseをtrueに変える演算子です。
boolean isRaining = false; // 雨が降っていないか? (isRainingがfalseではないか?) System.out.println(!isRaining);
実行結果
true
コードがスッキリ!Javaの三項演算子
簡単なif-else文であれば、「三項演算子」を使うことで、より簡潔に1行で記述できます。
構文は `条件式 ? trueの場合の値 : falseの場合の値` となります。条件式の結果に応じて、`?` の後ろの値か `:` の後ろの値のどちらかが選ばれます。
// if-else文を使った書き方 int age = 18; String message; if (age >= 20) { message = "成人です"; } else { message = "未成年です"; } System.out.println(message); // 三項演算子を使った書き方 String message2 = (age >= 20) ? "成人です" : "未成年です"; System.out.println(message2);
実行結果
未成年です 未成年です
ただし、条件が複雑になると可読性が落ちるため、乱用は避けてシンプルな判定に使うのが良いでしょう。
Javaの演算子の優先順位を覚える7つのコツ
`10 + 5 * 2` という式があった場合、私たちは自然と掛け算を先に計算します。Javaのプログラムも同様に、演算子ごとに計算の優先順位が決まっています。このルールを知らないと、意図しない結果になることがあります。
- 演算子には計算される順番がある
- 優先順位が高い順グループで覚えよう
- 【一覧表】Javaの演算子の優先順位
- 括弧()を使えば優先順位は自由自在
演算子には計算される順番がある
演算子の優先順位とは、1つの式に複数の演算子がある場合に、どれから計算を行うかというルールのことです。
例えば、`x > 5 && y < 10` という式では、`>` と `<` の比較演算が `&&` の論理演算より先に行われます。
優先順位が高い順グループで覚えよう
全ての順位を暗記するのは大変です。まずは、大まかなグループで覚えるのが効率的です。
[高] ↓ 1. 単項演算子(++, --, !) ↓ 2. 算術演算子(*, /, % → +, -) ↓ 3. 比較演算子(>, < → ==, !=) ↓ 4. 論理演算子(&& → ||) ↓ 5. 代入演算子(=, += など) [低]
基本的には、計算してから比較し、その結果を論理的に組み合わせて、最後に代入する、という流れになっています。
【一覧表】Javaの演算子の優先順位
より詳細な優先順位は以下の表の通りです。上にあるものほど優先順位が高くなります。
優先度 | 種類 | 演算子 |
---|---|---|
高 | 単項 | ++ , -- , ! |
↑ | 乗除 | * , / , % |
| | 加減 | + , - |
| | 比較 | > , < , >= , <= |
| | 等価 | == , != |
| | 論理積 | && |
↓ | 論理和 | || |
低 | 代入 | = , += , -= , etc. |
正確な情報は、Javaの公式ドキュメントで確認できます。
参照 > The Java™ Tutorials - Operators
括弧()を使えば優先順位は自由自在
優先順位で迷ったり、意図した通りに計算させたい場合は、迷わず括弧 `()` を使いましょう。
括弧で囲まれた式は、他のどの演算子よりも優先して計算されます。これにより、計算の順序が明確になり、コードを読む人にとっても意図が伝わりやすくなります。
// 括弧なしの場合、5 * 2 が先に計算される int result1 = 10 + 5 * 2; // 10 + 10 = 20 System.out.println(result1); // 括弧ありの場合、括弧内が先に計算される int result2 = (10 + 5) * 2; // 15 * 2 = 30 System.out.println(result2);
実行結果
20 30
一歩進んだ使い方!Javaのビット演算子とシフト演算子
ここからは、少し応用的な内容を扱います。通常のアプリケーション開発で頻繁に使うものではないため、初心者のうちは「こんなものがあるんだ」という程度に読み進めても問題ありません。
ビット演算は、コンピュータがデータを扱う最小単位である「ビット」(0か1)を直接操作する手法です。主に処理速度が求められる場面や、ハードウェアに近い低レベルな制御で活躍します。
ビット論理演算子とは?
2つの数値を2進数で表現し、各桁(ビット)ごとに論理的な計算を行う演算子です。
AND演算子 (&)
2つのビットを比較し、両方が1の場合のみ結果が1になります。それ以外は0です。
特定のフラグ(状態)が立っているかを確認する「マスク処理」などによく使われます。
// 5 (2進数: 0101) と 3 (2進数: 0011) の AND 演算 int a = 5; // 0101 int b = 3; // 0011 // ---- int result = a & b; // 0001 System.out.println(result);
実行結果
1
OR演算子 (|)
2つのビットを比較し、どちらか一方でも1であれば結果が1になります。両方0の場合のみ0です。
特定のフラグを追加(オンに)する際によく利用されます。
// 5 (2進数: 0101) と 3 (2進数: 0011) の OR 演算 int a = 5; // 0101 int b = 3; // 0011 // ---- int result = a | b; // 0111 System.out.println(result);
実行結果
7
XOR演算子 (^)
2つのビットを比較し、値が異なっている場合に結果が1になります。同じ場合は0です。
値の入れ替えや、簡易的な暗号化、特定フラグの反転(トグル)処理などに使われます。
// 5 (2進数: 0101) と 3 (2進数: 0011) の XOR 演算 int a = 5; // 0101 int b = 3; // 0011 // ---- int result = a ^ b; // 0110 System.out.println(result);
実行結果
6
NOT演算子 (~)
すべてのビットを反転させます。0は1に、1は0に変わります。
Javaの内部的な数値表現(2の補数)のため、単純に符号が変わるわけではない点に注意が必要です。
// 5 (2進数: ...00000101) の NOT 演算 int a = 5; // 結果は (...11111010) となり、10進数では -6 となる int result = ~a; System.out.println(result);
実行結果
-6
シフト演算子とは?
数値の2進数表現を、指定したビット数だけ左または右にずらす(シフトする)演算子です。非常に高速な乗算や除算として機能します。
左シフト演算子 (<<)
ビット列を指定した数だけ左にずらし、右端の空いたビットを0で埋めます。
1ビット左にシフトすると、値は2倍になります。
// 5 (2進数: 0101) を 2ビット左にシフト int num = 5; int result = num << 2; // 010100 となり、10進数で 20 System.out.println(result); // 結果は 5 * (2^2) = 20
実行結果
20
右シフト演算子 (>>)
ビット列を指定した数だけ右にずらします。
このとき、左端の空いたビットは元の数値の符号(正なら0、負なら1)で埋められます(符号付き右シフト)。1ビット右にシフトすると、値は1/2になります(小数点以下切り捨て)。
// 20 (2進数: 10100) を 2ビット右にシフト int num = 20; int result = num >> 2; // 101 となり、10進数で 5 System.out.println(result); // 結果は 20 / (2^2) = 5
実行結果
5
符号なし右シフト演算子 (>>>)
ビット列を右にずらす点は `>>` と同じですが、左端の空いたビットを符号に関係なく常に0で埋めます。
そのため、負の数をこの演算子でシフトすると、結果が正の数に変わることがあります。
// -20 を2ビット右にシフトする場合の比較 int num = -20; // 符号付き右シフト (>>) // 符号ビット(1)が維持される System.out.println(num >> 2); // 符号なし右シフト (>>>) // 左端が0で埋められるため、巨大な正の数になる System.out.println(num >>> 2);
実行結果
-5 1073741819
このように、ビット演算やシフト演算は、コンピュータの内部動作を意識した効率的なコードを書く際に強力な武器となります。
まとめ
この記事では、Javaで使われる基本的な演算子から、優先順位、応用的な使い方までを解説しました。
演算子は、一つひとつは単純な記号ですが、これらを組み合わせることで、複雑な処理を実現できます。まさにプログラミングの語彙力を高める重要な要素です。
最初は難しく感じるかもしれませんが、たくさんのコードを書き、試行錯誤を繰り返すうちに、自然と身についていきます。演算子を使いこなし、プログラミングの楽しさをぜひ味わってください。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。