Java入門 STEP9|クラスとオブジェクトを使ってみよう

karin@taishi@felmia

オブジェクト指向とは?

ここまでのSTEPでは、変数や条件分岐、繰り返し処理、メソッドなど、Javaプログラムを書くための基本を学んできました。

ここからは、それらを使ってプログラムをどのように組み立てていくのかについても学んでいきます。

Javaでは、関連するデータや処理を「オブジェクト」という単位でまとめ、それらを組み合わせながらプログラムを作っていく考え方がよく使われます。

このような考え方を「オブジェクト指向」と呼びます。

例えば、学生を管理するプログラムを考えてみましょう。

学生には、

  • 名前
  • 点数

といった情報があります。

さらに、

  • 自己紹介する
  • 点数を表示する

といった処理も考えられます。

これらをバラバラに扱うのではなく、「学生」という1つのまとまりとして扱おうと考えるのが、オブジェクト指向を理解する最初の一歩です。

オブジェクト指向を最初から難しく考えなくてOK

オブジェクト指向には、このあと学んでいくさまざまな仕組みや考え方があります。

この時点ですべてを理解する必要はありません。

まずは、

「関連するデータや処理を、1つのまとまりとして扱う」

というイメージを持っておきましょう。

実際にコードを書きながら、少しずつ理解していけば大丈夫です。

ルミィ
ルミィ

「オブジェクト指向」って名前だけ聞くと難しそうだけど、まずは「関係するものをまとめて考える」くらいから始めよう♪

クラスとオブジェクトとは?

では、オブジェクト指向を理解するために重要な「クラス」と「オブジェクト」について見ていきましょう。

少し難しそうな言葉ですが、まずは身近なものに置き換えて考えてみます。

例えば、「学生」の情報をプログラムで扱うとします。

学生には、

  • 名前
  • 点数

などの情報があります。

さらに、

  • 自己紹介する
  • 点数を表示する

といった処理を持たせることもできます。

Javaでは、このような「どんな情報を持っていて、どんな処理ができるのか」をまとめて定義するためにクラスを使います。

クラスは設計図

最初は、クラスを「設計図」と考えてみましょう。

例えば、「学生」という設計図を作ったとします。

Studentクラス
名前を持っている
点数を持っている
自己紹介できる
点数を表示できる

ただし、設計図を作っただけでは、実際の学生をプログラムで使うことはできません。

そこで、クラスをもとに実際に使えるものを作ります。

それが「オブジェクト」です。

クラスとオブジェクト

クラス
→ どんな情報や処理を持つのかを決めた設計図

オブジェクト
→ クラスという設計図をもとに作られた実際に使えるもの

例えば、Studentクラスから、

「Lumy・80点の学生」

「Java・90点の学生」

のように、異なる情報を持ったオブジェクトを作ることができます。

Studentクラスを作ってみよう

それでは実際にクラスを作ってみましょう。

今回は、これまでのようなサンプル用クラスとは少し違います。

新しくStudentクラスを作成してください。

そして、次のように記述します。

public class Student {

    String name;
    int score;

}

今回はmainメソッドがありません。

Studentクラスは、プログラムを開始するためのクラスではなく、学生を表すためのクラスとして作っているからです。

Studentクラスにはmainメソッドがない

これまで作ってきたサンプルクラスには、

public static void main(String[] args)

がありました。

Javaプログラムを実行するときは、このmainメソッドがプログラムを開始する場所になります。

今回作ったStudentクラスにはmainメソッドがありません。

そのため、これまでのサンプルクラスと同じように、Studentクラス単体を実行して動作を確認することはできません。

Studentクラスは、学生の情報や処理をまとめるために作ったクラスです。

このあと、mainメソッドを持つ別のクラスからStudentを使ってみます。

Studentには、

String name;

int score;

という2つの変数があります。

クラスが持っているこのような変数を「フィールド」と呼びます。

フィールドとは?

フィールドは、オブジェクトが持つ情報を保存するために使います。

今回のStudentでは、

name → 学生の名前

score → 学生の点数

を保存します。

これまでメソッドの中で作ってきた変数とは、使われる場所や役割が違います。

ルミィ
ルミィ

今回はmainがないクラスが出てきたね!
Studentは「実行するため」じゃなくて、「学生を表すため」のクラスなんだよ♪

