Java プログラミング入門:演算子と制御構文の体系的理解

演算子の基本と優先順位

変数の宣言と初期化が完了したら、次はデータを変形・処理する手段が必要となります。この役割を果たすのが 演算子 です。演算子は特殊な記号であり、ひとつまたは複数のオペランド(操作対象)に対して特定の計算や比較を実行し、結果を返します。

複雑な式を展開する際、演算子の評価順序(優先順位)を理解しておくことが不可欠です。以下の表は、最も評価される順に並べた Java の演算子一覧です。上部にある演算子は優先度が高く、下部ほど低くなります。同一優先度の演算子が連続する場合、代入演算子を除き左から右へ評価されます。

カテゴリ演算子
後置 / 単項expr++, expr--, ++expr, --expr, +expr, -expr, ~, !
乗除 / 余り*, /, %
加減+, -
シフト<<, >>, >>>
比較<, >, <=, >=, instanceof
一致==, !=
ビット演算&, ^, |
論理演算&&, ||
三項? : :
代入=, +=, -= など
頻出する演算子から順に解説します。各セクションには検証可能なコード例が含まれています。

代入と算術演算子

最も基本的かつ頻繁に利用されるのは単純代入演算子の = です。右辺の値を左辺の変数に格納します。これにより、データの保持状態を管理できます。

int balance = 1000; // バランスを初期化
int transactionAmount = 50;
// ...

数値計算を行うための演算子も用意されています。四則演算に加え、割算の余りを取得する % モジュロ演算子があります。

  • +: 加算、文字列連結
  • -: 減算
  • *: 乗算
  • /: 商の除算
  • %: 剰余(余り)の取得

以下に、計算過程を追跡するデモを示します。

class CalculationFlow {
    public static void main(String[] args) {
        double currentTotal = 10.5;
        
        currentTotal += 5.0;  // 合計金額に追加
        System.out.println("Step 1: " + currentTotal);

        currentTotal -= 2.5;  // 割引適用
        System.out.println("Step 2: " + currentTotal);
        
        double taxRate = 0.1;
        double tax = currentTotal * taxRate;
        
        System.out.println("Tax Amount: " + tax);
    }
}

また、+ は数値加算以外に、文字列を連結する際にも用いられます。

String prefix = "Hello";
String suffix = " World!";
System.out.println(prefix + suffix); // "Hello World!" と表示

単項演算子

単一のオペランド作用于る演算子群です。値の更新や否定などに使用します。

  • ++: インクリメント(1 増加)
  • --: デクリメント(1 減少)
  • ! : 論理否定(ブール値の反転)

インクリメントには前置形式(++i)と後置形式(i++)があり、式内での評価タイミングが異なります。

class CounterExample {
    public static void main(String[] args) {
        int count = 5;
        
        // 評価後に増加
        int val1 = count++; 
        System.out.println("val1: " + val1 + ", count: " + count); // 5, 6
        
        // 増加後に評価
        int val2 = ++count;
        System.out.println("val2: " + val2 + ", count: " + count); // 7, 7
    }
}

相等および関係演算子

2 つの値を比較して真偽値を返す演算子です。条件分岐の基礎となります。

==等しい
!=等しくない
>, >=, <, <=大小比較

注意として、条件判定には必ず == を使用し、代入用の = と混同しないようにします。

class ConditionCheck {
    public static void main(String[] args) {
        int score = 85;
        boolean isPassed = score >= 60;
        
        if (isPassed) {
            System.out.println("合格ラインを超えています");
        } else {
            System.out.println("不合格です");
        }
    }
}

条件およびビット演算子

論理演算子である &&(AND)や ||(OR)は、「ショートサーキット」動作を持ちます。つまり、最初の引数が結果を決定できる場合、二つ目の引数は評価されません。

ビット演算子は整数型の内部データを直接操作するために使用されます。&(AND), |(OR), ^(XOR), ~(NOT)などがあります。例えば、フラグ管理で特定のエラーコードだけを抽出する際などに有用です。

class BitManipulation {
    public static void main(String[] args) {
        int flags = 0b1010; // ビットパターン
        int mask = 0b0011;
        
        int result = flags & mask;
        System.out.println(result); // AND 操作の結果
    }
}

式、文、およびブロック

Java コードの基本構成要素を整理します。

式の定義

は、値を計算する組み立て物です。変数、演算子、メソッド呼び出しなどが含まれます。計算の順序は演算子の優先度によって決まりますが、明示的に括弧 () を使用することで意図した順序を保証できます。

// 暗黙的な優先順位
int value = x + y / 100; 

// 明確にするための推奨表現
int value = (x + y) / 100;

文とブロック

文はプログラムの実行単位です。多くの場合はセミコロン ; で終わります。また、大括弧 {} で囲まれた文の集まりは「ブロック」と呼ばれ、スコープを限定したり制御構造の本体として機能します。

制御フロー文

プログラム実行の流れを制御するための仕組みです。代表的なものとして条件分岐とループがあります。

if-then および if-else

特定の条件が真の場合に実行する処理を指定します。

boolean isActive = true;

if (isActive) {
    startService();
} else {
    logInactiveUser();
}

switch 文

整数、文字列、または列挙型に基づいて複数の処理パスを選択できます。break 文がないと、次のケースへと「フォールスルー」してしまうため注意が必要です。

String action = "SAVE";

switch (action.toUpperCase()) {
    case "CREATE":
        createResource();
        break;
    case "UPDATE":
        updateResource();
        break;
    default:
        System.out.println("Unknown action");
}

ループ処理

for ループ

繰り返し回数が明確な場合に最適です。

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

強化された for ループ を使えばコレクションの要素を簡単に走査できます。

int[] dataPoints = {10, 20, 30};
for (int val : dataPoints) {
    System.out.println(val);
}

while および do-while

条件が満たされる限りループします。do-while は少なくとも 1 回は実行される点が特徴です。

int attempt = 0;
do {
    attempt++;
    // ロジック...
} while (attempt < 3);

ブランチ処理

  • break: ループや switch から脱出。
  • continue: 現在のイテレーションをスキップし、次へ進む。
  • return: メソッドから即時終了し、値(任意の場合はなし)を返す。

クラスとオブジェクト

Java はオブジェクト指向プログラミング言語です。データとその振る舞いを結合させる単位としてクラスを使用します。

クラスの構成

クラスはフィールド(変数)、メソッド(関数)、コンストラクタで構成されます。

public class Product {
    private String name;
    private double price;

    public Product(String n, double p) {
        this.name = n;
        this.price = p;
    }

    public double getPrice() {
        return price;
    }
}

ここで this キーワードは、パラメータ名とフィールド名が競合している場合に、クラス内のメンバを参照するために使用されます。

メソッド

メソッドはクラスにアクションをもたらすコードブロックです。署名(名前+パラメータ型リスト)によって識別されます。同名でもパラメータの種類や数が異なれば「オーバーロード」として区別可能です。

コンストラクタ

クラスから新しいインスタンスを作成する際に呼び出されます。戻り型を持たない代わりにクラス名と同じ名称を持ちます。

パラメータ伝達

基本型(int, double など)は値渡しです。メソッド内で変更されても元の値には影響しません。

一方、参照型(オブジェクトや配列)は参照渡しの挙動を示します。メソッド内でオブジェクトの内容を変更すれば反映されますが、参照先そのものを別のオブジェクトに変更しても、呼び出し元の影響は受けません。

タグ: Java operators control-flow OOP classes

6月24日 21:28 投稿