[備忘録 その９] Java Silver ～クラス定義・オブジェクトの使用 その１～

# クラス
クラスは、オブジェクト指向プログラミングにおける基本的な構造です。クラスは、オブジェクトの設計図やテンプレートとして機能し、フィールド(データ)とメソッド(操作)を定義します。クラスは、オブジェクトの属性と動作を記述すための青写真を提供します。

#### クラスの例
```java
public class Car {
    // フィールド
    private String color;
    private int speed;

    // コンストラクタ
    public Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
    }

    // メソッド
    public void accelerate(int increment) {
        this.speed += increment;
    }

    public void brake(int decrement) {
        this.speed -= decrement;
    }

    public String getColor() {
        return color;
    }

    public int getSpeed() {
        return speed;
    }
}

```

## クラスの定義
クラスの定義は、クラス宣言、フィールド、メソッド、コンストラクタ、およびその他の要素で構成されます。

#### クラスの基本構造
```java
public class ClassName {
    // フィールド（メンバ変数）
    private int field1;
    private String field2;

    // コンストラクタ
    public ClassName(int field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    // メソッド
    public int getField1() {
        return field1;
    }

    public void setField1(int field1) {
        this.field1 = field1;
    }

    public String getField2() {
        return field2;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }
}

```
### クラスの各要素
##### 1\. クラス宣言 
```java
public class ClassName {
```
* 'public'：アクセス修飾子で、この食らうがほかのパッケージからもアクセス可能であることを示します。
* 'class'：これはクラスを定義するためのキーワードです。
* 'className'：クラスの名前です。Javaでは、クラス名は大文字で始めるのが一般的です。

##### 2\. フィールド(メンバ変数)
```java
private int field1;
private String field2;
```
* 'private'：アクセス修飾子で、このフィールドがクラス外から直接アクセスできないことを示します。
* 'int field1'：データ型'int'のフィールド'field1'を定義しています。
* 'String field2'：データ型'String'のフィールド'field2'を定義しています。

##### 3\. コンストラクタ
```java
public ClassName(int field1, String field2) {
    this.field1 = field1;
    this.field2 = field2;
}
```
* コンストラクタはクラス名と同じ名前を持ち、オブジェクトの初期化を行います。
* 'this.field1 = field1;'は、引数'field1'の値をインスタンス変数'field1'に代入します。
* 'public'：コンストラクタがパブリックであることを示します。つまり、どこからでもこのクラスのインスタンスを作成できます。 

##### 4\. メソッド
```java
public int getField1() {
    return field1;
}

public void setField1(int field1) {
    this.field1 = field1;
}

public String getField2() {
    return field2;
}

public void setField2(String field2) {
    this.field2 = field2;
}
```
* メソッドはクラスが持つ操作や機能を定義します。
* 'public int getField1()'：戻り値の型が'int'の'getField1'というパブリックメソッドを定義しています。これは'field1'の値を返します。
* 'public void setField1(int field1)'：戻り値の型が'void'の'setField1'というパブリックメソッドを定義しています。これは引数'field1'の値をインスタンス変数'field1'に代入します 

### クラスの各要素
* 'public'：どこからでもアクセス可能です。
* 'private'：同じクラス内からのみアクセス可能です。
* 'protected'：同じパッケージ内またはサブクラスからのアクセス可能です。
* (デフォルト、指定なし)：同じパッケージ内からのみアクセス可能です。

#### クラス定義の例
```java
public class Car {
    // フィールド
    private String color;
    private int speed;

    // コンストラクタ
    public Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
    }

    // メソッド
    public void accelerate(int increment) {
        this.speed += increment;
    }

    public void brake(int decrement) {
        this.speed -= decrement;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
}

```

## インスタンス変数とstatic変数
### インスタンス変数
インスタンス変数(メンバ変数とも呼ばれる)は、クラスのインスタンス(オブジェクト)ごとに異なる値を持つ変数です。各オブジェクトは独自のインスタンス変数のコピーを持ち、それぞれのオブジェクトで異なる状態を保持できます。
#### 特徴：
* クラスのインスタンスが生成されるたびに、インスタンス変数がメモリに確保されます。
* 各インスタンスの独自のインスタンス変数を持ち、他のインスタンスのインスタンス変数とは独立しています。
* 通常、クラス内で'private'アクセス修飾子を使用して宣言されます。
*
##### 例
```java
public class Car {
    // インスタンス変数
    private String color;
    private int speed;

    // コンストラクタ
    public Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
    }

    // インスタンスメソッド
    public void accelerate(int increment) {
        this.speed += increment;
    }

    public String getColor() {
        return color;
    }

    public int getSpeed() {
        return speed;
    }
}
```

