「オブジェクト指向」って、最初は分からなくても大丈夫です
C#を勉強していると、途中から急に、
- クラス
- インスタンス
- オブジェクト
- オブジェクト指向
といった言葉が出てきます。
このあたりで、
急に難しくなったな
と感じる人も多いと思います。
でも、最初から難しい言葉を全部覚える必要はありません。
まずは、今まで勉強してきたことから考えてみましょう。
- 1. 幼稚園の子供を想像してみよう
- 2. 幼稚園には、見えない準備もある
- 3. 今まで勉強したことは、全部これからも使います
- 4. 「生徒」をプログラムで表してみよう
- 5. Studentは、まだ実際の生徒ではない
- 6. 同じStudentでも、中身は別々です
- 7. newは「新しく作る」
- 8. 今までの配列とつなげてみよう
- 9. int[]とStudent[]は同じ考え方です
- 10. forを使って全員を表示してみよう
- 11. ifも使ってみよう
- 12. 生徒自身に点数を表示してもらう
- 13. 合否判定も生徒自身にやってもらう
- 14. 「何をするか」から「誰がするか」へ
- 15. ここで初めて「オブジェクト指向」という言葉を知ろう
- 16. 用語はあとから覚えれば大丈夫
- 17. まとめ
幼稚園の子供を想像してみよう
幼稚園に通っている子供たちを想像してください。
子供たちは、
- 絵を描く
- 遊ぶ
- ご飯を食べる
- お昼寝する
といったことをしています。

子供たちは、
今から絵を描こう
外で遊ぼう
というように、そのとき自分がやることを一生懸命やっています。
まずは、それで大丈夫です。
プログラミングを勉強し始めたときも、少し似ています。
たとえば、
int score = 80;
と変数を使ったり、
if (score >= 70)
{
Console.WriteLine("合格");
}
と条件によって処理を変えたり、
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
と繰り返したりしてきました。
配列も勉強しました。
int[] scores = { 80, 65, 90 };
ここまでは、
この処理をどう書けばいいのか
ということを中心に勉強してきました。
幼稚園には、見えない準備もある
でも、幼稚園は子供たちが遊んでいるだけではありません。
親や先生の立場から見ると、
- 入園の手続き
- 教室の準備
- 先生の配置
- 送り迎え
- 給食
- 持ち物
- 一日の予定
など、いろいろな準備があります。

子供たちは、それらを全部知らなくても幼稚園で過ごせます。
でも、幼稚園全体を見る立場では、
子供たちが活動できる仕組み
も考えなければなりません。
プログラムも同じです。
今までは、
計算する
条件を判定する
繰り返す
という、一つ一つの処理を中心に見てきました。
これからは少しだけ視点を広げます。
このデータは誰のものだろう?
この処理は何についての処理だろう?
関係するものを、ひとまとめにできないだろうか?
ということも考えていきます。
今まで勉強したことは、全部これからも使います
ここは大切です。
変数、if、for、配列を勉強してきましたが、これらを使わなくなるわけではありません。
これからも全部使います。

また、
配列を100%理解してからでないと、次へ進んではいけない
ということでもありません。
先へ進んでから、
ああ、配列ってこういう使い方もできるのか
と分かることもあります。
プログラミングは、一回で全部を理解するものではありません。
一度先まで進んで、あとから前の内容が分かってくることもあります。
「生徒」をプログラムで表してみよう
ここから、生徒をプログラムで表すことを考えてみます。
生徒には、
- 名前
- 点数
があります。
さらに、
- 点数を表示する
- 合否を判定する
といったこともできます。
それなら、
生徒に関係するものを、ひとまとめにしてみよう
と考えることができます。
C#では、そのためにクラスという仕組みを使います。
class Student
{
public string Name;
public int Score;
public void ShowScore()
{
Console.WriteLine(Score);
}
}
最初は、細かい書き方を全部覚えなくても大丈夫です。
まずは、
Studentという、生徒を表すまとまりを作っている
と考えてください。
この中には、
Name
という名前の情報と、
Score
という点数の情報があります。
さらに、
ShowScore()
という、点数を表示する処理もあります。

つまり、
生徒が持っている情報と、生徒ができることを一つにまとめています。
Studentは、まだ実際の生徒ではない
先ほどの、
class Student
は、
生徒とは、こういう情報を持っています
生徒には、こういうことができます
という決まりを作った段階です。
まだ田中さんや佐藤さんがいるわけではありません。
そこで、実際の生徒を作ってみます。
var student1 = new Student();
student1.Name = "田中";
student1.Score = 80;
これで、
名前が田中で、点数が80点の生徒
を作りました。
もう一人作ってみます。
var student2 = new Student();
student2.Name = "佐藤";
student2.Score = 65;
これで2人の生徒ができました。
同じStudentでも、中身は別々です
student1 と student2 は、どちらも Student から作っています。
でも、別々の生徒です。
たとえば、
student1.Score = 90;
として田中さんの点数を90点にしても、佐藤さんの点数まで90点にはなりません。
田中さんには田中さんの情報があります。
佐藤さんには佐藤さんの情報があります。
現実の人間と同じですね。
newは「新しく作る」
ここで出てきた、
new Student()
も難しく考えなくて大丈夫です。
最初は、
Studentを使って、新しい生徒を一人作る
くらいで考えてください。
そして、
student1
のように、実際に作られたものをインスタンスと呼びます。
ただし、最初から「インスタンス」という言葉を完璧に覚える必要はありません。
まずは、
Studentは生徒のひな型student1は実際に作った生徒
と考えれば十分です。
今までの配列とつなげてみよう
では、3人の生徒を作ります。
var student1 = new Student();
student1.Name = "田中";
student1.Score = 80;
var student2 = new Student();
student2.Name = "佐藤";
student2.Score = 65;
var student3 = new Student();
student3.Name = "鈴木";
student3.Score = 90;
3人になりました。
これを、
student1
student2
student3
と別々に管理するのは少し大変です。
そこで、今まで勉強した配列を使います。
Student[] students =
{
student1,
student2,
student3
};

