Java演算子の基礎!種類や使い方をわかりやすく解説

「演算子ってそもそも何?」
「Javaでは演算子をどう使うの?」

Javaで使える演算子はたくさんあるので、初心者の方には難しく感じてしまうでしょう。

このような悩みを解決するために本記事では、java 演算子の概要や使い方を解説しています。

こちらの記事を読めば、javaの演算子が分かり、Javaへの理解が深まっていくでしょう。

サンプルコードをもとに分かりやすく解説していますので、ぜひ最後までご覧ください。

Java演算子の基礎

演算子とは、与えられた変数やリテラル(数値や文字列を直接記述した定数)に対して演算を行うための記号です。

演算子によって処理される対象のことを被演算子といいます。

演算子はオペレータ、被演算子はオペランドと言い換えることも可能です。

オペランドの概要

オペランドとは式を構成する要素のうち、演算子じゃない方の要素です。

例えば、「1 + 2」という式があったとします。

こちらの式は「1」「+」「2」に分けることが可能です。

「+」を演算子(オペレータ)、「1」と「2」を被演算子(オペランド)と分類します。

つまり、式に登場する数値や文字列、変数がオペランドです。

演算子の種類

一般的な演算子として、加算が「+」減算が「-」乗算が「*」除算が「/」などの算術演算子がイメージしやすいでしょう。

算術演算子以外にも、比較演算子や論理演算子、ビット演算子、代入演算子などもあり、すべて演算子の1種です。

代表的な演算子を表にまとめます。

演算子 記号
算術演算子 +、-、*、/、%
インクリメント・デクリメント演算子 ++、–
比較演算子 >, >=, <, <=, ==, !=
論理演算子 &&、||
代入演算子 =, +=, -=, *=, /=, %=
ビット演算子 &, |, ^, !,
シフト演算子 <<, >>

演算子の使用法

演算子は、オペランドに対して、決められた処理をする記号です。

比較演算子や論理演算子は、条件分岐やループといった制御構文でよく使用されます。

他の演算子はおもに、変数の値を変更させる用途で使用されることが多いです。

演算子の優先順位

Javaの演算子には、優先順位が決められています。

例えば「+」や「-」よりも、「*」や「/」の方が高い優先順位なので、先に計算される仕組みです。

演算子の優先順位の表を下記にまとめました。

優先順位 記号
1 ++, —
2 !, ++, —
3 *, /, %
4 +, –
5 <<, >>
6 >, >=, <, <=, instanceof
7 ==, !=
8 &
9 ^
10 |
11 &&
12 ||

例えば下記のようなサンプルコードがあったとします。

ーーーーー
int n1 = 0;
n1 = 4 + 10 * 5;
System.out.println(n1);
ーーーーー

上記のサンプルコードの場合、出力結果は「54」です。

「10 * 5」の乗算が行われた後に4を加算し、最後に、合計値をn1に代入しています。

また「=」の演算子は優先順位が一番低いので、右側の演算がすべて行われた後、左辺の変数へ代入が行われるのは最後です。

演算子の結合規則

優先順位が同じだった場合に、どの演算子から演算をするのかを定めたものが結合規則です。

「+」や「-」など、優先順位が同じ演算子の場合どうなるでしょうか。

ーーーーー
int n1 = 0;
n1 = 40 + 10 - 5;
System.out.println(n1);
ーーーーー

上記のサンプルコードの出力結果は「45」です。

同じ優先順位の演算子の場合、左の演算子から計算が始まります。

そのため、「40 + 10」が先に計算されて「50」となり、「50 – 5」が計算されて結果は「45」です。

Javaの算術演算子

四則演算をはじめ、主に数学的な演算を行う演算子が算術演算子です。

算数の範疇なので理解できる人も多いでしょう。

ここでは、算術演算子についてポイントをいくつかご紹介します。

基本算術演算の計算例

算術計算の主な使い方は下記のとおりです。

算術演算子 概要 計算例
+ 加算 20 + 10 → 30
減算 20 – 10 → 10
* 乗算 10 * 2 → 20
/ 除算 10 / 2 → 5
% 剰余 10 % 3 → 1
++ インクリメント int x = 10; x++;→ 11
デクリメント int x = 10; x–;→ 9

インクリメント・デクリメント演算子の詳細

インクリメント演算子(++)は、オペランドに対して1を加算するための演算子です。

インクリメント演算子は、「++i」と「i++」と記述できます。

「i++」は代入した後にインクリメントし、「++i」はインクリメントした後に代入します。

サンプルコードを見てみましょう。

ーーーーー
int i = 1;
int j = i++;
System.out.println("jは" + j);   // 結果:jは1(iは2)
int a = 1;
int b = ++a;
System.out.println("bは" + b);   // 結果:bは2(aは2)
ーーーーー

このように「++i」と「i++」は、オペランドに対して1を加算するという点は同じです。

