【Java】レッスン5-1:クラスの基礎を理解しよう

ながみえ

一つ前の章ではJavaのコレクションについて学習しました。

今回からはいよいよJavaの神髄「オブジェクト指向」を学習していきます。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:クラス

 ・Lesson5-1:クラスの基本を確認しよう ◁今回はココ
 ・Lesson5-2:コンストラクタを理解しよう
 ・Lesson5-3:カプセル化を理解しよう
 ・Lesson5-4:クラスメンバとインスタンスメンバを理解しよう
 ・Lesson5-5:クラスの継承を理解しよう
 ・Lesson5-6:メソッドのオーバーライドを理解しよう
 ・Lesson5-7:抽象クラスを理解しよう
 ・Lesson5-8:インターフェースを理解しよう
 ・確認問題5-☆1:モンスター捕獲ゲームを作ろう
 ・確認問題5-☆2:モンスターとのバトルゲームを作ろう
 ・確認問題5-☆3:マルバツゲーム(Tic-Tac-Toe)を作成しよう

<<前のページ

学習記事一覧

次のページ>>

クラスとは何か?|役割・定義・インスタンス生成の基本

Javaプログラミングにおいて、クラスはコードを構造的に整理し、再利用しやすくするための基本単位です。

クラスを正しく定義し、そこからインスタンス(実体)を生成することで、現実世界の概念や動作をプログラム上に表現できます。

本記事では、クラスの定義方法やインスタンス生成の手順、クラスとインスタンスの違いを初心者にもわかりやすく解説します。

これを学べば、単なる処理の羅列から一歩進んだ、整理されたオブジェクト指向プログラムが書けるようになるでしょう。

それでは、クラスを使ったプログラミングの基礎を身につけていきましょう。

クラスとは何か?|役割と定義方法

クラス はオブジェクト指向プログラミングにおいて「設計図」の役割を果たします。クラスそのものは何も仕事はしません。

クラスの中には変数などのフィールド(データ)とメソッド(処理)が含まれます。

Javaでクラスを定義する際には classキーワード を使用します。基本的なクラス定義の構文は以下の通りです。

class クラス名 {
    // ここにこのクラスのフィールド(データ)を定義
    // ここにこのクラスのメソッド(処理)を定義
}

たとえば、「名前」と「年齢」というフィールドと、「あいさつ文を表示する」という機能(メソッド)を持つ、Userクラスを定義する例を見てみましょう。

class User {	// Userという名前のクラスを定義
    // フィールド(データ)
    String name;	// 空の変数nameを宣言
    int age;		// 空の変数ageを宣言
    
    // メソッド(処理)
    void sayHello() {	//挨拶を表示するsayHelloメソッドを定義
        System.out.println("Hello, my name is " + name);
    }
}

これでUserクラスの宣言は完了です。

なお、新しいクラスを定義する際には、毎回必ず書いているメインクラスの外に書きましょう。(クラスの中にクラスを書くことはできないため)

クラスのインスタンス生成方法と使い方|コード例付き

クラスの定義ができたら、それを実際に使用するための「インスタンス」を作成します。

インスタンスはクラスを基に作られる「実体」であり、クラスのフィールドやメソッドにアクセスするために使用します。

クラス = データや動作を書いた設計図。クラス自体は動作しない。
インスタンス = クラスから作られる、実際に動作するプログラム。

インスタンスは newキーワード を使用し、「new クラス名()」と記述することで生成されます。

そして生成されたインスタンスは「.(ドット演算子)」を使用することで、その中の変数やメソッドにアクセスすることができます。

class User {            // Userという名前のクラスを定義
    String name;        // 空の変数nameを宣言
    int age;            // 空の変数ageを宣言
    void sayHello() {   // 挨拶を表示するsayHelloメソッドを定義
        System.out.println("Hello, my name is " + name);
    }
}

public class Main {     // メインクラス
    public static void main(String[] args) {    // メインメソッド

        User object = new User(); // Userクラスのインスタンスを生成し、User型の変数objectに代入
      	// これにより、変数objectはUserクラスの実体(オブジェクト)となる

        object.name = "Alice";    // 変数objectの中の変数nameに文字列を代入
        object.age = 30;          // 変数objectの中の変数ageに数値を代入
        object.sayHello();        // 変数objectの中のメソッドを呼び出し
    }
}

