ユーニックス総合研究所

  • home
  • archives
  • programming-class-wakariyasuku

宇宙一わかりやすくプログラミングのクラスを解説します

宇宙一わかりやすいプログラミングのクラスの解説

宇宙は広いです。

宇宙広しといえどもプログラミングのクラスをわかりやすく解説した記事はなかなかありません。

この記事ではプログラミングで使われるクラスをできるだけわかりやすく解説することを目指します。

大丈夫です。「いかがでしたか?」なんて、言いません。
私が言うのは「こういうことです。わかりましたか?」です。

え? 大して変わってない?
……。

では実際にプログラミングのクラスを見ていきましょう。

関連記事

魔法の壺、プログラミングのライブラリ(Library)とは
頭悪い人にプログラミングは可能か?可能です
開発を3倍速にするプログラミングの考え方4つ
英語できないけどプログラミングはしたい。そんな人はこの方法がおすすめです
意味のないプログラミングの特徴3つ

そもそもコードとは何か?

そもそもプログラミングの「コード」とは何なのか? というところから始めましょう。
プログラミングでは「コードを書く」とか「コードをコンパイルする」とかよく言われます。

プログラミングとはそもそもコードを書くことを指してプログラミングと言います。
広い意味ではもう少し他の意味も含まれますが、実際の意味はそういうことです。

  • プログラミングはコードを書くということ
  • 広い意味ではほかの意味も含まれる

このコードですが、コードを書くというのはどういうことなのか? ということです。
これは「プログラムの設計」と深いかかわりがあります。

コードを書くということはプログラムの設計を行うということ

コードは何なのか? ということですが、これは実は議論があります。
プロの人もコードに対する認識が違うことがあるのです。

その認識の1つとして存在するのが「コードはプログラムの設計書」と言う認識です。

  • コードはプログラムの設計書
  • コードを書くことは設計を作るということ

つまりプログラムを作るには設計書が必要です。
そしてプログラマーがコードという設計書を書き、それをコンパイラなどでビルド(生成)します。
つまりコードという設計書から自動でプログラムが生成されている、という認識です。

この認識については人によっては「ちがう!」と言うこともあります。
ですが、ここではわかりやすくこの認識にそって話を進めたいと思います。

ではクラスは何の設計になるのか?

ではプログラミングで使われるクラスと言うのは何の設計になるのでしょうか?

その前に実際にクラスがどういうものか見てみましょう。
Pythonというプログラミング言語ではクラスは↓のように書かれたりします。

class Cat:  
    def __init__(self):  
        self.x = 0  
        self.y = 0  

    def run(self):  
        print('猫が走った!')  

class」というキーワードがありますが、これがクラスの識別子です。
この識別子で書かれたコードはクラスになります。
def __init__(self)とかdef run()とかはクラスのメソッド(関数)。
self.xself.yはクラスのメンバ変数と言われます。

このクラスの場合、何の設計を表しているかというとそれは「猫オブジェクト」の設計です。
猫というオブジェクトを設計するためにこのクラスが書かれるわけです。

クラスの設計はオブジェクトの設計

クラスの設計と言うのは「オブジェクト」を生成するために書かれます。
オブジェクトはプログラミングで使われます。

オブジェクトに仕事をさせてその結果を受け取り、画面に表示したりします。
なぜオブジェクトを生成するのかと言うと、その方が複雑な処理をシンプルに書けるからです。

  • クラスを使うと処理をシンプルに書ける

たとえば先ほどの猫クラスは猫にまつわる処理を行わせたいわけです。
ですので猫クラスから猫オブジェクトを生成して、そのオブジェクト達に色々な仕事をさせます。
「走れ」とか「眠れ」とかの仕事ですね。

こういったオブジェクトに仕事をさせるプログラミングを「オブジェクト指向」と言ったりします。

オブジェクトとは何か?

オブジェクトとは何なのでしょうか?
これは難しいことを言うと「メモリ上に確保されたメモリ領域のデータ」です。
簡単に言うと変数です。

変数を難しく言うと「メモリ上に確保された領域」になります。

  • 変数はメモリ上に確保された領域のデータ
  • オブジェクトは変数であるから同じ

プログラムに仕事を行わせたい場合は「メモリ」というのが必要になります。
メモリは仕事のデータを保存して置いたり生成したオブジェクトを確保しておくのに使われます。

よーわからんけど、オブジェクトはメモリ上に確保されるデータなんだな

で理解はOKです。
これをハッキリと理解するには実際にプログラミングをしてメモリのことを学ばないとわかりません。

猫オブジェクトの設計を行うには?

たとえばゲーム開発を考えてみましょう。
そのゲームはいろいろな動物が現れるゲームです。

で、もちろん猫も現れます。

猫を表現するにはどうしたらいいのか? という疑問が起こりますよね。
その時、最近のプログラミングでは「猫オブジェクト」を作るのが普通です。

つまり猫オブジェクトの設計である猫クラスを作ります。
そして猫クラスにいろいろな変数や関数(メソッド)を書きます。

それでその猫クラスから猫オブジェクトを生成するわけです。
そして場合によって猫を走らせる関数を読んだり眠らせる関数を呼び出して、猫のふるまいを行わせます。

たとえば先ほどの猫クラスのrunメソッドを呼び出す場合は↓のようにします。