しかし、加算するタイミングが異なるので、最終的に出力する結果が異なります。

デクリメント演算子(–)は、オペランドに対して1を加算するための演算子です。

使い方は、インクリメント演算子と同じように使用できます。

文字列の連結・演算

「+」演算子は、数値型の加算に使われてます。

しかし、数値型の加算だけではなく、文字列型同士の連結にも使用することが可能です。

例えば「String str = “Hello, ” + “World!”;」といった場合、変数strの出力結果は「Hello, World!」となります。

文字列”Hello, “と”World!”が連結されるためです。

このように、文字列型データの連結にも「+」演算子は利用できます。

Javaの代入演算子

右辺で指定した変数などを、右辺で指定した変数に代入するのがJavaの代入演算子の役割です。

算術演算やビット演算と組み合わせた複合代入演算子もあります。

下記にJavaで使える代入演算子を一覧にまとめました。

代入演算子 概要 計算例
= 右辺の値を左辺に代入 a = 10
+= 左辺と右辺を加算した結果を左辺に代入 a = 10; a += 20 → aは30
(a = a + 20 と同じ意味)
-= 左辺から右辺を減算した結果を左辺に代入 a = 20; a -= 5 → aは15
(a = a – 5 と同じ意味)
*= 左辺と右辺を乗算した結果を左辺に代入 a = 10; a *= 5 → aは50
(a = a * 5 と同じ意味)
/= 左辺から右辺を除算した結果を左辺に代入 a = 20; a /= 5 → aは4
(a = a / 5 と同じ意味)
%= 左辺から右辺を除算した余りを左辺に代入 a = 10; a %= 6 → aは1
(a = a % 5 と同じ意味)
&= 右辺の値で論理積演算した結果を左辺に代入 a = 10; a &= 6 → aは2
|= 右辺の値で論理和演算した結果を左辺に代入 a = 10; a |= 6 → aは14
^= 右辺の値で排他的論理和演算した結果を左辺に代入 a = 10; a ^= 6 → aは12
<<= 右辺の値だけ左シフトした(ビット演算)結果を左辺に代入 a = 10; a <<= 2 → aは40
>>= 右辺の値だけ符号なし右シフトした(ビット演算)結果を左辺に代入 a = 10; a >>=2 → aは2)

基本代入の方法

基本型は値そのものを変数に格納します。

基本型の代入は値をそのままコピーするだけなので直観的です。

ーーーーー
int x = 1;
int y = x;
y++;
System.out.println(x);  // 結果:1
System.out.println(y);  // 結果:2
ーーーーー

代入された側(変数y)の値を変更したとしても、代入元(変数x)に影響することはありません。

複合代入演算子

複合代入演算子とは、「+」や「-」などの演算子と代入演算子を組み合わせた演算子です。

「+=」や「-=」などは複合代入演算子となります。

代表的な複合代入演算子は下記のとおりです。

  • +=:a+=b(aにbを加えた値をaに代入)
  • -=:a-=b(aからbを引いた値をaに代入)
  • *=:a*=b(aにbを乗じた値をaに代入)
  • /=:a/=b(aをbで割った値をaに代入)
  • %=:a%=b(aをbで割った余りをaに代入)

Javaにおける論理演算

Javaでの論理演算では、複数の条件式に対して論理演算を行い、結果をtrueかfalseで返します。

比較演算子と条件判定

Javaの比較演算子では、左辺と右辺の値を比較し、結果をtrueかfalseで返します。

演算子 概要
== 左辺と右辺が等しければtrue
!= 左辺と右辺が異なればtrue
< 左辺が右辺より小さければtrue
<= 左辺が右辺以下ならtrue
> 左辺が右辺より大きければtrue
>= 左辺が右辺以上ならtrue
?: 三項演算子

比較演算子は、主に条件分岐などの制御構文での条件式の評価に用いられます。

ーーーーー
int a = 10;
int a1 = 10;
int b = 5;

if (a == b){System.out.println(“aとbは等しい”);}
if (a == a1){System.out.println(“aとa1は等しい”);}
if (a != b){System.out.println(“aとbは等しくない”);}
ーーーーー

上記のサンプルコードの場合、ifの条件式「a == a1」がtrueなので「aとa1は等しい」が出力され、同様に「a != b」もtrueなので「aとbは等しくない」が出力されます。

論理演算子と式の評価

論理演算子とは、複数の条件式に対して論理演算を行い、結果をtrueかfalseで返す演算子です。

演算子 概要
&& 左辺と右辺がともにtrueの場合にtrue (論理積)
|| 左辺と右辺のどちらかがtrueの場合にtrue (論理和)
! 式がfalseの場合はtrue、trueの場合はfalse (否定)
^ 左辺と右辺のどちらかがtrueかつ、ともにtrueでない場合にtrue(排他的論理和)

下記のサンプルコードを見てみましょう。