オブジェクトを作ってみよう

先ほど、学生を表すStudentクラスを作りました。

しかし、クラスを作っただけでは、まだ実際の学生の情報を扱っているわけではありません。

Studentクラスをもとに、実際に使用するオブジェクトを作ってみましょう。

新しくStudentSampleクラスを作成してください。

作成できたら、次のコードを入力します。

public class StudentSample {

    public static void main(String[] args) {
        Student student = new Student();

        student.name = "Lumy";
        student.score = 80;

        System.out.println(student.name);
        System.out.println(student.score);
    }

}

実行結果

Lumy
80

今回は、

Student student = new Student();

という新しい書き方が登場しました。

少し長く見えるので、順番に確認してみましょう。

Studentは何を表している?

最初の、

Student

は、先ほど自分で作ったStudentクラスを表しています。

これまで、

int age

String name

のように、変数の前にはデータ型を書いていました。

今回は、

Student student

とすることで、Student型のオブジェクトを扱うための変数studentを用意しています。

Javaでは、intStringだけでなく、自分で作ったクラスも型として使うことができます。

new Student()とは?

次の、

new Student()

では、Studentクラスをもとに新しいStudentオブジェクトを作っています。

newは、クラスから新しいオブジェクトを作るときに使用します。

そのため、

Student student = new Student();

は、今の段階では、

「Studentクラスからオブジェクトを1つ作って、studentから使えるようにしている」

と考えておけば大丈夫です。

クラスからオブジェクトを作る

Student
→ Studentというクラス(設計図)

new Student()
→ Studentクラスから新しいオブジェクトを作る

student
→ 作ったオブジェクトを使うための変数

まずは、この3つを分けて考えてみましょう。

オブジェクトのフィールドを使ってみよう

作成したオブジェクトのフィールドを使うときは、.(ドット)を使います。

今回の、

student.name = "Lumy";

では、studentが持っているname"Lumy"を代入しています。

同じように、

student.score = 80;

では、studentが持っているscore80を代入しています。

書き方意味
student.namestudentのname
student.scorestudentのscore
student.name = "Lumy"studentのnameにLumyを代入
student.score = 80studentのscoreに80を代入

値を取り出す場合も同じです。

System.out.println(student.name);

とすれば、studentnameに入っている値を表示できます。

ルミィ
ルミィ

student.nameは「studentのname」って読むと分かりやすいよ♪
.は、そのオブジェクトが持っているものを使うときに登場するんだね!

クラスにメソッドを作ってみよう

ここまでのStudentクラスには、

name

score

という2つのフィールドを作りました。

クラスには、フィールドだけでなくメソッドを持たせることもできます。

今回は、学生が自分の名前と点数を表示するintroduceメソッドを作ってみましょう。

先ほど作ったStudentクラスを、次のように変更してください。

public class Student {

    String name;
    int score;

    public void introduce() {
        System.out.println("名前:" + name);
        System.out.println("点数:" + score);
    }

}

新しく、

public void introduce()

というメソッドを追加しました。

メソッドの中では、

name

score

というフィールドを使っています。

この2つは同じStudentクラスが持っているフィールドなので、introduceメソッドから使用できます。

オブジェクトからメソッドを呼び出してみよう

次に、先ほど作ったStudentSampleクラスを変更します。

public class StudentSample {

    public static void main(String[] args) {
        Student student = new Student();

        student.name = "Lumy";
        student.score = 80;

        student.introduce();
    }

}

実行結果

名前:Lumy
点数:80

これまで、

student.name

のように.を使ってフィールドを使用しました。

メソッドも同じように、

student.introduce();

と書くことで呼び出すことができます。

オブジェクトが持っているものを「.」で使う

今回のstudentは、

name → 名前を保存する

score → 点数を保存する

introduce() → 名前と点数を表示する

という情報と処理を持っています。

そのため、

student.name

student.score

student.introduce()

のように、.を使ってアクセスできます。

オブジェクトをもう1つ作ってみよう

クラスという設計図から作れるオブジェクトは1つだけではありません。

同じStudentクラスから、複数のStudentオブジェクトを作ることができます。

StudentSampleクラスを次のように変更してみましょう。

public class StudentSample {