これで、3人の生徒を一つの配列にまとめました。
int[]とStudent[]は同じ考え方です
これまで、こんな配列を見たことがありますね。
int[] scores = { 80, 65, 90 };
これは、
整数をまとめて入れる配列
です。
一方、
Student[] students
は、
生徒をまとめて入れる配列
です。
考え方は同じです。
int[]
なら整数を入れます。
string[]
なら文字列を入れます。
Student[]
なら生徒を入れます。
クラスを勉強すると、今まで勉強した配列の使い方も広がっていきます。
forを使って全員を表示してみよう
配列に入っている生徒を、順番に表示してみます。
for (int i = 0; i < students.Length; i++)
{
Console.WriteLine(students[i].Name);
Console.WriteLine(students[i].Score);
}
ここで、
students[i]
は、
配列の中から、生徒を一人取り出す
という意味です。
そして、
students[i].Name
なら、その生徒の名前です。
students[i].Score
なら、その生徒の点数です。
ifも使ってみよう
70点以上を合格にしてみます。
for (int i = 0; i < students.Length; i++)
{
Console.WriteLine(students[i].Name);
if (students[i].Score >= 70)
{
Console.WriteLine("合格");
}
else
{
Console.WriteLine("不合格");
}
}
ここまで来ると、
- 変数
- if
- for
- 配列
- クラス
が全部一緒に使われています。
つまり、今まで勉強してきたことは別々のものではありません。
今まで覚えた部品を組み合わせて、少しずつ大きなプログラムを作れるようになっているのです。

生徒自身に点数を表示してもらう
今までは、
Console.WriteLine(students[i].Score);
と書いていました。
これは、
生徒の点数を外から取り出して表示する
という書き方です。
でも、Student の中には、
public void ShowScore()
{
Console.WriteLine(Score);
}
という処理を作ってあります。
そのため、
students[i].ShowScore();
と書くこともできます。
これは、
その生徒に、自分の点数を表示してもらう
というイメージです。
合否判定も生徒自身にやってもらう
さらに進めてみましょう。
合否判定も Student の中に入れてみます。
class Student
{
public string Name;
public int Score;
public void ShowScore()
{
Console.WriteLine(Score);
}
public void ShowResult()
{
if (Score >= 70)
{
Console.WriteLine("合格");
}
else
{
Console.WriteLine("不合格");
}
}
}
すると、外側では、
student1.ShowResult();
と書くだけで合否を表示できます。
イメージとしては、
田中さん、自分の点数を使って合否を表示してください
という感じです。

「何をするか」から「誰がするか」へ
最初は、
点数を表示する
と考えていました。
少し進むと、
生徒の点数を表示する
になります。
さらに進むと、
生徒自身に、自分の点数を表示してもらう
という考え方になります。
つまり、これからは、
「何をするか」だけでなく、「誰がそれをするのか」
ということも考えるようになります。
ここで初めて「オブジェクト指向」という言葉を知ろう
ここまでやってきたことには、実は名前があります。
生徒というまとまりを作り、
その中に、
- 名前
- 点数
- 点数を表示する処理
- 合否を判定する処理
を持たせました。
このように、
関係するデータと処理をひとまとまりとして考えていく考え方
が、これから学ぶオブジェクト指向につながっていきます。
最初から、
オブジェクト指向とは何ですか?
と考えなくても大丈夫です。
まずは、
関係するデータと処理をまとめるんだな
くらいで十分です。
用語はあとから覚えれば大丈夫
ここまでの内容に、正式な名前を付けると、
Student
はクラスです。
var student1 = new Student();
で作った student1 はインスタンスです。
そして、
データと処理を、意味のあるまとまりとして考える
という考え方が、オブジェクト指向につながります。
でも、最初は名前よりも意味の方が大切です。
先に体験して、あとから名前を覚える。
それで大丈夫です。
まとめ
これまで皆さんは、
- 変数
- if
- for
- 配列
を勉強してきました。
これからは、それらを使いながら、
関係するデータや処理をまとめる
ということも勉強していきます。
まず、
class Student
を見たら、
生徒というまとまりを作っている
と考えてください。
そして、
var student1 = new Student();
を見たら、
実際の生徒を一人作った
と考えます。
さらに、
Student[] students
を見たら、
生徒を何人もまとめて管理する配列
と考えれば大丈夫です。
最初から「オブジェクト指向」という言葉を完璧に説明できなくても問題ありません。
意味が分かってから、名前を覚える。
C#のクラスも、そのくらいの気持ちで学んでいきましょう。











ディスカッション
コメント一覧
まだ、コメントがありません