Java Basic booleanの意味と条件分岐 〜Step1_2_2〜

イントロダクション

はじめに復習をします。

前回使用した変数にint型, dluble型がありますが、これらはプリミティブ型変数と呼びます。
これに対して、String型のようにクラスとしてJavaで定義されているものは参照型と呼びます。

具体的に、参照型はメソッドが呼べるがプリミティブ型がはメソッドが呼べないというところです。

そして、もう1つ参照型変数はインスタンスを参照します。このインスタンスがキーポイントになりますが、今はString型の変数を初期化したら、その変数にはString型のインスタンスが入っているんだなと理解してください。

この「インスタンス」のことを「オブジェクト」と呼んでいることが多いですが「プログラミング業界で『オブジェクト』と言えばほとんどすべてのもの」が『オブジェクト』になるので注意が必要です。

具体的には下のようなコードになります。

int num = 0;
//int num1 = null; -> ビルドエラー
String moji = "abc";
String moji2 = null;

moji.length(); // 文字列の長さを取得する
// num1.length(); // エラーになる
  1. プリミティブ型の変数にはnullを代入できません。プリミティブ型は何もない=「参照なし」の状態にはできないのです。
  2. 参照型にはnullが代入できます。参照型は何もない=「参照なし」の状態があり得ます。

String型のような参照型の変数は、常にクラスを参照しようとします。なのでどこも参照したくない場合はnullを代入します。俗にいうと「メモリを解放する」という処理になります。

そして、プリミティブ型の変数、intdoubleを使用してきましたが。これらの変数はメモリ領域を直接確保します。
なので、確保した領域に「何もない」=nullを代入することができません、つまり、はじめから変数を宣言(初期化)=メモリ領域の確保、は必要ないからです。

具体的には、下のようなプログラムを見ていただくとわかると思います。

int num; // int型の変数を宣言=4バイト文のメモリ領域の確保
int num1 = 1; // 上と同様に4バイト文のメモリ領域を確保

String moji = null; // 変数を宣言しているが、メモリ領域は確保していない
String moji2 = "a"; // 変数を宣言して値を設定しているので1バイト分のメモリ領域を確保

上記のようになります。

サンプルコード

プログラム引数を整数型の変数にセットして四則計算を行い表示するプログラムです。
※ テストしていないので、こんな感じというのを見てほしいです。

public class Sample {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("プログラム引数は2つセットしてください。");
            System.exit(-1);
        }
        // プログラム引数は1桁の数字
        if (args[0].matchies("0-9") && args[1].matchies("0-9")) {
            int left = Integer.parseInt(args[0]); // プログラム引数の1つ目
            int right = Integer.parseInt(args[1]); // プログラム引数の2つ目
            // 四則計算の処理
            System.out.println("left + right = " + (left + right));
            System.out.println("left - right = " + (left - right));
            System.out.println("left * right = " + (left * right));
            System.out.println("left / right = " + (left / right));
        } else {
            System.out.println("プログラム引数は1桁の数字をセットしてください。");
        }
    }
}

プログラム引数を使用してプログラムを実行しています。具体的な処理内容は以下の通りです。

  1. 引数が2つでない場合はメッセージを表示してプログラムを強制終了(異常終了)
  2. プログラム引数が2つとも一桁の数字であれば、四則計算を行い表示
  3. それ以外はメッセージを表示

<コマンドで実行する場合>
下のようにコマンドをたたく

java Sample 1 2

boolean型

プリミティブ型の変数booleanの扱い方について記載します。

真偽値で、条件分岐を行うのに便利

// sample
int a = 1;
int b = 2;
boolean isSame = a == b;
System.out.pintln(isSame);

上のコードは、int型の変数、「a」「b」を初期化してそれぞれの値が等しいかどうか検証しています。

boolean isSame = a == b;

この行が判定している処理になります。

そして、この判定結果がboolean型の変数isSameに代入されています。

早い話が

aとbが等しい時は「true」、そうでない場合は「false」が変数isSameに代入されます。

これを確かめるのには、上のコードを実行してみればわかります。

試しに、「a」「b」の値を変更して実行して見てください。
どのような結果になるか予想してから実行して見てください、

ちょっとしたクイズゲームみたいでしょう?

ちょっとしたクイズゲーム

上のコードを書き換えて、下のように修正しました。これを写経して動かして見てください。
ちなみに、「サンプル実装パターンX」とあるコメント行から下の部分が変更する部分です。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String num1 = scan.next();
    String num2 = scan.next();
    // サンプル実装パターン1
    int a = Integer.parseInt(num1);
    int b = Integer.parseInt(num2);

    boolean isSame = a == b;
    System.out.println(isSame);
}

別パターン

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String num1 = scan.next();
    String num2 = scan.next();
    // サンプル実装パターン2
    int a = Integer.parseInt(num1);
    int b = Integer.parseInt(num2);
    boolean isSame = a == b;
    if (isSame) {
       System.out.println(a + “ and “ + b + “ is same”);
    } else {
       System.out.println(a + “ and “ + b + “ is not same”);
    }
}

ちなみに、筆者が作成したものを動画にしてみました。

プログラム引数について

Javaプログラムを起動するときに渡す値のこと、コマンドで渡す、IDEでプログラムを実行するときに渡す。

public static void main(String[] args) {
   System.out.println(“プログラム引数は” + args[0] + “です”);
}

上のコードはプログラム引数を渡さないと落ちます!