    public static void main(String[] args) {
        Student student1 = new Student();
        student1.name = "Lumy";
        student1.score = 80;

        Student student2 = new Student();
        student2.name = "Java";
        student2.score = 90;

        student1.introduce();
        student2.introduce();
    }

}

実行結果

名前:Lumy
点数:80
名前:Java
点数:90

student1student2は、どちらも同じStudentクラスから作られています。

しかし、それぞれ別のオブジェクトなので、異なる名前や点数を持つことができます。

1つのクラスから複数のオブジェクトを作れる

Studentクラス
→ 学生を作るための設計図

student1
→ Lumy・80点

student2
→ Java・90点

同じ設計図から作っても、それぞれのオブジェクトは別々の情報を持つことができます。

これが、クラスを使う大きな特徴のひとつです。

ルミィ
ルミィ

同じStudentクラスから作っても、student1とstudent2は別の学生なんだね♪
設計図は1つでも、そこからいくつもオブジェクトを作れるよ!

staticがあるメソッドとないメソッド

ここまでのコードを見ると、少し違いがあることに気づいたかもしれません。

mainメソッドには、

static

があります。

一方、先ほどStudentクラスに作ったintroduceメソッドには、staticがありません。

public static void main(String[] args) {
}
public void introduce() {
}

この違いを簡単に確認しておきましょう。

staticがないメソッド

introduceメソッドは、Studentオブジェクトが持っているメソッドです。

そのため、呼び出すときは、

student.introduce();

のように、Studentオブジェクトを作ってから呼び出します。

student1student2があれば、

student1.introduce();

student2.introduce();

のように、それぞれのオブジェクトから呼び出すことができます。

そして、それぞれが持っているnamescoreを使って処理できます。

staticがあるメソッド

staticが付いているメソッドは、オブジェクトを作らなくてもクラスから使用できるメソッドです。

例えば、STEP7では次のようなメソッドを作りました。

public static void hello() {
    System.out.println("こんにちは!");
}

このときはmainメソッドから、

hello();

と呼び出していました。

同じクラスのstaticメソッド同士だったため、オブジェクトを作らずに呼び出すことができました。

今はこの違いを覚えておこう

staticなし
→ オブジェクトが持つメソッド
student.introduce()のようにオブジェクトから呼び出す

staticあり
→ クラスに属するメソッド
→ オブジェクトを作らなくても使用できる

今の段階では、まずこの違いが分かれば大丈夫です。

なぜintroduceにはstaticを付けないの?

今回のintroduceメソッドでは、

name

score

というそれぞれのStudentオブジェクトが持っている情報を使います。

例えば、

student1 → Lumy・80点

student2 → Java・90点

というように、それぞれ違う情報を持っていました。

student1.introduce();

ならstudent1の情報を、

student2.introduce();

ならstudent2の情報を使って自己紹介します。

そのため、今回のintroduceStudentオブジェクトに対する処理として作っています。

ルミィ
ルミィ

student.introduce()は、「このstudentに自己紹介してもらう」って考えると分かりやすいよ♪

staticは全部理解しなくても大丈夫

staticには、もう少し詳しいルールがあります。

ただし、ここですべて覚えようとすると、クラスやオブジェクトの理解が難しくなってしまいます。

まずは、

オブジェクトごとの情報や処理 → staticなし

オブジェクトを作らなくても使えるもの → staticあり

という基本的な違いを押さえておきましょう。

よくある間違い

クラスとオブジェクトでは、これまでとは違う書き方が多く登場しました。

うまく動かないときは、次のポイントを確認してみましょう。

オブジェクトを作る前に使おうとしている

Studentクラスを作っただけでは、studentというオブジェクトが自動的に作られるわけではありません。

まず、

new Student()

を使ってStudentオブジェクトを作ります。

Student student = new Student();

そのあと、

student.name = "Lumy";
student.score = 80;
student.introduce();

のように、作成したオブジェクトを使います。

クラスを作ることと、オブジェクトを作ることは別

public class Student
→ Studentというクラスを作る

new Student()
→ Studentクラスからオブジェクトを作る

クラスを作っただけで、Studentオブジェクトが自動的に作られるわけではありません。

student1とstudent2を混同する

次の2つは、同じStudentクラスから作られています。

Student student1 = new Student();
Student student2 = new Student();

しかし、student1student2別々のオブジェクトです。

そのため、

