본문 바로가기

IT自主学習 (2023.05.23~)/Java(2023.05.23~)

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

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

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

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

 

また、truefalse予約語という。それぞれ真と偽の意味を持つため、他の意味で使用することはできない。

予約語はプログラミング言語において特別な役割を持つ単語やキーワードであり、変数名や関数名として使用することはできない。

 

比較演算子(Comparison Operator)

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

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

 

 


条件文(Conditional Statement)

 

1)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 '생활코딩',&nbsp;JAVA 제어문 - 5. == vs equals

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


1つ目は、==演算子Primitive typeに対応し、同じ値だけでなく、同じアドレスにあるかを確認する。

先に学んだ条件文の応用では、同じ値の実引数を入力したが、falseと認識された。

さぞかし、同じ値であるが、異なるアドレスに保存されていることが原因でしょう。

基本的に、==演算子Primitive typeのみ対応できる。

 

2つ目はequalsNon-Primitive typeに対応し、同じ値であるかを確認する。

簡単に言えば、Non-Primitive typeequalを活用すれば解決できる。

ただし、例外として文字列である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)