### static変数
static変数(クラス変数とも呼ばれる)は、クラス全体で共有される変数です。static変数はクラスがロードされるときに一度だけメモリに確保され、すべてのインスタンスが同じ値を共有します。
#### 特徴
* クラスレベルで宣言され、クラスがロードされるときに初期化されます。
* クラス全体で共有されるため、すべてのインスタンスで同じ値を持ちます。
* クラス名を通じて直接アクセスすることができます。
* 通常、'static'キーワードを使用して宣言されます。
#### 例
```java
public class Car {
    // インスタンス変数
    private String color;
    private int speed;

    // static変数
    private static int totalCars = 0;

    // コンストラクタ
    public Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
        totalCars++;
    }

    // インスタンスメソッド
    public void accelerate(int increment) {
        this.speed += increment;
    }

    public String getColor() {
        return color;
    }

    public int getSpeed() {
        return speed;
    }

    // staticメソッド
    public static int getTotalCars() {
        return totalCars;
    }
}
```
### 使用例
#### インスタンス変数の使用例：
```java
Car car1 = new Car("Red", 0);
Car car2 = new Car("Blue", 0);

car1.accelerate(50);
System.out.println(car1.getSpeed()); // 出力: 50
System.out.println(car2.getSpeed()); // 出力: 0
```
#### static変数の使用例：
```java
Car car1 = new Car("Red", 0);
Car car2 = new Car("Blue", 0);

System.out.println(Car.getTotalCars()); // 出力: 2
```

## 戻り値
戻り値とは、メソッドが処理を終えた後に呼び出し元に返す値のことです。
戻り値はメソッドの結果を呼び出し元に提供し、プログラムの他の部分でその結果を利用できるようにします。
### 戻り値の基本
メソッドには戻り値がある場合とない場合があります。戻り値があるメソッドは'return'キーワードを使用して値を返します。
#### 戻り値のあるメソッド
戻り値のあるメソッドは、宣言時に戻り値の型を指定します。戻り値の型は、メソッド名の前に書きます。
```java
public class Calculator {
    // 戻り値がint型のメソッド
    public int add(int a, int b) {
        return a + b;
    }
    
    // 戻り値がdouble型のメソッド
    public double divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Division by zero");
        }
        return (double) a / b;
    }
}
```
#### 戻り値のないメソッド
戻り値のないメソッドは'void'という戻り値の型を指定します。この場合、メソッドは'return'キーワードを使って値を返しません。
```java
public class Printer {
    // 戻り値がない（void型の）メソッド
    public void printMessage(String message) {
        System.out.println(message);
    }
}
```
### 戻り値の利用
戻り値の持つメソッドを呼び出すと、その戻り値の受け取ってさらに処理を行うことができます。
```java
public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        
        // 戻り値を変数に格納
        int sum = calculator.add(10, 5);
        System.out.println("Sum: " + sum); // 出力: Sum: 15
        
        // 戻り値を直接利用
        System.out.println("Division: " + calculator.divide(10, 2)); // 出力: Division: 5.0
        
        Printer printer = new Printer();
        printer.printMessage("Hello, World!"); // 出力: Hello, World!
    }
}
```

## メソッド
メソッドは、プログラミングにおいて特定の処理や動作を実行するための手段です。

1 \. __再利用性とモジュール性__：メソッドは同じ処理を複数回実行したり、複数の場所で使いまわすことができます。これにより、コードの重複を避けることができます。

2 \.__パラメータ__：メソッドは、外部から情報を受け取るためのパラメータを受けるとることができます。これにより、メソッドが実行される際に異なるデータを処理することが可能です。

3 \.__戻り値__：メソッドは処理の結果として値を返すことができます。戻り値を使うことで、メソッドの呼び出しもとでその結果を利用したり、他の処理を渡したりすることができます。

4 \.__カプセル化__：メソッドは関連する処理をひとまとまりにし、その内部の実装を隠蔽することができます。これにより、他の部分からその詳細を気にせずに利用することができます。

### メソッドの定義
メソッド名前、パラメータ、処理内容、戻り値の型などを指定して、メソッドを作成することです。

