Javaプログラミング入門
14. クラスとインスタンス
最終更新:
javatutorial
-
view
これまでのやり方の不便な点
これまでの学習で、変数や配列を使ってデータを管理する方法を学びました。
たとえば、学校のテストの点数と生徒の名前を管理するプログラムを作るとします。
配列を使うと、このように書くことができます。
たとえば、学校のテストの点数と生徒の名前を管理するプログラムを作るとします。
配列を使うと、このように書くことができます。
String[] names = {"山田", "佐藤", "鈴木"};
int[] scores = {80, 95, 70};
確かにこれでもプログラムは動きますが、もし「出席番号」や「部活動」など、管理するデータが増えたらどうなるでしょうか?
データの種類が増えるたびに新しい配列を用意しなければならず、どれが誰のデータなのか分からなくなってしまいます。
「山田さんのデータは全部インデックス番号の0番に入れる」というルールを人間が覚えておかなければならないのは、非常に不便で間違いが起きやすいです。
データの種類が増えるたびに新しい配列を用意しなければならず、どれが誰のデータなのか分からなくなってしまいます。
「山田さんのデータは全部インデックス番号の0番に入れる」というルールを人間が覚えておかなければならないのは、非常に不便で間違いが起きやすいです。
そこで、「山田さんの名前、点数、出席番号」といった関連するデータを1つの箱にまとめて管理できたら便利だと思いませんか?
それを実現するのが、前回学んだオブジェクト指向の考え方から生まれる「クラス」と「インスタンス」という仕組みです。
それを実現するのが、前回学んだオブジェクト指向の考え方から生まれる「クラス」と「インスタンス」という仕組みです。
クラスとインスタンスとは?
クラスとインスタンスの関係は、よく「たい焼きの型」と「たい焼き」に例えられます。
クラス(たい焼きの型)
クラスとは、データ(中身)と処理(動作)をまとめた設計図や金型のようなものです。
「たい焼きには、皮があって、中にあんこやクリームが入っている」という設計を決めるのがクラスの役割です。
ただし、たい焼きの型そのものは食べることができません。あくまで「こういうものを作る」という定義にすぎません。
クラスとは、データ(中身)と処理(動作)をまとめた設計図や金型のようなものです。
「たい焼きには、皮があって、中にあんこやクリームが入っている」という設計を決めるのがクラスの役割です。
ただし、たい焼きの型そのものは食べることができません。あくまで「こういうものを作る」という定義にすぎません。
インスタンス(たい焼きの実体)
インスタンスとは、クラス(金型)をもとにして作られた実体(モノ)のことです。
たい焼きの型に生地とあんこを流し込んで焼くと、実際に食べられる「たい焼き」が完成します。
この完成したたい焼きがインスタンスです。
型は1つでも、焼く作業を繰り返せば、「中身があんこのたい焼き」「中身がクリームのたい焼き」など、たくさんのインスタンスを作ることができます。

インスタンスとは、クラス(金型)をもとにして作られた実体(モノ)のことです。
たい焼きの型に生地とあんこを流し込んで焼くと、実際に食べられる「たい焼き」が完成します。
この完成したたい焼きがインスタンスです。
型は1つでも、焼く作業を繰り返せば、「中身があんこのたい焼き」「中身がクリームのたい焼き」など、たくさんのインスタンスを作ることができます。

