「オブジェクト指向」って、最初は分からなくても大丈夫です

広告

C#を勉強していると、途中から急に、

  • クラス
  • インスタンス
  • オブジェクト
  • オブジェクト指向

といった言葉が出てきます。

このあたりで、

急に難しくなったな

と感じる人も多いと思います。

でも、最初から難しい言葉を全部覚える必要はありません。

まずは、今まで勉強してきたことから考えてみましょう。

幼稚園の子供を想像してみよう

幼稚園に通っている子供たちを想像してください。

子供たちは、

  • 絵を描く
  • 遊ぶ
  • ご飯を食べる
  • お昼寝する

といったことをしています。

子供たちは、

今から絵を描こう

外で遊ぼう

というように、そのとき自分がやることを一生懸命やっています。

まずは、それで大丈夫です。

プログラミングを勉強し始めたときも、少し似ています。

たとえば、

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#のクラスも、そのくらいの気持ちで学んでいきましょう。

訪問数 3 回, 今日の訪問数 5回

広告

C#

Posted by hidepon