1 \. __アクセス修飾子(任意)__：メソッドのアクセス範囲を指定します。一般的な修飾子には'public''protected''private'があります。

2 \. __戻り値の型__：メソッドが返す値のデータ型を指定します。戻り値のない場合は'void'を使います。

3 \.__メソッド名__：メソッドの名前を指定します。これはメソッドを呼び出す際に使用します。

4 \.__パラメータリスト__：メソッドが受け取る引数を指定します。各引数にはデータ型と名前を付けます。

5\ .__メソッド本体__：中括弧'{}'で囲まれたブロックで、メソッドの処理内容を記述します。

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

## インスタンス化
クラスからオブジェクト(インスタンス)を作成すいることを指します。クラスはオブジェクトの設計図であり、その設計図を基にして実際のデータやメソッド持つ具体的なオブジェクトを生成するプロセスがインスタンス化です。

### インスタンス化の手順
1 \.__クラスの宣言__：オブジェクトの設計図となるクラスを定義します。クラスにはフィールド(属性)やメソッド(機能)が含まれます。

2 \.__インスタンス化__：'new'キーワードを使って、クラスのインスタンスを作成します。この時に、クラスのコンストラクタが呼び出され、インスタンスの初期化が行われます。

3 \.__インスタンスの利用__：作成したインスタンスを通じて、クラスのメソッドを呼び出したり、フィールドにアクセスしまう。

##### 例
```java
public class Car {
    // フィールド
    private String color;
    private int speed;

    // コンストラクタ
    public Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
    }

    // メソッド
    public void drive() {
        System.out.println("The car is driving at " + speed + " km/h.");
    }
}

public class Main {
    public static void main(String[] args) {
        // Carクラスのインスタンス化
        Car myCar = new Car("red", 100);

        // インスタンスのメソッド呼び出し
        myCar.drive();
    }
}
```

## 変巣のスコープ
プログラム内で変数が有効(アクセス可能)な範囲のことを指します。変数のスコープ、変数がどこで宣言されたかによって決まります。
### 1\.ローカル変数
#### スコープ：メソッド内、ブロック内
+ __特徴__：メソッドやブロック(if文やfor文)の内部で宣言された変数です。そのメソッドやブロックの外ではアクセスできません。
+ ※ローカル変数は明示的な初期化が必要。
+ __寿命__：そのメソッドやブロックが実行されている間だけ有効で、実行が終了するメモリから解放されます。  
```java
public void exampleMethod() {
    int localVar = 5; // ローカル変数
    System.out.println(localVar); // 有効
}
// localVar はここでは無効
```


### 2\.インスタンス変数(フィールド)
#### スコープ：クラス内
+ __特徴__：クラス内で宣言された変数で、クラスのインスタンス(オブジェクト)に属します。インスタンスの属性としてアクセスされます。
※初期化が未代入でもデフォルト値で初期化されます。
+ __寿命__：クラスのインスタンスが存在する限り有効です。
```java
public class Example {
    private int instanceVar; // インスタンス変数

    public Example(int value) {
        this.instanceVar = value;
    }

    public void display() {
        System.out.println(instanceVar); // インスタンス変数にアクセス
    }
}
```

### 3\.クラス変数(静的変数)
#### スコープ：クラス全体
+ __特徴__：'static'キーワードで定義された変数で、クラスそのものに属します。すべてのインスタンスで共有され、クラス名でアクセスできます。
+ __寿命__：プログラムが実行が終了するまで有効です。

```java
public class Example {
    private static int staticVar; // クラス変数

    public static void increment() {
        staticVar++;
    }

    public static void show() {
        System.out.println(staticVar);
    }
}
```

最初のページ
[[備忘録 その１] Java Silver ～Javaプログラミング基礎～](https://qiita.com/MagicShowTime/items/9fcf3a2cb4a7162aafcf "[備忘録 その１] Java Silver ～Javaプログラミング基礎～")

前のページ
[[備忘録 その８] Java Silver ～制御文～](https://qiita.com/MagicShowTime/items/4e98cb55e87555045cf8 "[備忘録 その８] Java Silver ～制御文～")

次のページ
[[備忘録 その１０] Java Silver ～クラス定義・オブジェクトの使用 その２～](https://qiita.com/MagicShowTime/items/af25e023f959cc2ded52 "[備忘録 その１０] Java Silver ～クラス定義・オブジェクトの使用 その２～")