Javaのbooleanは、条件分岐などを利用してさまざまな式の組み合わせができます。その際に、boolean型の記述やif文の使い方、論理演算子の利用など、押さえるべきポイントがいくつかあるのです。
そこで本記事は、booleanと論理演算子の基本を学び、基礎の使い方からそれらを応用した活用方法まで紹介します。
目次
1.Javaのbooleanとは
booleanとは、Javaプログラミングの「boolean型」として使われるデータ型のことです。ここでは、Javaにおけるbooleanの意味や型の規則について解説します。
booleanの意味や決まりごと
booleanは、カタカナで「ブーリアン」と読み、「真偽値」を意味します。日本語でboolean型のことを「論理型」や「真偽値型」と言い換えることもあります。
Javaの場合、真偽値は「true」や「false」の2つと決まっており、真なら「true」、偽なら「false」です。それ以外は値として扱えません。
本来、真偽値を指した「論理値リテラル」には、「true」「false」「UNKNOWN」の3つがあります。SQLでは「UNKNOWN」を返すこともありますが、Javaでは使用不可です。戻り値や出力結果に「null」や「UNKNOWN」は出ず、エラーが返ってきます。0や1も当然ながら使えません。
その上で、boolean型は「プリミティブ型」のみを扱います。プリミティブ型とは、int型のように直接、値を格納する型のことです。booleanでは、「true」か「false」だけを格納できます。
booleanに格納できる値
boolean型のシンプルな表現として、直接的に値を格納する場合は「flag」を変数にして、次のように書き表すことができます。
boolean flag1 = true;
boolean flag2 = false;
Javaの場合、上記の「true」と「false」以外の値は格納できないため、「boolean flag3 = 0」のように「0」の値を入れることはできません。もし、「true」か「false」以外の値を入れると実行時にコンパイルエラーが出ます。
ただし、変数にflagを使ったこの書き方は実務でおすすめできないため、上の例はあくまでも基礎の説明用と考えましょう。
Javaの「Booleanクラス」との違いは?
Booleanクラスでは、boolean型にはできないオブジェクトを扱えます。具体的には、booleanではオブジェクト型を扱えないため、ラッパークラスのbooleanでラップして扱う形です。
Booleanクラスなら、扱えないはずの「null」も扱うことができます。そのため、Booleanクラスではbooleanを型ではなく変数のオブジェクトとして扱えるのです。
2.論理演算子の基本
Javaのbooleanには、代表的な3つの論理演算子が使われます。複数の条件を同時に処理したいときに使われます。単純な1つの条件の場合は、使われることなく条件付けのソースコードが完成することもあります。
つまり、必要に応じて便利に使える演算子です。まずは以下の3つの論理演算子の基本を押さえましょう。
&&
「&&」は、「論理積」と呼ばれる演算子です。英語の「AND」に該当します。例えば、数学の集合で「AかつB(A ∩ B)」の両方を満たす場合に「真」となる条件をイメージすると理解しやすくなります。
「A && B」は、ABどちらも「true」であるならば、結果が「true」となることです。どちらか片方が「false」だと、条件未達成で「false」の値が返ります。
||
「||」は、「論理和」の演算子です。英語で「OR」のことを指します。数学の集合では「AまたはB(A ∪ B)」」でAかBどちらかが含んでいれば正しいというイメージです。「A || B」は、AかBのどちらかが「true」であるならば、結果が「true」となります。
例えば、AとBの結果がAは「true」でBは「false」だった場合に、「A || B」の結果は「true」です。ただし、プログラムが数学の集合と違う点は、Aが先に「true」と判定された場合、Bは判定することなく結果を返すことです。
!
「!」は、否定の論理演算子です。Javaではbooleanが出てこない式でもよく使われます。数学の集合で考えるなら、集合や要素の否定に当たります。
「!A」ならAの否定「Aではない」、「!B」ならBの否定「Bではない」です。booleanの場合、「true」は「false」に、「false」が「true」と逆になるだけです。そのため、booleanの論理否定演算子を扱うときだけは、扱いがシンプルで簡単です。
上記は、単純な否定(英語で「NOT」)の演算子として使う場合で、複雑なルールはありません。しかし、「&&」や「||」があって()で括る場合だけ、その否定の結果に気をつけることです。
例えば、「A && B」の否定を表す「!(「A && B」)」は、()を外すと「!A || !B」です。また、「A || B」の否定を表す「!(「A || B」)」は、()を外して「!A && !B」となります。記号が変わって、それぞれに否定「!」の演算子が付く形です。
プログラムは()を外さなくても正しく実行できます。しかし、人が理解する際は()を外すほうが意味の理解が簡単で、それが必要な場面も出てきます。
3.Javaでbooleanの変数名・メソッド名が重要な理由
変数名・メソッド名の重要性は以下のとおりです。
可読性が大事
booleanでは、「true」と「false」しか扱えないため、変数やメソッドのネーミングが重要です。なぜなら、値や参照先まで見ないと、何を判定しているかひと目で把握できないためです。これを開発などで重要となるソースコードの「可読性」と呼びます。
そこで、その変数やメソッドが何を示すものか、変数名だけで判別できるようにしておきます。デバッグの際に確認しやすく、保守でも管理が楽になります。特にチーム開発では重要です。命名規則などを統一することで全体の効率を上げることができます。
命名の例
例えば、2つの英単語を組み合わせて、2つ目を大文字にし、単語から意味を的確に示せる以下のような方法です。
「ユーザー名」なら「userName」
「更新すべきか」なら「shouldUpdate」
「稼働状況はどうか」なら「isActive」
「ユーザーが存在するか」なら「userExists」
「userName」を見て、「これはユーザー名が正しいか判定している型」と変数名からわかります。命名規則で動詞を前にするかどうかは、変数の意味や文法次第のため、あくまでもプロジェクトごとの決まりに留めることです。
このとき、命名した変数・メソッドがオブジェクト型のものはbooleanで使います。
4.Javaでbooleanの基本となる使い方
booleanでは、メソッドで値を出力したり、メソッドを呼び出して値を返したりすることができます。ここでは、Javaにおけるbooleanの基本の使い方やソースコード例を解説します。
booleanの変数に直接入れた値を出力
まずは、扱える値を確認する簡単な例として、booleanの変数に直接「true」と「false」の値を入れて、それを「System.out.println()」で出力する方法です。
public class Main { public static void main(String[] args) { boolean flag1 = true; boolean flag2 = false;
System.out.println(flag2); } } |
上のソースコード例では、boolean型を使って「true」と「false」が出力されます。その結果から、この2つの値を変数に入れられることが確認できます。
宣言、初期化してif文にする
次に、Javaで基本的な「宣言」と「初期化」をして、booleanでよく使われるif文を作成する方法です。
流れとしては、最初に「int」(整数の場合)などで宣言をして、その値を初期化します。その際、boolean型の変数名を決めます。
今回は、成年・未成年の判定なので、「checkAdult」です。次に、if文で18歳以上なら「成人」、それ未満なら「未成年」とわかる文を出力します。
public class Main { public static void main(String[] args) { int age = 20; //宣言 checkAdult(age); //メソッド呼び出し }
boolean isAdult = age >= 18;//booleanで成年・未成年の判定
System.out.println("あなたは成人"); } else { System.out.println("あなたは未成年."); } } } |
補足として、if文では「if (age >= 18)」とすることもできますが、この判定は再び使う可能性があることから、下記の例のようにboolean型の条件式を使います。if()内の条件が「true」なら1つ目の「if(){」直下の出力、「false」なら「else {}」直下を出力できます。
論理演算子を使ってifの条件を書く
if文で論理演算子の使い方の例も挙げておきます。下記は、成人年齢と飲酒年齢の判定です。18歳の成人年齢を判定すると同時に、お酒の飲める20歳の年齢基準を満たすかどうか調べています。
このとき、論理演算子の「&&」「!」を使用しています。最初のelse if条件で「&&」で18歳以上でも20歳未満の条件分岐を作っている形です。
次に、18歳未満(未成年)を判定するために、あえて論理演算子を使い「!(age >= 18)」としています。18歳以上の否定で、このelse ifの条件は「age < 18(=18歳未満)」のことです。
public class Main { public static void main(String[] args) { int age = 12;
System.out.println("あなたは" + age + "歳なのでビールが飲める成人です。"); } else if (age >= 18 && age < 20) { System.out.println("あなたは" + age + "歳で成人です。しかし、ビールは飲めません。"); } else if (!(age >= 18)) { System.out.println(age + "歳は未成年です。ビールは飲めません。"); }
} } |
Booleanクラスの利用
Booleanクラスでは、簡単な方法として「valueOf()」の利用が挙げられます。
public class Main { public static void main(String[] args) { Boolean isAdult = Boolean.valueOf(true); // 成人として「true」を設定 System.out.println("初期値は" + isAdult + "です");
System.out.println("nullの値です"); } else { System.out.println("現在の値は: " + isAdult); } } } |
コンストラクタで「new Boolean(true)」としても同じ結果が得られますが、Javaではコンストラクタが推奨されていないため、例のように「valueOf(true)」で書きます。
その際、nullチェックを入れてエラーを回避します。年齢の成人判定の場合、さらに応用してif文に定義した年齢が18歳以上かを判定することを加えるのも可能です。
関連記事
Java初心者ガイド|Java学習のロードマップと効率良い勉強方法を解説
5.Javaでbooleanとif文を応用した活用方法
基本を踏まえて、booleanを活用できる方法としてif文を応用した使い方を紹介します。
ループ制御の処理に活用する
ループ制御では、「Scanner」がデータ入力に使われます。「Scanner」とは、クラスの名称で「java.util パッケージ」に含まれるものです。「Scanner」を上手く使えば、特定の数字をユーザーが入力(完了)するまでループを続けるなど「keepRunning」のフラグ管理による処理が活用できます。
import java.util.Scanner;
class Main { public static void main(String[] args) { keepRunningScanner(); }
Scanner scanner = new Scanner(System.in); boolean keepRunning = true;
System.out.println("数字を入力してください(終了するには「0」を入力)"); if (!scanner.hasNext()) { System.out.println("入力が確認できません。プログラムを終了します。"); break; }
if (scanner.hasNextInt()) { int number = scanner.nextInt(); if (number == 0) { keepRunning = false; } else { System.out.println("You entered: " + number); } } else { System.out.println("Invalid input. Please enter a number."); scanner.next(); } }
scanner.close(); } } |
上の例では、初期化の後に「boolean keepRunning = true;」で変数を定義した後、While文で「while (keepRunning)」とし、ifで入力の条件(「0」を入力にする)を分岐します。これを「true」に設定、ループの終了を「false」に設定します。
その結果、「0」を入れるまでループを続け、「0」の入力条件を満たせば終了するプログラムです。ただし、今回は起動時にscanner入力のできない環境も想定し、入力がない場合に自動終了するコードも入れておきます。これで、スキャナ環境のない状態で入力がない場合でもエラーで止まることなく、プログラムを終了させることができます。
プログラミングを学習者でオンライン学習ツールなどを使用する環境の場合などでもこれなら試しの実行が可能です。
処理を外部に頼らない配列のforループ
2つ目は、「Scanner」に頼らず、for文で複数の値を判定する方法です。内部で処理が完結するため、Scannerも不要です。
以下は、複数の人の年齢を入れて配列を作成し、forループで順番に取り出して確認できます。
public class Main { public static void main(String[] args) { int[] ages = {15, 16, 20, 17, 19};
System.out.print((i + 1) + "番目の人は、" + ages[i] + " 歳です。"); if (ages[i] >= 18) { System.out.println("すでに成人しています。"); } else { System.out.println("まだ未成年です。"); } }
} } |
また、応用的な使い方として、「for (int i = 0; i < ages.length; i++)」の部分を「for (int age : ages) 」にして、拡張for文で簡単に書くこともできます。
continueで条件外をスキップする
今度は、「count」の変数と「continue」で条件外をスキップし、条件合致のものだけに連番を付ける方法です。
以下の例では、変数のcountを使って「int count = 0;」で宣言し、条件に合致したときだけ連番を振ります。次の条件合致でまた連番とそれに1足されるので、番号が連番になるという仕組みです。
public class Main { public static void main(String[] args) { int[] ages = {15, 16, 20, 17, 19}; int count = 0; //連番を振るための宣言
if (ages[i] < 18) { continue; //スキップ }
System.out.println("成人済みの" + count + "人目は、" + ages[i] + "歳です。"); }
} } |
上記の例を実行すると、「成人済みの1人目は、20歳です。」「成人済みの2人目は、19歳です。」のように、未成年の場合に、その人の番号を飛ばすことができます。
6.Javaのbooleanを使用する際の注意点
booleanを使うときの注意点を以下に解説します。
Javaのbooleanで初期値と「null」に気をつける
1つ目は、初期値と「null」の扱いに注意を払うことです。まず、Javaにおけるbooleanの初期値は「false」と決まっています。しかし、Javaのローカルメソッドには初期値がないため、初期値が「false」には設定されていません。そのため、初期値を入れないとコンパイルエラーになります。
また、「null」を使用したいときにも注意が必要です。まずbooleanでは、「true」と「false」以外の「UNKNOWN」(=不明論理値)を入れることはできません。「UNKNOWN」は、Javaで「null」に該当するため、値として入れると同様にコンパイルエラーが出ます。
「null」を使いたいときは、オブジェクトとして扱えるBooleanクラスを使用することです。
配列に入れる値やListの要素を確認する
Javaでは、配列を作成した際に、そのまま利用するか、もしくはcollectionクラスを使います。このとき、オブジェクトを入れられるListの「Arrays.asList()メソッド)」などを使用する場合は注意が必要です。
例えば、「Arrays.asList()」メソッドは直接的なプリミティブ型の値を受け取れません。あくまでもBooleanクラスで扱う必要があります。
また、この「Arrays.asList()」メソッドでは、Listによく利用される「ArrayList()」のオブジェクトを返すことができません。「java.util.ArrayList」のクラス継承ができず、配列のルールとあわせて少しのミスでコンパイルエラーとなるため、注意が必要です。
7.Javaのbooleanでよくある質問
Javaのbooleanの利用や実装でよくある質問に対して回答します。
Javaのbooleanは0と1のどっち?
Javaのbooleanでは、0と1は返しません。boolean型で返せる値は「true」と「false」のみです。0や1を返せないと成立しないプログラムを書いてしまうと、エラーが起こります。
ただし、情報基礎や物理では「true」が1、「false」が0に該当します。これを前提としてプログラミング言語「C++」では数字を返しますが、Javaで数字を返すことはないのです。
Javaのbooleanでif文の「戻り値」を利用するとは?
Javaでは、boolean型を使う際に、if文に「戻り値」を利用することがあります。戻り値とは、出した結果を返した値のことです。フラグ管理で値を返すことに利用されます。
boolean型の場合、「true」と「false」の2つに1つです。そのため、if文で条件分岐に「true」の場合と「false」の場合で出力結果を分けることができます。
Javaのbooleanに参照渡しはある?
Javaのbooleanに参照渡しは、厳密には「ない」といえます。なぜならboolean型が扱えるのはプリミティブ型の値だけとなっており、「参照」はオブジェクトを位置付ける型です。
つまり、プリミティブ型しか使えないboolean変数で、参照渡しが行われることはありません。どうしても参照渡しをしたいときは、「Booleanクラス」で使うことです。
関連記事
JavaのList初期化ガイド|初期化の方法や実装事例、addできない理由なども解説
Javaプログラミングで何ができる?始め方や基本文法、練習サイト5つを紹介
8.まとめ
今回は、Javaのbooleanの特徴や使い方、注意点などを取り上げました。booleanでは、値に「true」と「false」しか扱えず、それ以外を入れるとエラーになるというJava独自のルールがあります。そのため、直接的なプリミティブ型の値以外を扱う場合は、オブジェクトの使えるbooleanを使う必要があります。
また、booleanの使い方はifを利用してその戻り値で条件分岐の結果を出力するフラグ管理が基本です。ifにはさまざまなパターンがあり、for文のループ制御や複数リスト、while文などと組み合わせて使う応用的な使い方もあります。
以上を参考に、booleanを実際に使いこなしましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。