このコードではUserクラスのインスタンス:object を作成し、フィールドnameageに値を代入しています。さらにsayHelloメソッドを呼び出してメッセージを表示しています。

Hello, my name is Alice

特に、挨拶分を表示する命令がメインメソッドの中ではたった1行書くだけで実現できている点に着目しましょう。

実はこれまでに使用してきた様々な便利メソッドたちも、このようにメインクラスの外で事前に定義された命令文を呼び出して使用しています。

これがクラスとインスタンスを使用した基本的な方法です。

標準ライブラリのクラスをインスタンス生成して使おう

過去の学習で使用してきたScannerクラスやRandomクラスは、Javaが標準で用意した便利なクラスです。

これらをインポートすることで、その中に書かれたメソッドを使用できるようになります。

以下のコードは レッスン1-5:乱数を生成しよう の中で紹介しているコードです。

今回の記事で学習した知識を活用して、もう一度このコードの内容を見てみましょう。

import java.util.Scanner;	// Scannerクラスのインポート
import java.util.Random;	// Randomクラスのインポート

public class Main {			// メインクラス
    public static void main(String[] args) {

      	// Scannerクラスのインスタンスを生成し、Scanner型の変数scannerに代入
        Scanner scanner = new Scanner(System.in);
      	System.out.print("乱数の上限を入力してください: ");
      	int limit = scanner.nextInt();	// 変数scannerの中のメソッドnextInt()を呼び出し

      	// Randomクラスのインスタンスを生成し、Random型の変数randomに代入
        Random random = new Random();	
        int randomNumber = random.nextInt(limit);	// 変数randomの中のメソッドnextIntを呼び出し
        System.out.println("生成された乱数: " + randomNumber);
    }
}

ここまでではただ暗記して使っていた ScannerRandom ですが、実はどちらもクラスからインスタンスを作り、そのインスタンスが持つメソッドを呼び出していたのです。

ここを理解すると、Java標準ライブラリのあらゆるクラスを同じように使いこなせるようになります。

まとめ|オブジェクト指向の基礎となるクラス活用の第一歩

下の図はこれから学習していくJavaのオブジェクト指向に関わる内容を視覚的に分かりやすくまとめたものです。

この記事では「クラスの定義と使用」と「インスタンス生成」について学びました。

今回の学習では、クラスの役割と定義方法、インスタンス生成の手順、そして標準ライブラリのクラスを活用する方法について学びました。

これにより、自分でクラスを設計し、必要に応じてインスタンスを作成・利用できるようになります。

オブジェクト指向プログラミングの基礎となるこのスキルは、コードの再利用性や拡張性を高めるうえで欠かせません。

ここで得た知識を土台に、さらに複雑で実用的なプログラム作りに挑戦していきましょう。

練習問題|Userクラスで名前と年齢を管理するプログラムを作成しよう

Userというクラスを定義し、その中にユーザーの名前と年齢を管理するフィールドとそれらを設定および表示するメソッドを用意してください。

Mainクラスの中で、Userクラスのインスタンスを生成し、ユーザー情報を設定してから表示させるプログラムを完成させましょう。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. Userクラスを定義し、以下の内容を含むこと。
    • String型のフィールドnameint型のフィールドageを持つこと。
    • 名前と年齢を設定するメソッドsetInfo(String name, int age)を定義し、フィールドnameageに値を代入すること。
    • ユーザー情報を表示するメソッドdisplayInfo()を定義し、nameageの内容を出力すること。
  2. Mainクラスのmainメソッド内で以下を実施すること。
    • Userクラスのインスタンスを作成し、user1という変数に格納すること。
    • setInfoメソッドを使用してuser1nameに「佐藤」、age25を設定すること。
    • displayInfoメソッドを使用してuser1の情報を出力すること。

ただし、以下のような実行結果となること。

名前: 佐藤
年齢: 25

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:Userクラスの定義
  □ nameフィールドの宣言(String型)
  □ ageフィールドの宣言(int型)
  □ setInfoメソッドの定義
  □ □ 引数nameをnameフィールドに代入
  □ □ 引数ageをageフィールドに代入
  □ displayInfoメソッドの定義
  □ □ 「名前: ” + name」を出力
  □ □ 「年齢: ” + age」を出力