student1.name = "Lumy";

と書いても、student2.name"Lumy"になるわけではありません。

どのオブジェクトの情報を使っているのか、.の前にある変数を確認しましょう。

フィールドとローカル変数を混同する

STEP7では、メソッドの中で作った変数には使える範囲があることを学びました。

例えば、

public void sample() {
    int number = 10;
}

このnumberは、メソッドの中で作られたローカル変数です。

一方、Studentクラスで作った、

public class Student {

    String name;
    int score;

}

namescoreは、クラスに定義されたフィールドです。

種類今回の例基本的な役割
フィールドnamescoreオブジェクトが持つ情報を保存する
ローカル変数numberメソッド内などの処理で一時的に使う

今はまず、「クラスに定義したもの」と「メソッドの中で作ったもの」は役割が違うと覚えておきましょう。

Studentクラスをそのまま実行しようとする

今回作ったStudentクラスにはmainメソッドがありません。

Studentは学生の情報や処理をまとめるためのクラスなので、これまでのサンプルと同じようにStudentクラス単体を実行するものではありません。

今回は、mainメソッドを持っているStudentSampleクラスを実行します。

どのクラスを実行するのか確認しよう

Student
→ 学生を表すためのクラス

StudentSample
mainメソッドを持ち、Studentを実際に使うクラス

Eclipseで実行するときは、今回はStudentSampleクラスを実行します。

staticの有無で呼び出し方が違う

今回作ったintroduce()は、Studentオブジェクトが持っているメソッドです。

そのため、

student.introduce();

のようにオブジェクトから呼び出します。

STEP7で使っていたstaticメソッドとは呼び出し方が違うので、混同しないようにしましょう。

ルミィ
ルミィ

クラスとオブジェクトで迷ったら、「設計図の話?」「実際にnewで作ったものの話?」って分けて考えてみよう♪

STEP9のまとめ

このSTEPでは、Javaで重要な「クラス」と「オブジェクト」について学びました。

最後に、今回のポイントを振り返っておきましょう。

  • クラスは、オブジェクトを作るための「設計図」と考えることができる
  • クラスには、情報を保存する「フィールド」を作ることができる
  • クラスには、処理を行う「メソッド」も作ることができる
  • newを使うと、クラスからオブジェクトを作ることができる
  • 同じクラスから複数のオブジェクトを作ることができる
  • それぞれのオブジェクトは、別々の情報を持つことができる
  • .を使うことで、オブジェクトのフィールドやメソッドを使用できる
  • 自分で作ったクラスも、Student studentのように型として使うことができる
  • staticがないメソッドは、student.introduce()のようにオブジェクトから呼び出す
  • mainメソッドを持たない今回のStudentクラスは、これまでのサンプルのように単体で実行するクラスではない

今回の流れをもう一度確認しよう

STEP9では、まず学生を表すためのStudentクラスを作りました。

public class Student {

    String name;
    int score;

    public void introduce() {
        System.out.println("名前:" + name);
        System.out.println("点数:" + score);
    }

}

そして、StudentSampleクラスから、

Student student = new Student();

student.name = "Lumy";
student.score = 80;

student.introduce();

と使用しました。

この一連の流れを整理すると、

① クラスを作る

Student

② newでオブジェクトを作る

new Student()

③ 作ったオブジェクトに情報を持たせる

student.name = "Lumy";

student.score = 80;

④ オブジェクトのメソッドを呼び出す

student.introduce();

この流れは、これからオブジェクト指向を学んでいくうえでとても重要です。

ルミィ
ルミィ

STEP9クリア!
「クラスという設計図を作って、newで実際に使うオブジェクトを作る」って流れをまずは覚えておこう♪

次のSTEPへ

今回のStudentオブジェクトを作るときは、

new Student();

でオブジェクトを作ったあとに、

student.name = "Lumy";

student.score = 80;

と、1つずつ値を設定しました。

では、オブジェクトを作るときに、最初から名前や点数を設定することはできないのでしょうか?

Javaでは、「コンストラクタ」を使うことで、

Student student = new Student("Lumy", 80);

のように、オブジェクトを作るときに必要な値を渡すことができます。

次のSTEPでは、コンストラクタの作り方と、thisの意味について学んでいきます。

STEP10「コンストラクタを使ってみよう」

記事URLをコピーしました