🙌

プログラミング自主学習 DAY11 Boolean&比較演算子/条件文/条件文の応用/==とequalの違い/論理演算子

2023/06/15に公開

Boolean(ブーリアン型、論理型)

Booleanはプログラミング言語におけるデータタイプの一つであり、true(真)false(偽)という二つの値を持つ。

こちらの値は条件式の評価や論理演算に使用される。

また、truefalseを予約語という。それぞれ真と偽の意味を持つため、他の意味で使用することはできない。
予約語はプログラミング言語において特別な役割を持つ単語やキーワードであり、変数名や関数名として使用することはできない。

比較演算子(Comparison Operator)

比較演算子は二つの値または式を比較し、結果をブーリアンデータ型(trueまたはfalse)に返すものである。

>、<、>=、<=、==(等しい)、!=(等しくない)

条件文(Conditional Statement)

if(ブリアン型){コード}

if(true){System.out.println(1);}➡ 1がプリントされる。
if(false) {System.out.println(1);}➡ 1がプリントされない。

条件文の基本的に形式は、if文である。
ifの後に条件式(ブリアン型を返す式)が続き、波格好({})の中に実行するコードが記述される。
ブリアン型の値により、波格好のコードが実行されるどうかが決まる。
次に、条件に応じて異なる結果を表示する条件文の例を提示してみた。

if(true){System.out.println(1);}
if(false){System.out.println(2);}

しかし、この場合、二つの条件文は独立しており、片方がtrueであってももう一方がfalseであっても、両方のコードが実行される可能性がある。

つまり、最初のif文がtrueであっても、その次のif文が独立しているために実行される可能性があるということだ。
代わりに、以下のようにelseを使って条件をグループ化することで、互いに連関する条件を表現することができる。

if(true){System.out.println(1);}
else{System.out.println(2);}

この場合、最初の条件がtrueの場合は1が表示され、最初の条件がfalseの場合は2が表示されます。
条件文を適切にグループ化することで、意図した結果を得ることができる。

また、条件文の別の条件文が含めることもできる。これをネストされた条件文という。
より複雑な条件や複雑な条件を組み合わせるために使用される。

if(false) { System.out.println(1); }
else { if(true) { System.out.println(2); }else { System.out.println(3); } }

こちらがネストされた条件文である。
しかし、初見には理解しにくい部分があるため、再度整理してみる。

if(false) {System.out.println(1);}
else if (true){System.out.println(2);} 
else {System.out.println(3);}

条件文の応用

前述した知識と入力を活用し、ログインプログラムを作成してみる。
プログラムの仕様は以下の通りである。
正しいIDであるAngelを入力すれば、ログインができる。
入力値としてangelを入力すれば、Welcome to heavenが表示され、
他の入力値の場合は、Go to the hellというテキストが表示される。

コードを作成した後、ランしてみれば、本来の意図とは異なり、Go to the hellが表示された。
その場合、問題を解決するために、Stringのequalsメッソドを活用するこどができる。
(後ほど==とqualsメッソドの違いを説明する。)

次は、パスワードも追加してみる。


成功した場合


失敗した場合

このコードでは、条件文をより綺麗に整理してみたい。
そのため、論理演算子&&を活用し、コードをまとめる。


若干構造がが変わったところがあるが、根本は同じ原理で同じ出力が得られるプログラムを作成した。

== vs equals

Javaのデータタイプは、Primitive type(プリミティブ型、原始型)とNon Primitive(composite)type(複合データタイプ)の2つに分類することができる。

Primitive typeは、さらに細分化することができない基本的なデータタイプである。
Non-Primitive typeは、Primitive type以外のすべてのデータタイプを指す。
これにはクラス、インターフェース、配列、列挙型などが含まれている。

Primitive typeであるint p1, int 2は同じ値1を持っている。
また、同じ値1はメモリを節約するため、同じアドレス(空間)に存在する。
Non-primitypeであるString型のインスタンス o1とo2も同じ値"java"を持っている。

しかし、同じ値1は同じアドレスに存在せず、別々のアドレスに存在することが分かる。


Youtube '생활코딩', JAVA 제어문 - 5. == vs equals

これにより、推測できるの2つがある。

1つ目は、==演算子はPrimitive typeに対応し、同じ値だけでなく、同じアドレスにあるかを確認する。
先に学んだ条件文の応用では、同じ値の実引数を入力したが、falseと認識された。
さぞかし、同じ値であるが、異なるアドレスに保存されていることが原因でしょう。
基本的に、==演算子はPrimitive typeにのみ対応できる。

2つ目はequalsはNon-Primitive typeに対応し、同じ値であるかを確認する。
簡単に言えば、Non-Primitive typeはequalを活用すれば解決できる。
ただし、例外として文字列であるstringは==に対応に対応している。

論理演算子(Logical Operator)

&&(And): 全部trueでなければ、falseである。
||(Or):一つのみtrueであれば、trueである。

先に作成したログインプログラムを元に、論理演算子||を活用してみる。
例えば、パスワードが2つ存在しており、そのうちの1つのパスワードが正しいければ、
ログインができるとうにしたいとする。

以下に、この要件を満たすためのコードを作成した。

1111入力時:Hi.angelWelcome to Heaven!
2222入力時:Hi.angelWelcome to Heaven!
3333(all false)入力時:Hi.angelGo to Hell

意図したとおりプログラムが作動することを確認した。
これほどのレベルのプログラムはますますコードが複雑になるため、変数を利用し、まとめる。

boolean isRightpass = (inputPass.equals(pass)||inputPass.equals(pass2))
if(inputId.equals(id) && isRightpass)

Discussion