クラスの作り方
それでは、実際にクラス(設計図)を作ってみましょう。
まずは、クラスを作るための基本的な文法(書き方)を見ていきます。
まずは、クラスを作るための基本的な文法(書き方)を見ていきます。
クラスを作るときは、次のように書きます。
public class クラス名 {
// ここにデータ(変数)などを書いていきます
}
最初に public class と書き、そのあとに半角スペースを空けて クラス名 を決めます。
そして、中括弧 { } の中に、そのクラスが持つデータを書いていきます。
クラス名の付け方にはルールがあり、変数名とは違って 最初の文字を大文字 にして単語をつなげるのが一般的な約束事です。(例:Student、Car、GameCharacter など)
今回は、生徒の情報をまとめるための「Student(生徒)クラス」を作ります。
Eclipseで新しくStudent.javaというファイルを作成し、以下のコードを入力してください。
そして、中括弧 { } の中に、そのクラスが持つデータを書いていきます。
クラス名の付け方にはルールがあり、変数名とは違って 最初の文字を大文字 にして単語をつなげるのが一般的な約束事です。(例:Student、Car、GameCharacter など)
今回は、生徒の情報をまとめるための「Student(生徒)クラス」を作ります。
Eclipseで新しくStudent.javaというファイルを作成し、以下のコードを入力してください。
サンプル:Student.java
- public class Student {
- // フィールド(生徒が持つデータ)
- int score; // 点数
- }
クラスの中には、そのクラスが持つデータを変数として宣言します。
このようにクラスの中に用意された変数のことを「フィールド」と呼びます。
これで、「名前(name)と点数(score)を持つ生徒」という設計図(型)が完成しました。
まだデータを決めただけで、実際の生徒は生まれていません。
このようにクラスの中に用意された変数のことを「フィールド」と呼びます。
これで、「名前(name)と点数(score)を持つ生徒」という設計図(型)が完成しました。
まだデータを決めただけで、実際の生徒は生まれていません。
インスタンスの作り方
設計図(クラス)ができたら、次はその設計図を使って実体(インスタンス)を作成します。
別のファイル(Main.java)を作成して、プログラムを実行するmainメソッドの中に書いていきましょう。
別のファイル(Main.java)を作成して、プログラムを実行するmainメソッドの中に書いていきましょう。
インスタンスを作成するには、new演算子という特別なキーワードを使用します。
サンプル:Main.java
- public class Main {
- // Studentクラスのインスタンス(実体)を作成
- Student s1 = new Student();
- }
- }
Student s1の部分は、「Student型の変数 s1 を用意する」という意味です。(4. データ型で学んだ変数の宣言と同じですね)
そして、new Student(); の部分が非常に重要です。
ここで「Studentの設計図をもとに、新しい実体(インスタンス)をメモリ上に作ってください」とコンピュータにお願いしています。
作られた実体が、変数s1の箱に代入されます。

そして、new Student(); の部分が非常に重要です。
ここで「Studentの設計図をもとに、新しい実体(インスタンス)をメモリ上に作ってください」とコンピュータにお願いしています。
作られた実体が、変数s1の箱に代入されます。

インスタンスのデータの読み書き
インスタンスが完成したら、その中に入っているフィールド(名前や点数)にデータを書き込んだり、読み出したりしてみましょう。
インスタンスの中にあるデータにアクセスするには、変数名の後ろに .(ドット) をつけます。
このドットは「~の」と読むと分かりやすいです。
インスタンスの中にあるデータにアクセスするには、変数名の後ろに .(ドット) をつけます。
このドットは「~の」と読むと分かりやすいです。
サンプル:Main.java
- public class Main {
- // 1人目の生徒を作成
- Student s1 = new Student();
- s1.name = "山田"; // s1「の」名前に"山田"を代入
- s1.score = 80; // s1「の」点数に80を代入
-
- // 2人目の生徒を作成
- Student s2 = new Student();
- s2.name = "佐藤"; // s2「の」名前に"佐藤"を代入
- s2.score = 95; // s2「の」点数に95を代入
-
- // データの表示
- }
- }
実行結果
山田さんの点数は80点です。
佐藤さんの点数は95点です。
このように、newを使って複数のインスタンス(s1とs2)を作れば、それぞれが別々のデータを保持してくれます。
もう配列のインデックス番号を気にして、誰のデータか迷うことはありません!関連するデータが一つの「生徒」という箱にスッキリとまとまりました。
もう配列のインデックス番号を気にして、誰のデータか迷うことはありません!関連するデータが一つの「生徒」という箱にスッキリとまとまりました。
💡注意!
初心者がよくやってしまうミスが、newを使ってインスタンスを作らずにフィールドにアクセスしようとすることです。
初心者がよくやってしまうミスが、newを使ってインスタンスを作らずにフィールドにアクセスしようとすることです。
Student s3;
s3.name = "鈴木"; // コンパイルエラー、または実行時エラー!
設計図(クラス)を入れる変数を宣言しただけで、まだ「たい焼き」を焼いていないのに、中身を詰めようとしている状態です。
必ず new演算子 を使って実体を作ってから操作するようにしましょう。
必ず new演算子 を使って実体を作ってから操作するようにしましょう。
コラム
参照型とメモリの仕組み
基本型(intやdoubleなど)の変数は、箱の中に「直接その数値」が入っています。
しかし、参照型の変数(今回ならStudent s1)の箱の中には、実際の生徒のデータ(名前や点数)は入っていません。
代わりに入っているのは、コンピュータのメモリ上(ヒープ領域と呼ばれます)に作られた実体のある場所を示す「アドレス(住所)」です。