Eclipseで実行するときは以下のような画面で
「引数」「Arguments」のタブより
「プログラム引数」と「VM引数」とあるので
プログラム引数の部分に入力する

VM引数

システムプロパティなどに使う、Java Vertual Machine(JVM)に渡す引数
「-D引数」という形で渡す※全てではない

<プログラム引数を渡す。>※ Eclipse余計な音が入っています。

<プログラム引数を渡す。>※IntelliJ IDEA

IF文の書き方

【条件分岐の書き方】

if ( 条件式 ) {
   処理
} else if( 条件その2) {
    処理2
} else {
    上記の条件以外のケースの処理
} 

<IFの実装サンプル>

上の「条件式」の部分には論理式が入ります。論理式はboolean型の値を返却する式のことです。
具体的には下のようになります。

boolean(真偽値)

<Booleanの実装サンプル>

// 下の変数には全てtrueが入ります
boolean isSame = 1 == 1;
boolean notSame = 1 != 2;

boolean isSameString = "1".equals("1");
boolean notSameString = !"1".equals("1");

boolean yes = true;
boolean no = false;

// 論理演算
boolean result = yes & no; // falseになる AND演算
result = yes | no;         // trueになる OR演算
result = yes ^ no;         // trueになる XOR演算
result = ~yes;             // falseになる NOT演算
日本語 演算(演算子) 真偽値1 真偽値2 結果
論理積 AND(&) TRUE TRUE TRUE
論理積 AND(&) TRUE FALSE FALSE
論理積 AND(&) FALSE FALSE FALSE
論理和 OR(|) TRUE TRUE TRUE
論理和 OR(|) TRUE FALSE TRUE
論理和 OR(|) FALSE TRUE TRUE
論理和 OR(|) FALSE FALSE FALSE
排他的論理和 XOR(^) TRUE TRUE FALSE
排他的論理和 XOR(^) TRUE FALSE TRUE
排他的論理和 XOR(^) FALSE TRUE TRUE
排他的論理和 XOR(^) FALSE FALSE FALSE
否定(ビット反転) NOT(~) TRUE - FALSE
否定(ビット反転) NOT(~) FALSE - TRUE
        boolean and = true & false;
        boolean or = true | false;
        boolean xor = true ^ false;
        // NOT演算
        boolean not = !false;

【標準入力】 ※低レベルな(古い)書き方です。

public static void main(String[] args) {
   byte[] input = new byte[5]; // 5文字までの入力分
   System.in.read(input);
   System.out.println(input); // コンソール出力
}

【標準入力】 ※最近の書き方です。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String input = scan.next();
}

<標準入力を使うサンプル>

【プログラム引数の使い方】
※サンプルは上の方にあります。

public static void main(String[] args) {
   // プログラム引数はスペースで区切ると複数個入力できる
   System.out.println("プログラム引数: " + args[0]);
}

【標準出力・入力のメソッドについて】
「System.out.println("文字列");」とコードを記載すると思いますが
Systemクラスのoutフィールドに定義されている「printlnメソッド」を
いつも使用しています。

JavaDocAPIを見るとそのように書いてあります。
Javaに関してはこのJavaDocを読んで理解できるようになれば
Javaの基本はマスターしたと言って過言はありません。

とりあえずは、こんな感じです。

switch文

今度はswitch文についてです。
BlueJでSwitch文>

IF文と同じように条件分岐を行いますが、コードの書き方が違います。

switch (値) {
case 値がXXの時:
    // 何かしらの処理
    break;
case "文字":
    // 何かしらの処理
    break;
case "文字2":
    // 何かしらの処理
    break;
default:
    // 想定外の値の時の処理
}

実際に使用する時は「値がXXの時」の部分を指定した値の時の処理を書きます。
言葉で示すよりもコードで示す方が良いと思いますので、以下に示します。

String moji = "aa";
switch (moji) {
    case "aa":
        System.out.println("1. 何かしらの処理");
        break;
    case "abc":
        System.out.println("2. 何かしらの処理");
        break;
    default:
        System.out.println("3. 何かしらの処理");
}

上記の場合、String型の変数「moji」に「aa」という値が入っていますので。「1. 何かしらの処理」が標準出力に表示されます。(出力されます)

そして、case文の中にある「break」がない時は、全て表示されます。具体的には以下の通りです。

String moji = "aa";
    switch (moji) {
    case "aa":
        System.out.println("1. 何かしらの処理");
    case "abc":
        System.out.println("2. 何かしらの処理");
    default:
        System.out.println("3. 何かしらの処理");
}

この場合は、下のように出力されます。

  1. 何かしらの処理
  2. 何かしらの処理
  3. 何かしらの処理

そして、次の場合はどうでしょうか?

String moji = "aa";
switch (moji) {
    case "aa":
        System.out.println("1. 何かしらの処理");
    case "abc":
        System.out.println("2. 何かしらの処理");
        break;
    default:
        System.out.println("3. 何かしらの処理");
}
  1. 何かしらの処理
  2. 何かしらの処理

と表示されます。これはcase "aa"のcase文に「break」がなく次の"abc"の部分に「break」があるからです。

つまり「break」は「{}」の中から外に出ますよという意味です。

if文の時でも同様ですが、意味がないので使用しません。

次にやるループ処理では大いに意味があるので使います。

変数「i」が3の時ループを抜ける処理
for (int i = 0; i < 10; i++) {
    if (i == 3) {
        break;
    }
}

<<<前回 次回>>>

関連ページ

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す