ーーーーー
int a = 10;
int b = 5;

if (a < 20 && b < 10){System.out.println(“True”);} //Trueと出力
if (a < 10 || b < 10){System.out.println(“True”);} //Trueと出力
if (!(a == 10)){System.out.println(“True”);} //何も出力しない
ーーーーー

「a < 20 && b < 10」は論理積で、左辺と右辺の条件式がともにtrueなので、ifの制御式の評価はtrueとなります。

「a < 10 || b < 10」は論理和で、左辺がfalseで右辺がtrueなので全体はtureとなり、ifの制御式の評価はtrueです。

「!」は、直後の条件式に対する否定を表します。

つまり条件式「a == 10」がtrueを返すので「if (!(a == 10))」の評価はfalseです。

Javaにおける特殊演算子の利用例

Javaの特殊な演算子である、条件演算子(三項演算子)、ビット演算子とシフト演算子について紹介します。

条件演算子(三項演算子)の使い方

条件演算子は3つの値を必要とする演算子で三項演算子とも呼ばれます。

演算子の書き方は「条件式 ? 式1 : 式2」です。

条件式の真偽に応じて2つの値を返し、あたかも if 文のような処理ができます。

ーーーーー
int score = 76;
String result = score > 70 ? "OK" : "NG";
System.out.println(result);   // OK
ーーーーー

上記のサンプルコードの場合、変数 score の値が 70 よりも大きい場合には “OK” を、そうでない場合には “NG” を式全体として返します。

条件演算子は if 文を用いることで同じような処理の記述が可能です。

ーーーーー
int score = 76;
String result;
if (score > 70){
  result = "OK";
}else{
  result = "NG";
}
System.out.println(result);   // OK
ーーーーー

簡単な条件分岐なら条件演算子を使ったやり方のほうがシンプルに書けます。

ビット演算子とシフト演算子

ビット演算子はビット単位の演算を行うための演算子です。

整数を2進数で表した時、それぞれの桁を論理演算し、その結果を返します。

「1010」と「0110」を比較対象とした場合を考えましょう。

例えば、論理積では同じ「1」が設定されている桁以外には「0」が設定されるため、結果は「0010(10進数:2)」です。

「1010(10進数:10)」と「0110(10進数:6)」を例にあげた、主なビット演算子を表にまとめました。

演算子 概要
& 論理積 10 & 6 → 2
| 論理和 10 | 6 → 14
^ 排他的論理和 10 ^ 6 → 12
~ 否定 ~10 → -5
<< 左シフト 10 << 2 → 40
(10を左へ2ビットシフト)
>> 符号ありの右シフト 10 >> 2 → 2
(10を符号ありの右へ2ビットシフト)
>>> 符号なしの右シフト
(左端は0埋め)
10 >> 2 → 2
(10を符号なしの右へ2ビットシフト)

Javaにおける演算子オーバーロードの代替手段

演算子オーバーロードとは、関数のオーバーロードのように、演算子を拡張することです。

関数のオーバーロードとは、同じクラスの中でメソッド名と戻り値の型が同じで、引数の型や数、並び順が違うメソッドを2つ以上定義することをいいます。

しかし、Javaには演算子のオーバーロードの機能は実装されていません。

力技でコードを書けば、あるいは近い実装ができるかもしれませんが、機能としては無いのでJavaでは演算子オーバーロードは使えないと覚えておきましょう。

Javaプログラミングのスキルを活かして収入を増やすなら

なかには、副業での収入獲得やフリーランスへの独立を目的にJavaプログラミングのスキル習得に励んでいる人もいますよね。

ただ、身につけたスキルをどう収入UPに繋げればいいのか、イメージが湧かない人もいるはず。

そんな方は、ぜひフリーランスのミカタをご活用ください。

出典:フリーランスのミカタ

フリーランスのミカタは、平均単価80万円以上の案件を取り揃える、ITエンジニアに特化したフリーランスエージェントです。具体的には、次のような週3回からフルリモートで請け負える案件を豊富に掲載しています。

また希望年収や稼働時間だけでなく、扱うプログラミング言語などを細かく指定して案件を探せるため、自分にあう仕事を見つけやすいサイト仕様になっています。

ただし、上記のような案件は条件として2〜3年の実務経験が求められるケースが多いです。そのため、応募する際はどれくらいの経験が必要なのかを前もってチェックしておきましょう。

フリーランスのミカタを活用すれば、中・長期的な安定収入が得られる案件が見つかりますよ。

どんな案件が掲載されているか気になる人は、下のボタンから自分にあう案件を探してみてください。

まとめ

ここまでで、Javaの演算子について説明してきました。

演算子はif文などの制御構文で頻繁に出てくるものです。

Javaのプログラミングにおいて避けては通れません。

本記事で紹介したJavaの演算子について、この機会にぜひ覚えておきましょう。