s1.nameとドット(.)を打つと、Javaは「s1の箱に入っている住所へ行き、そこにある実体のnameを操作する」という動きをしています。
少し難しい概念ですが、クラスを扱う上で「変数の箱には住所が入っている」というイメージを持つことは、今後の学習でとても大切になります。
しかし、参照型の変数(今回ならStudent s1)の箱の中には、実際の生徒のデータ(名前や点数)は入っていません。
代わりに入っているのは、コンピュータのメモリ上(ヒープ領域と呼ばれます)に作られた実体のある場所を示す「アドレス(住所)」です。

s1.nameとドット(.)を打つと、Javaは「s1の箱に入っている住所へ行き、そこにある実体のnameを操作する」という動きをしています。
少し難しい概念ですが、クラスを扱う上で「変数の箱には住所が入っている」というイメージを持つことは、今後の学習でとても大切になります。
用語のまとめ
クラスとインスタンスに関連する用語は少しややこしいので、表にまとめておきます。
しっかり覚えておきましょう!
しっかり覚えておきましょう!
| オブジェクト指向の基本用語 | |
|---|---|
| 用語 | 意味・例え |
| クラス | データの構造や処理を定義した設計図(たい焼きの型) |
| インスタンス | クラスをもとにメモリ上に作成された実体(焼かれたたい焼き) |
| オブジェクト | インスタンスとほぼ同じ意味で使われる言葉。プログラムで扱う「モノ」全般 |
| フィールド | クラスの中に定義されたデータを入れる変数(たい焼きの中身のあんこやクリーム) |
| new演算子 | クラスからインスタンスを新しく生み出すための魔法のキーワード |
クラスという単語の由来
プログラミングにおける「クラス」は、1960年代に開発された Simula 67 で導入された概念になります。
Simulaは、もともと現実の出来事をコンピュータ上でシミュレーションするために作られました。
シミュレーションの対象となる『オブジェクト(モノ)』について、共通する性質や振る舞いをまとめて記述するために、『クラス』と『サブクラス』という仕組みが考案されました。
Simula67の開発は、オーレ=ヨハン・ダールとクリステン・ニガードの協力によって進められ、後のオブジェクト指向プログラミングに大きな影響を与えました。
なお、クラスが作られたのは、プログラムを同時に動かす(並列実行する)ためではありません。Simula67ではそれに近い仕組みも使われていましたが、クラスの本当の目的は『モノの設計図を作ること』でした。
つまり、シミュレーションする対象のデータ(構造)や動き(操作)をひとまとめにしておき、それをベースにして新しい対象を作ったり(継承)、機能を追加したり(拡張)できるようにすることでした。
その後、この考え方はSmalltalkに受け継がれ、さらにC++などの後続言語にも影響を与え、現代のオブジェクト指向プログラミングの基盤となりましたとさ。
Simulaは、もともと現実の出来事をコンピュータ上でシミュレーションするために作られました。
シミュレーションの対象となる『オブジェクト(モノ)』について、共通する性質や振る舞いをまとめて記述するために、『クラス』と『サブクラス』という仕組みが考案されました。
Simula67の開発は、オーレ=ヨハン・ダールとクリステン・ニガードの協力によって進められ、後のオブジェクト指向プログラミングに大きな影響を与えました。
なお、クラスが作られたのは、プログラムを同時に動かす(並列実行する)ためではありません。Simula67ではそれに近い仕組みも使われていましたが、クラスの本当の目的は『モノの設計図を作ること』でした。
つまり、シミュレーションする対象のデータ(構造)や動き(操作)をひとまとめにしておき、それをベースにして新しい対象を作ったり(継承)、機能を追加したり(拡張)できるようにすることでした。
その後、この考え方はSmalltalkに受け継がれ、さらにC++などの後続言語にも影響を与え、現代のオブジェクト指向プログラミングの基盤となりましたとさ。









