Programming 3 / Java

トップに戻る

第2回: 演算子、変数と型、文字列、if文と繰り返し処理

Processingで学んだ基本構文を土台に、Javaで増える型、コンパイルと実行、文字列のエスケープ、条件分岐と繰り返し処理を整理します。

1

Processing と Java の対応

今回扱う範囲はProcessingと共通するものが多くあります。ただし、Javaでは型の種類やコンパイル手順をより明確に意識します。

項目 Processingとの違い 今回の注目点
演算子 基本は同じ ビット操作演算子も確認する
変数の宣言 基本は同じ 型を先に書いてから変数名を書く
変数型 Javaのほうが多い longshortbytedouble など
文字列 基本は同じ 特殊文字はエスケープする
条件分岐・繰り返し 基本は同じ breakcontinue の動きも確認する
2

作成・コンパイル・実行の流れ

  1. コマンドプロンプト、テキストエディタ、演習用フォルダを開く。
  2. ソースコードを作成し、クラス名と同じ名前の .java ファイルとして保存する。
  3. javac クラス名.java でコンパイルする。
  4. java クラス名 で実行する。
cmd
javac OperatorSample.java
java OperatorSample
Javaでは、公開クラスの名前とファイル名を一致させます。たとえば class OperatorSample なら、保存名は OperatorSample.java です。
3

演算子

算術演算子は数値計算、比較演算子は true / false の判定、論理演算子は条件の組み合わせに使います。

02-j-3 / OperatorSample.java
class OperatorSample {
  public static void main(String[] args) {
    System.out.println(10 + 20);  // 30
    System.out.println(30 - 40);  // -10
    System.out.println(50 * 60);  // 3000
    System.out.println(70 / 80);  // 0
    System.out.println(90 % 10);  // 0
  }
}
整数同士の割り算では、小数点以下が切り捨てられます。70 / 800.875 ではなく 0 です。

比較演算子

意味 結果
100 < 110より小さいtrue
100 > 110より大きいfalse
100 <= 100以下true
100 >= 100以上true
100 == 110等しいfalse
100 != 110等しくないtrue

論理演算子

LogicSample.java
boolean a = true;
boolean b = false;

System.out.println(a & b);  // false: AND
System.out.println(a | b);  // true: OR
System.out.println(a ^ b);  // true: XOR
System.out.println(!a);     // false: NOT

インクリメントとビットシフト

x++++x は、どちらも変数 x を1増やします。ビットシフトは整数の内部表現を左右にずらす演算です。

動き 結果
-8 >> 2符号を維持して右に2ビットシフト-2
-8 >>> 2左端を0で埋めて右に2ビットシフト1073741822
-8 << 2左に2ビットシフト-32
4

変数と型

Javaの変数は、値そのものを扱う基本型と、オブジェクトへの参照を扱う参照型に大きく分けられます。String は文字列ですが、分類としては参照型です。

用途 ラッパークラス
int32bit整数Integer
long64bit整数Long
short16bit整数Short
byte8bit整数Byte
char1文字Character
float32bit浮動小数点数。値の末尾に f を付けるFloat
double64bit浮動小数点数Double
booleantrue または falseBoolean

オーバーフロー

02-j-401 / OverflowSample.java
class OverflowSample {
  public static void main(String[] args) {
    int max = Integer.MAX_VALUE;
    System.out.println(max);
    System.out.println(max + 1);
  }
}
出力を確認する
output
2147483647
-2147483648

表現できる最大値を超えると、期待した数学的な結果ではなく、型の範囲に従った値になります。

ラッパークラスと文字列からの変換

02-j-402 / ParseSample.java
class ParseSample {
  public static void main(String[] args) {
    String a = "1234";
    String b = "5678.9";

    int n = Integer.parseInt(a);
    double d = Double.parseDouble(b);

    System.out.println(n + 10);   // 1244
    System.out.println(d + 0.1);  // 5679.0
  }
}

型キャスト

表現範囲の広い型へ代入する場合は自動変換されます。狭い型へ入れる場合は、失われる情報があるため明示的なキャストが必要です。

CastSample.java
class CastSample {
  public static void main(String[] args) {
    int a = 100;
    long b = a;       // 自動変換
    int c = (int) b;  // 明示的なキャスト
  }
}
5

文字列の扱い

文字列は String 型で扱います。文字列内にダブルクォーテーションや改行などの特殊な文字を入れる場合は、エスケープシーケンスを使います。

02-j-5 / StringSample.java
class StringSample {
  public static void main(String[] args) {
    String s1 = "私は\"学生\"です";
    System.out.println(s1);
  }
}
書き方 意味
\bバックスペース
\t水平タブ
\n改行
\'シングルクォーテーション
\"ダブルクォーテーション
\\円マークまたはバックスラッシュ
6

条件分岐と繰り返し処理

Javaの ifswitchforwhile の基本形はProcessingとほぼ同じです。処理が1文だけの場合、中かっこは省略できますが、最初は省略せずに書くほうが読み間違いを防げます。

02-j-601 / ControlSample.java
class ControlSample {
  public static void main(String[] args) {
    int score = 80;

    if (score >= 60) {
      System.out.println("合格");
    } else {
      System.out.println("再提出");
    }

    for (int i = 0; i < 3; i++) {
      System.out.println(i);
    }
  }
}

switch-case の注意点

switch 文では、各 case の最後に break を書かないと、次の case の処理も続けて実行されます。この動きをフォールスルーと呼びます。

02-j-602 / SwitchSample.java
class SwitchSample {
  public static void main(String[] args) {
    int label = 2;

    switch (label) {
      case 1:
        System.out.println("label1");
        break;
      case 2:
        System.out.println("label2");
        break;
      default:
        System.out.println("その他");
    }
  }
}

for / while / do-while

  • for 初期化、条件、増分を1行にまとめて書く。回数が見えている繰り返しに向いています。
  • while 条件を先に判定する。条件が最初からfalseなら一度も実行されません。
  • do-while 処理を先に実行してから条件を判定するため、必ず一度は実行されます。
02-j-603 / LoopControlSample.java
class LoopControlSample {
  public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
      if (i == 1) {
        continue; // この周回だけスキップ
      }
      if (i == 4) {
        break;    // ループを終了
      }
      System.out.println(i);
    }
  }
}