obj = Cat()  # 猫オブジェクト(obj)の生成  
obj.run()  # runメソッドの呼び出し  

クラスはなぜ必要か?

猫のふるまいを行わせたいなら別に普通の関数でもいいじゃないか!
なんでクラスなんてものを作った! わかりづらい!

となるのが普通ですよね。

実はクラスには大事な役割があります。
それは「変数と関数を一緒に管理する」ということです。

普通の変数と普通の関数はそれぞれバラバラに管理されています。
しかしクラスにして変数と関数をクラスの中に書くと、それらの変数と関数はオブジェクトごとに管理されるようになります。

  • 変数と関数がオブジェクトごとの管理になる

ある程度、高度なプログラミングをするとわかるんですが、変数と関数を一緒に管理したいというケースは多いです。
そのためクラスと言う概念が作られて、そのクラスとそのクラスから生成されるオブジェクトで管理するようになったわけですね。

クラスからはいくつもオブジェクトを生成できますが、そのオブジェクトの持つ変数と関数はそのオブジェクトだけのものです。
ですので管理が楽に行える、というわけですね。

🦝 < 猫オブジェクトAと猫オブジェクトBはそれぞれ違う変数を持っている

🐭 < オブジェクトごとに変数を管理できる

関数とクラスの違いは何か?

関数とクラスの違いは簡単です。

関数は変数を持っていません。
しかしクラスはクラスから生成するオブジェクトに変数を持たせることができます。

  • オブジェクトには変数や関数を持たせることができる

関数は呼び出して処理を実行させるだけです。
クラスはオブジェクトを作ってそのオブジェクトの持つ変数や関数を使うことができます。

クラスの持っている機能

クラスの持っている機能はいろいろありますが、ここでは基本的なものを紹介します。
それは↓の3つです。

  • メンバ変数
  • メソッド(関数)
  • 継承

メンバ変数

メンバ変数とはクラスに書かれるオブジェクトに持たせる変数のことを言います。
クラスからオブジェクトを生成すると、クラスに書かれている変数がオブジェクトに設定されます。

そしてそのオブジェクトから変数にアクセスすることもできます。
メンバ変数は単にメンバとも呼ばれます。

  • メンバ変数はオブジェクトに持たせる変数

Pythonではメンバ変数はクラス変数やインスタンス変数などと呼び分けられています。
クラス変数はクラスが保持する変数、インスタンス変数はオブジェクトが持つ変数です。
ここら辺は言語によって違いますしここでは理解する必要はないです。

🦝 < 新しい難しい用語を出すな! 混乱するだろ!

🐭 < ごめんごめん

メソッド(関数)

メソッドとはオブジェクトに持たせる関数のことを言います。
普通の関数とオブジェクトが持つ関数を区別するためにオブジェクトが持つ変数はメソッドと呼ばれます。

メソッド内からはメソッドが所属しているオブジェクトにアクセスすることができます。
そしてオブジェクトが持っている変数などを使って処理を行うことができます。

継承

継承とは簡単に言うと、クラスが別のクラスによって拡張されることを言います。

たとえばAnimalというクラスがあるとします。
これは動物の処理を行わせるクラスです。

猫は動物なので、動物の処理はAnimalに書いた方がよさそうです。
ではCatクラスにAnimalクラスの処理を行わせるには?
そういう場合は継承が行われます。

  • CatクラスをAnimalクラスで拡張しよう

つまりCatクラスからAnimalクラスを継承して、CatクラスをAnimalクラスで拡張します。
こうするとCatクラスにAnimalクラスの変数やメソッドが配置されます。

たとえばDogクラスを作ったときもAnimalクラスを継承させれば、簡単にクラスを拡張できます。
このように共通化して無駄なコードを減らすことが可能です。

クラスの注意事項

便利なクラスですが、もちろん注意事項もあります。
具体的には継承のやりすぎです。

継承のやりすぎは注意

クラスで継承をやりまくると、たいていスパゲッティコードになります。
継承は便利な機能ですがうまく使うには熟練の経験が必要とされます。

ですので継承をやりまくってクラスを複雑なクラスにしないようにしないといけません。
継承をやりまくって何でもできるようなクラスを「神クラス」と言ったりもします。
神クラスは設計の失敗例としてよく例に出されます。

継承の何が問題になるのか?

具体的に継承の何が問題になりやすいのしょうか。
それは多重継承というものです。

問題になりやすいのは多重継承

同じクラスに複数のクラスを継承させることを多重継承と言ったりします。
つまりCatクラスからAnimalクラスとMachineクラスを継承させて動物と機械の特徴を持ったクラスを誕生させたりできます。

これは魔法みたいな話で面白いですが、多重継承は普通の継承(単一継承)より難しい技術が必要とされます。
たいていは多重継承をしまくったクラスは管理ができなくって破綻することが多いようです。

できるだけ単一継承を使った方が良い

ですので継承を行う場合は基本の単一継承をベースに行った方がいいでしょう。
ほとんどの場合は単一継承でことが足りることが多いです。
どうしても必要な時にだけ多重継承を使うようにしましょう。

おわりに

今回はクラスとは何か? をわかりやすく解説しました。
クラスとはオブジェクトの設計です。
クラスをマスターして高度なプログラミングを行えるようになりましょう。

🦝 < いかがでしたと?は言わない

🐭 < それがこの記事のジャスティス