2:Mainクラスの定義
  □ mainメソッドの定義
  □ □ Userクラスのインスタンスuser1を作成
  □ □ setInfoメソッドを使ってuser1のnameに「佐藤」、ageに25を設定
  □ □ displayInfoメソッドを使ってuser1の情報を出力

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

// ユーザー情報を表すクラス
class User {
    // 名前と年齢のフィールド
    String name;
    int age;

    /*【穴埋め問題1】
      ここに名前と年齢を設定するためのメソッドを定義し、引数のnameとageをそれぞれ対応するフィールドに代入するコードを書いてください。
    */

    /*【穴埋め問題2】
      ここにユーザー情報を表示するためのメソッドを定義し、nameとageを表示するコードを書いてください。
    */
}

public class Main {
    public static void main(String[] args) {
        // Userクラスのインスタンス(実体)を生成
        User user1 = new User(); // インスタンス user1 作成

        // ユーザーの情報を設定
        /*【穴埋め問題3】
          user1のsetInfoメソッドを使用して、nameに「佐藤」、ageに25を設定するコードを書いてください。
        */

        // ユーザーの情報を表示
        /*【穴埋め問題4】
          user1のdisplayInfoメソッドを呼び出して、情報を出力するコードを書いてください。
        */
    }
}

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

練習問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
// ユーザー情報を表すクラス
class User {
    // 名前と年齢のフィールド
    String name;
    int age;

    // 名前と年齢を設定するメソッド
    void setInfo(String name, int age) {
        this.name = name; // 引数のnameをフィールドnameに設定
        this.age = age;   // 引数のageをフィールドageに設定
    }

    // ユーザー情報を表示するメソッド
    void displayInfo() {
        System.out.println("名前: " + name);
        System.out.println("年齢: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        // Userクラスのインスタンス(実体)を生成
        User user1 = new User(); // インスタンス user1 作成

        // ユーザーの情報を設定
        user1.setInfo("佐藤", 25); // メソッドを使用して情報を設定

        // ユーザーの情報を表示
        user1.displayInfo(); // メソッドを使用して情報を出力
    }
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

クラスUserの定義

class User {
    String name;
    int age;

この部分ではUserというクラスを定義しています。

クラスはオブジェクト指向プログラミングにおける「設計図」のようなもので、この設計図に基づいて複数のインスタンス(実体)を作成できます。

Userクラスにはnameageという二つのフィールドが定義されており、それぞれユーザーの名前と年齢を保存する役割を果たします。

setInfoメソッド

void setInfo(String name, int age) {
    this.name = name;
    this.age = age;
}

setInfoはユーザーの名前と年齢を設定するメソッドです。

メソッド内のthisはクラスのフィールド(nameage)を指し、外部から渡された引数(nameage)をクラス内部のフィールドに代入しています。

これによりインスタンスごとに異なるユーザー情報を設定することができます。

displayInfoメソッド

void displayInfo() {
    System.out.println("名前: " + name);
    System.out.println("年齢: " + age);
}

displayInfoメソッドはユーザーの情報を表示するためのメソッドです。

System.out.printlnを使ってnameageの内容を出力します。

クラスMainの定義

public class Main {
    public static void main(String[] args) {

MainクラスはJavaプログラムのエントリーポイント(開始地点)です。

mainメソッドはプログラムが実行されたときに最初に動作する部分であり、ここからUserクラスを使用してユーザー情報の設定や表示を行います。

インスタンスの生成とsetInfoメソッドの呼び出し

User user1 = new User();
user1.setInfo("佐藤", 25);

Userクラスのインスタンスをnew User()で作成し、変数user1に代入しています。

このようにしてUserクラスを具体的なオブジェクト(インスタンス)として使用することができます。

その後setInfoメソッドを呼び出し、名前と年齢をそれぞれ「佐藤」と25に設定しています。

これによりuser1というインスタンスにユーザー情報が登録されます。

displayInfoメソッドの呼び出し

user1.displayInfo();

displayInfoメソッドを呼び出すことで設定されたユーザー情報を表示します。

このコードが実行されるとユーザーの名前と年齢がコンソールに出力され、設定した情報が正しく反映されていることが確認できます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいJava学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました