ITスクールの授業6日目のまとめ1:制御文ー条件文(if / else / else if)
前書き
今まで勉強してきたのは入力したコードが上から下へと1行1行実際実行されるコードであったが、制御文、その中の条件文は条件によってコードが実行するかしないかが制御できるものである。設定した条件によって違うコードが実行できるというのはすごくとても重要なことで、プログラムのレベルがすごい上がることに異見がないと思う。
ITスクールで学んだ条件文は「if/else/else if」文と「switch - case」文である。今回は「if/else/else if」文をまとめて、次に「switch」文をまとめることにする。
if文
if文は一緒に書いた条件を判別して、その条件が真(TRUE)か偽(FALSE)かによって、if文のブロックにあるコードを実行するかしないかが決まる。
if文の形式は下記のようになる。
if(条件式){
条件式が正しい時、実行するコード
}
条件式には、条件がTRUEかFALSEかを判別するために関係演算子(<, <=, >, >=, ==, !=)を使う。関係演算子を含めて、条件式が正しいかったらブロックの中のコードを実行する。間違う条件のブロックは全部飛ばして、次のコードを実行する。
下記はif文の条件によって実行するか、実行しないかを確認する例文である。
int number = 5;
if(number < 0) { // 条件が正しくないので、ブロックのコードが実行されない。
System.out.println("numberは負数です。");
}
if(number > 0) { // 条件が正しいので、ブロックのコードが実行される。
System.out.println("numberは正数です。");
}
if(number == 0) { // 条件が正しくないので、ブロックのコードが実行されない。
System.out.println("number0です。.");
}
「==」や「!=」を使ってTRUEやFALSEが出る演算をする場合、条件式TRUEであることが条件である時は関係演算子を省略することもできる。(説明がヘタクソで、もう一度コードを作成します。)
boolean isTrue = true;
if(isTrue){ // 関係演算子が書いてないが、「isTrue」の後に「==true」が省略されている。
// isTrue変数がTRUEになっているので、条件式が正しいからブロックに入る。
System.out.println("条件式が正しいです。");
}
上記したようにif文を2つ以上並んだ時は、各if文の条件を全部確認する。もう条件にあったif文があっても、そのあとのif文まで全部確認することは非効率的である。だから、たくさんの条件を確認する場合は下でまとめる「else if」文を使うことがいい。
else文
else文は、1つのif文を書いた後に使って、if文の条件が正しくない(FALSEである)時に、else文のコードが実行される。「if文の条件ではない時」と理解しても問題ない。
elseは「if文の条件に入らない場合」という意味を持つので、条件を並べている時、条件判別の最後の条件としてもよく使われる。
下記のコードは、条件の範囲が2つしかない時、if文とelse文で2つの条件を扱う制御文の例文である。
import java.util.Scanner; // キーボードで入力するために必要。
public class IF3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if(num % 2 == 0) { // 入力した整数を2に分けた余り数が0、偶数であればif文を実行
System.out.println("偶数です。");
}
else { // 余り数が0でなければ、つまり奇数であればelse文を実行
System.out.println("奇数です。");
}
}
}
else if文
else if文は1つのif文を書いた後に使えて、if文の条件の範囲ではない、他の範囲を条件としてコードの実行を決める。
if文を並べることと見える機能は同じであるが、内部的に処理する方式が違う。ifとelse ifで結ばれている条件文のどっちか1つ実行されたら、結ばれている他の条件は確認しない。
上のif, elseとともに else ifまで使う条件範囲が多い制御文になると、先にifが来て、ifの条件範囲ではない範囲でelse if文を作成して、前のif文とelse if文に入らない範囲を全部含めてelse文にして閉まるという形になる。
下記は3つ1条の範囲になっている条件を、ifとelse ifとelseで結んだ制御文である。
int number = -5;
if(number < 0) { // こっちが正しいので、こっちのコードが実行
System.out.println("負数です。");
} else if (number == 0) { // 上で正しい条件が見つかって、ここは確認しない。
System.out.println("0です。");
} else { // 上で正しい条件が見つかって、ここは確認しない。
System.out.println("正数です。");
}
制御分で、文字列に関係演算子を使う時に注意すること!!
上記した、条件の真偽を判別するための関係演算子は基本データ型(boolean, byte, short, char, int, float, long, double)にだけ使える。
文字列(String)は基本データ型でないので、文字列には「==」と「!=」を使うといけない。文字列は参照型データで、「==」や「!=」を使うと、文字列の内容を比較することでなく、アドレスを比較することになる(参照型データを学ぶときに、もっと詳しくまとめます。)。
文字列の内容を比較するのなら、Stringクラスの「.equals」メソッドを使う。「.equals」を使うと、「==」を使った時のアドレス比較でなく、内容を比較して結果をTRUEやFALSEに戻してくれる。
import java.util.Scanner;
public class If5 {
public static void main(String[] args) {
System.out.print("同意しますか? (Y)es / (N)o => ");
Scanner sc = new Scanner(System.in);
String agree = sc.nextLine();
//文字列の内容を比較しようとすると, 「==」でなくStringクラスのequals()メソッドを使う。
//if(agree.equals("Y") == true) 혹은, if(agree == "Y") -> これでは内容の比較ができない。参照型データ場合はアドレスを比較してしまう。
if(agree.equals("Y") || agree.equals("y")) {
System.out.println("同意しました。");
}
else if(agree.equals("N") || agree.equals("n")) {
System.out.println("同意しませんでした。");
}
else {
System.out.println("入力が間違いました。");
}
sc.close();
}
}
以上で、制御文の中で「if / else / else if」についてまとめてみた。制御文は前書きでも書いた通り、単純に作動するプログラムを超えて、ユーザーが設定するかプログラムで変化する状況によってさまざまな作動ができるために必ず必要な文法で、しっかり理解してプログラミングに活用することが必修である。
次は、if文とは違う形式である、「switch - case」文についてまとめる予定である。
Discussion