プログラミング自主学習 DAY11 Boolean&比較演算子/条件文/条件文の応用/==とequalの違い/論理演算子
Boolean(ブーリアン型、論理型)
Booleanはプログラミング言語におけるデータタイプの一つであり、true(真)
とfalse(偽)
という二つの値を持つ。
こちらの値は条件式の評価や論理演算に使用される。
また、true
とfalse
を予約語という。それぞれ真と偽の意味を持つため、他の意味で使用することはできない。
予約語はプログラミング言語において特別な役割を持つ単語やキーワードであり、変数名や関数名として使用することはできない。
比較演算子(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