🐈

Java Silver 勉強④

2025/03/10に公開

【出題項目の例】

  • Javaの基本データ型と文字列の操作
  • 演算子と制御構造
  • 配列の操作
  • クラスの宣言とインスタンスの使用
  • メソッドの作成と使用
  • カプセル化の適用
  • 継承による実装の再利用
  • インタフェースによる抽象化
  • 例外処理
  • モジュール・システム

クラスの宣言とインスタンスの使用

1. クラスの基本構造

public class Sample {
    // フィールド (メンバ変数)
    int num;
    String text;

    // コンストラクタ
    public Sample(int num, String text) {
        this.num = num;
        this.text = text;
    }

    // メソッド
    public void show() {
        System.out.println("num: " + num + ", text: " + text);
    }
}

ポイント

  • クラス名はPascalCase(例: SampleClass
  • フィールド、メソッドはcamelCase(例: sampleMethod
  • thisはインスタンスのフィールドと引数を区別するために使用

2. インスタンスの作成

public class Main {
    public static void main(String[] args) {
        // インスタンスの生成
        Sample sample = new Sample(10, "Hello");

        // メソッドの呼び出し
        sample.show();
    }
}

ポイント

  • newを使ってインスタンスを生成
  • コンストラクタの引数を渡してフィールドを初期化
  • インスタンス名.メソッド名() でメソッドを呼び出す

3. コンストラクタのオーバーロード

public class Sample {
    int num;
    String text;

    // 引数なしコンストラクタ
    public Sample() {
        this(0, "Default");
    }

    // 引数ありコンストラクタ
    public Sample(int num, String text) {
        this.num = num;
        this.text = text;
    }

    public void show() {
        System.out.println("num: " + num + ", text: " + text);
    }
}

public class Main {
    public static void main(String[] args) {
        Sample s1 = new Sample(); // デフォルト値が設定される
        Sample s2 = new Sample(20, "Java");

        s1.show();
        s2.show();
    }
}

ポイント

  • コンストラクタを複数定義(オーバーロード)できる
  • this(引数)を使って、他のコンストラクタを呼び出せる

4. フィールドのアクセス修飾子

public class Sample {
    private int num; // privateなので外部から直接アクセス不可

    public Sample(int num) {
        this.num = num;
    }

    // getterメソッド
    public int getNum() {
        return num;
    }

    // setterメソッド
    public void setNum(int num) {
        this.num = num;
    }
}

ポイント

  • privateフィールドは直接アクセス不可(カプセル化)
  • getter/setterを使ってアクセス

5. staticメンバ

public class Sample {
    static int count = 0; // クラス変数

    public Sample() {
        count++; // インスタンスが作られるたびに増加
    }

    public static void showCount() {
        System.out.println("Total instances: " + count);
    }
}

public class Main {
    public static void main(String[] args) {
        new Sample();
        new Sample();
        Sample.showCount(); // Total instances: 2
    }
}

ポイント

  • static フィールドは クラスに属する変数(全インスタンスで共有)
  • static メソッドは インスタンスを生成せずに呼び出せる
  • インスタンス名.メソッド名() ではなく、クラス名.メソッド名() で呼び出す

6. オブジェクトの比較 (== vs equals)

public class Main {
    public static void main(String[] args) {
        String s1 = new String("Java");
        String s2 = new String("Java");

        System.out.println(s1 == s2);        // false (参照が異なる)
        System.out.println(s1.equals(s2));  // true  (内容が同じ)
    }
}

ポイント

  • ==参照アドレスを比較
  • .equals() → **値(内容)**を比較

7. まとめ

概念 説明
クラスの宣言 class クラス名 { } で定義
インスタンス生成 new クラス名() でオブジェクト作成
コンストラクタ インスタンスの初期化に使用
フィールド private で隠蔽し、getter / setter を使う
static クラス変数・クラスメソッドとして共有
== vs .equals() == は参照比較、.equals() は値比較

メソッドの作成と使用

1. メソッドの基本構造

メソッドは、再利用可能な処理(ロジック)のまとまりで、以下の要素で構成される。

[アクセス修飾子] 戻り値の型 メソッド名(引数リスト) {
    // メソッド本体
    return 戻り値; // 戻り値がvoidの場合は不要
}

例:

public int add(int a, int b) {
    return a + b;
}

ポイント

  • アクセス修飾子: publicprivateprotectedなどでアクセス範囲を指定
  • 戻り値の型: メソッドが返す値の型。返さない場合はvoidを指定
  • メソッド名: 命名規則はcamelCaseで記述(例: calculateSum
  • 引数リスト: メソッドに渡す値を定義。複数ある場合はカンマ区切り

2. メソッドの呼び出し

定義したメソッドは、メソッド名(引数) の形で呼び出す。

  • インスタンスメソッドの場合:オブジェクトを生成してから呼び出す
  • staticメソッドの場合:クラス名を指定して直接呼び出す

例:

// インスタンスメソッドの呼び出し
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator(); // インスタンス生成
        int result = calc.add(5, 10);
        System.out.println("Result: " + result); // 出力: Result: 15
    }
}

// staticメソッドの呼び出し
public class MathUtil {
    public static int multiply(int a, int b) {
        return a * b;
    }
}

public class Main {
    public static void main(String[] args) {
        int product = MathUtil.multiply(3, 4);
        System.out.println("Product: " + product); // 出力: Product: 12
    }
}

3. メソッドのオーバーロード

同一クラス内で、メソッド名は同じだが、引数リストが異なる複数のメソッドを定義することができる。
※ 戻り値の型だけが異なる場合はオーバーロードとはならない。

例:

public class Printer {
    public void print(String message) {
        System.out.println(message);
    }

    // 引数の型・数が異なるのでオーバーロード
    public void print(int number) {
        System.out.println(number);
    }
}

4. 戻り値とvoidメソッド

  • 戻り値ありのメソッド:処理結果を返すため、return文を使用する
  • voidメソッド:値を返さず、処理のみ実行する

例:

// 戻り値あり
public String getGreeting(String name) {
    return "Hello, " + name;
}

// voidメソッド
public void printGreeting(String name) {
    System.out.println("Hello, " + name);
}

5. 引数とメソッド内のスコープ

  • 引数はメソッドの呼び出し時に渡され、メソッド内でのみ利用できるローカル変数として扱われる
  • ローカル変数も同様に、宣言されたブロック内でのみ有効

例:

public void displayValue(int value) {
    int doubled = value * 2; // ローカル変数
    System.out.println("Doubled: " + doubled);
}

6. staticメソッドとインスタンスメソッドの違い

  • staticメソッド:クラスに属し、インスタンス生成なしで利用可能
  • インスタンスメソッド:オブジェクトごとに異なる状態(フィールド)にアクセス可能

判断基準
「処理がオブジェクトの状態に依存するか否か」を考える。
→ 状態に依存しなければstatic、依存する場合はインスタンスメソッドとする。


7.まとめ

項目 ポイント
メソッド宣言 アクセス修飾子、戻り値の型、メソッド名、引数リスト、メソッド本体
メソッド呼び出し インスタンスメソッドはオブジェクト経由、staticメソッドはクラス名経由
戻り値とvoid 戻り値あり:return文、void:値を返さず処理のみ実行
オーバーロード 同一クラス内でメソッド名は同じでも、引数リストが異なれば可能
引数のスコープ メソッド内でのみ有効。ローカル変数と同様に扱われる
staticの使いどころ インスタンスに依存しない共通処理、ユーティリティメソッドなど

スコープとは?

「スコープ」とは、プログラム内で変数やメソッドが有効となり、参照できる範囲のことです。

  • ローカル変数のスコープ
    メソッド内やブロック(例えば、if文やfor文の中)で宣言された変数は、そのブロック内でのみ使用可能です。ブロックの外では参照できません。

    public void sampleMethod() {
        int localVar = 10; // この変数はsampleMethod()の中だけで有効
        if (localVar > 5) {
            int blockVar = 20; // この変数はifブロック内だけで有効
            System.out.println(blockVar);
        }
        // System.out.println(blockVar); // コンパイルエラー:blockVarはここでは見えない
    }
    
  • インスタンス変数(フィールド)のスコープ
    クラス内で宣言されたフィールドは、クラス全体(インスタンス全体)で有効です。クラスのどのメソッドからでもアクセスできます。

    public class Sample {
        private int instanceVar = 5; // クラス全体で有効
    
        public void display() {
            System.out.println(instanceVar); // 有効
        }
    }
    
  • クラス変数(staticフィールド)のスコープ
    staticで宣言された変数は、クラスに属し、どのインスタンスからも共有され、クラス内のどこでもアクセスできます。

    public class Sample {
        public static int staticVar = 100;
    
        public static void displayStatic() {
            System.out.println(staticVar); // 有効
        }
    }
    

まとめ

  • ローカル変数は、宣言されたブロック内でのみ有効。
  • フィールドは、クラス全体で有効。
  • static変数は、クラスレベルで共有され、どこからでもアクセス可能です。

この概念は、プログラムの構造を整理し、意図しない変数の参照や上書きを防ぐために非常に重要です。

Discussion