広告

手を動かして学ぶ Java入門 (クラスの超基本)

環境構築不要! ブラウザから直接コードを実行できます。
本記事では、Java のクラスの基本の基本、はじめの一歩のところを学びます。

15分くらいで、さくっと終わる記事をめざしています。
(今回はいつもより少し長めです)


シリーズ一覧

続きは近日公開予定!

はじめに

この記事は paiza.IO の「Online Java compiler」を利用しています。
2024/10/7 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)

実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。

詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。

概要

オブジェクト指向プログラミングにおけるクラス(英: class)[注釈 1]は、オブジェクトを生成するための設計図あるいはひな形に相当するものである。抽象データ型の一つ。クラスから生成したオブジェクトの実体のことをインスタンスという。

クラスはとても奥が深く、そして難しい概念です。
熟練のプログラマでも、クラス設計にはいつも頭を悩ませている…と思います。

クラスと切っても切れない関係なのが オブジェクト指向 です。
ちなみに、Java は オブジェクト指向プログラミング 言語です。

ただ、オブジェクト指向の考え方は、プログラム入門者には敷居が高いといえます。
よって、本記事ではオブジェクト指向については解説しません。

とにかく、クラスの 具体的 なことを中心に解説します。
クラスのことが分かってきたら、ぜひオブジェクト指向についても学んでみましょう。

クラスとは

クラスイメージ図

クラスとは、具体的に いうと…

  • フィールド (変数)
  • メソッド (関数)

この2つが集まったものです。

フィールド(変数) は、数値などを保存しておく箱のようなものです。
変数については 以前の記事 でも学びましたね。

例えば 変数 a の宣言と初期化は、

int a = 123;

こんな感じで書きます。

メソッド(関数) は、プログラムの実際の処理を書きます。
足し算や引き算などの計算をしたり、その結果を画面に出力したり、などなどです。

例えば print というメソッドは、

void print() {
    System.out.println("a = " + a);
}

こんな感じで書きます。

さて、先ほどの変数(a) とメソッド(print) を持つクラスを作ってみましょう。
クラスの名前は Sample とします。

public class Sample {

    private int a = 123;

    public void print() {
        System.out.println("a = " + a);
    }
}

これが Sample クラスになります。

なんだか、フィールドやメソッドのところに

  • public
  • private

といったキーワードがついていますが、今はお気になさらず…

それでは、さっそくこのクラスを動かしてみましょう。
コードは変更せずに、そのまま「実行(Ctrl-Enter)」ボタンを押してください。

注意:コードは2ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

いかがでしたでしょうか? 「出力」のところに

a = 123

と表示されたら成功です。

コードの解説

今回はクラスの 超基本 の記事ということで、かなりざっくりと解説していきます。
とにかく、クラスの雰囲気を感じていただけたらな、と思っています。

【Sampleクラスの宣言】(Sample.java)

public class Sample {

    private int a = 123;

    public void print() {
        System.out.println("a = " + a);
    }
}

【Sampleクラスを使う】(Main.java)

Sample sample = new Sample();
sample.print();

アクセス修飾子

Sample クラスには、3か所 public または private というキーワードが使われています。

アクセス修飾子の図

これらは、

  • アクセス修飾子

といいます。
ただし、今回の記事ではアクセス修飾子については解説しません。

とりあえず、

  • クラス → public
  • フィールド → private
  • メソッド → public

と決め打ちしていただいて OK です。
(本当に簡単にいうと、public は外部に公開する、private は外部に公開しない、という意味になります)

クラスの宣言

次はクラスの宣言を見ていきましょう。

public class Sample {
       ^^^^^ <--- クラス宣言のためのキーワード
}

class は、クラスを宣言しますよ、というキーワードです。
このキーワードがないとクラス宣言ができません。

次に好きなクラスの名前をつけます。

public class Sample {
             ^^^^^^ <--- 任意のクラス名
}

今回は Sample と名づけました。

最後に、カッコ { ... } で囲みます。

public class Sample {
                    ^ <--- クラスの開始
}
^ <--- クラスの終了

このカッコで囲まれた範囲がクラスの中身になります。

メソッド

メソッド (method) あるいは メンバー関数 (-かんすう, member function) とはオブジェクト指向プログラミング言語において、あるクラスまたはオブジェクトに所属するサブルーチンを指す。

メソッドとは、プログラムの実際の処理をまとめたものです。
例えば、足し算や引き算などの計算をしたり、その結果を画面に出力したり、などなどです。

Java 以外の言語ではメンバ関数と呼ぶこともあります。

public class Sample {
    ...

    public void print() {
           ^^^^^^^^^^^^ <--- メソッドの宣言!
        ...
    }
}

メソッドは、

  1. 戻り値の型
  2. メソッド名
  3. ( パラメータ )
  4. { メソッド本体 }

の順番で宣言します。

public void print() {
       ^^^^ <--- 戻り値の型
    ...
}

void とは「戻り値がない」ことを宣言します。
(戻り値については、今回は説明を割愛します)

public void print() {
            ^^^^^ <--- 任意のメソッド名
    ...
}

メソッド名には好きな名前がつけられます。
今回は print という名前にしました。

public void print() {
                 ^^ <--- パラメータ
    ...
}

今回、パラメータは必要ないので ( ) の中身は空にしています。
(パラメータについては、今回は説明を割愛します)

最後に、カッコ { ... } で囲みます。

public void print() {
                    ^ <--- メソッドの開始
    ...
}
^ <--- メソッドの終了

このカッコで囲まれた範囲がメソッドの本体になります。

フィールド

オブジェクト指向プログラミングでは、フィールドはクラスや構造体などに直接宣言される任意の型の変数であり[3]、オブジェクト内にカプセル化されたデータである。

フィールドとは、クラスが持つ変数のことです。
Java 以外の言語ではメンバ変数と呼ばれることもあります。

フィールドは、以前の記事 で解説した変数と同じように宣言できます。

public class Sample {
    private int a = 123;
            ^^^^^^^^^^^^ <--- フィールドの宣言!
    ...
}

宣言したフィールドは、メソッドから自由に使うことができます。

public class Sample {
    ...

    public void print() {
        System.out.println("a = " + a);
                                    ^ <--- フィールドを使う!
    }
}

クラスの使い方

オブジェクト指向言語においては、多くの場合クラスと呼ばれるものを元に作成したオブジェクトの実体を指す。

さて、クラスの宣言は終わりました。
しかし、宣言しただけではまだ使えていません。

new 演算子を使って、オブジェクトとして生成する必要があります。
このオブジェクトのことを インスタンス とも呼びます。

それでは先ほどの Sample クラスのインスタンスを作成してみます。
整数の変数宣言と比べてみましょう。

// 整数の例
int x = 123;

// クラスの例
Sample sample = new Sample();

クラスの場合は、new 演算子を使うのがポイントですね。
new 演算子の次にクラス名である Sample が続き、最後にカッコ ( ) となります。

Sample sample = new Sample();
^^^^^^ <--- インスタンスの型
Sample sample = new Sample();
       ^^^^^^ <--- 任意のインスタンス変数名
Sample sample = new Sample();
                ^^^ <--- new演算子
Sample sample = new Sample();
                    ^^^^^^ <--- クラス名
Sample sample = new Sample();
                          ^^ <--- カッコ

これで、sample という名前のインスタンスが作成できました。
このインスタンスを使って、Sampleクラスにアクセスすることになります。

Sample クラスには print メソッドがあるので、それを呼び出してみましょう。
メソッドの呼び出し方は、

  • インスタンス + ピリオド(.) + メソッド名 + ( )

となります。

sample.print();
^^^^^^ <--- インスタンス
sample.print();
      ^ <--- ピリオド
sample.print();
       ^^^^^ <--- メソッド名
sample.print();
            ^^ <--- カッコ

これで sample インスタンスの print メソッドを呼び出すことができました。

print メソッドが呼び出されたので…

public class Sample {
    ...

    public void print() {
        System.out.println("a = " + a); <--- ★ここが実行される!
    }
}

結果として、画面に変数 a が出力されるわけですね。


応用問題

【問題】

まずは、下記のプログラムをそのまま「実行(Ctrl-Enter)」してみましょう。
「出力」には

a = 0
a = 0

と表示されたはずです。

この表示を、Sample クラスの increment メソッドを呼び出すことにより、

a = 1
a = 2

になるようにしてください。
ちなみに increment は、「1を足す」という意味になります。

ポイントは、

  • クラスのフィールド(変数) は、インスタンス毎に別で管理される

ということです。

追記するコードは、

  • // ↓ ここから
  • // ↑ ここまで

というコメントの間に書いてください。

// ↓ ここから 

★ここにコードを追記!

// ↑ ここまで

それでは、指定の場所にコードを書き加えて「実行(Ctrl-Enter)」してみましょう。

注意:コードは2ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

無事に、

a = 1
a = 2

と出力されましたでしょうか?

もし解けなかった場合は、下記の回答例をご参照ください。

回答例

【コード】

public class Main {
    public static void main(String[] args) {
        
        Sample sample1 = new Sample();
        Sample sample2 = new Sample();

        // ↓ ここから

        sample1.increment();
        sample2.increment();
        sample2.increment();

        // ↑ ここまで

        sample1.print();
        sample2.print();
    }
}

【出力】

a = 1
a = 2

まとめ

Java言語でプログラミングするには、クラスは必須となります。
とはいえ、クラスはとても奥が深く、そして難しい概念です。

プログラム入門者にとって1つの壁といえるでしょう。
いろいろと新しい用語も出てくるので大変です。

いきなり全部を理解しようとせずに、できる範囲で少しずつ理解していくのがよいのかな…と思います。

それでは次回もお楽しみに!


関連記事

ページの先頭へ