DESIGN

オブジェクト指向とは?【ポイントはデータとメソッド】

オブジェクト指向とは?

今回のテーマは、「オブジェクト指向」についてです。

オブジェクト指向は、”わかりそうでわからない”という状況になりやすいです。

ぜひ、本記事を参考にしていただき、オブジェクト指向の理解を深めてください!

オブジェクト指向とは

オブジェクト指向は、以下のような説明がなされています。

オブジェクト指向(オブジェクトしこう、英: object-oriented)は、ソフトウェア工学理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。

https://ja.m.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91

オブジェクト指向は、オブジェクト(訳すとモノや目標物)を複数個作って、それらを合体していくことを指します。もう少し踏み込んだ表現をすると、オブジェクトにデータとメソッドを付け加えることです。

例えば、ボタンにデータメソッドを与えるとすると以下のような分類ができます。

  • ボタンの文字
  • ボタンの色や影
  • ボタンの大きさ
  • 初期化
  • マウスが乗ったときの処理
  • クリックされたときの処理

基本的な用語

オブジェクト指向ではよく使われる用語がいくつかあります。

オブジェクト指向のイメージを明確化するためにも、こうした用語を一定頭に入れておくことはかなり効果的です。

早速、基本的な用語について見ていきます。

カプセル化

カプセル化とは、データとメソッドを一つにまとめたものを指します。

カプセル化することで、中身を見られにくくなります。つまり、情報を盗まれにくくなるということです。

カプセル化をすることで扱いやすくなるし、セキュリティー面も良くなる利点があります。

ポリモーフィズム(多様性)

ポリモーフィズムとは、作成したオブジェクトに同じ命令を送ると、それぞれが独自の処理を行うことを指します。

ポリモーフィズム(多様性)

クラス

クラスとは、各オブジェクトの名前です。例えば、ボタンに関するオブジェクトを作ったなら「ボタン」というクラス名をつけるイメージです。

厳密というと、各オブジェクトの性質に名前をつけることを指します。

継承

継承はそのままの意味で、受け継ぐということです。

受け継ぐ際にポイントになるのが上記で紹介したクラスです。

この2つが関わっていることがわかると、オブジェクト指向はほぼほぼ理解したも同然です。

スーパークラス

実はクラスには2種類あります。

その1つにスーパークラスというものがあります。これはいわゆるボタンクラスのようなものを指します。

このスーパークラスを作る理由には、「ボタンの機能ごとを1つ1つゼロから作らないといけないという手間を省きたい」理由があります。

どういうことかというと、ボタンにはトグルボタンやホバーボタンのような多種多様なボタンがあります。

これらをいちいち作ってたらめんどくさいので、基本形を決めて、基本形を再利用することでシンプルなコードで書けるようにしようということです。

サブクラス

もう一つのクラスがサブクラスです。

このクラスは、スーパークラスで作成したオブジェクトの基本形を受け継いで、さまざまなボタンを作っていくクラスです。

例えば、スーパークラスのオブジェクトを継承して、サブクラスでトグルボタンやホバーボタンを作っていくというフローになります。

インスタンス

インスタンスとは、クラス名をつけたオブジェクトを実体化したものです。

例えば、「ボタンをインスタンス化する」と言われたなら、実際にボタンができている状態を指します。

変数

変数は、入れ物の役割を果たしてくれます。

例えば、よくある変数のたとえとして箱があります。この箱に、常時扱いたいもしくは頻繁に扱うであろうデータを入れておきます。

このようにすることで複雑な処理を行うことができます。

スコープ

プログラミングにおけるスコープ: scope, 可視範囲)とは、ある変数関数などの名前(識別子)を参照できる範囲のこと。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97

難しい言葉が並んでますが、簡単に言うと変数(箱)の使える範囲決まっているということです。

A,B,Cという変数があったときに、Aはすべての範囲で使えるけど、B,Cは限られた範囲でしか使えないという感じです。

セッタ

メンバ変数(クラスの中で指定される変数)に値を設定すること。

クラスに直接設置する方法もありますが、変なエラー等ができる可能性があるため、こうしたセッタが使われています。

ゲッタ

メンバ変数から値を取得して呼び出し元に返す仕事をする

セッタで設定した値を引っ張り出してくる役割です。

ゲッタとセッタをまとめると以下の通り

  • ッタ(setter)は値を設置させる
  • ゲッタ(getter)は値を取り出してくる

コントラクタ

コンストラクタとは、クラスのインスタンス生成時に実行されるメソッドで、主にそのクラスのメンバ変数を初期化するときに使用します。

コンストラクタはインスタンス生成時に呼び出される特別なメソッドで、通常のメソッド同様に引数を指定することも可能です。

抽象クラス

抽象クラスとは、抽象メソッドを1つ以上持つクラスです。

抽象クラスは、自身だけでは意味をもたず、サブクラスに継承されることで初めて機能します。

具体的には、以下の通りです。先頭にabstractとついているところ、引数のカッコのあとに{ } がないところに注目してください。

abstract 戻り値の型名 メソッド名(引数);

次に、抽象クラスです。抽象クラスとは、抽象メソッドを1つ以上持つクラスです。

抽象クラスは下記のように記述します。


abstract class クラス名 {

abstract 戻り値の型名 メソッド名(引数);

}

静的メソッド

このstaticのついたメソッドや変数の事を「クラス変数」「クラスメソッド」と言います。クラス内固有に保持される変数やメソッドの事を指します。

反対にstaticのつかない非staticな変数やメソッドの事を、「インスタンス変数」「インスタンスメソッド」と言います。

newで呼び出されたインスタンスで使われるもののことを指します。staticメソッドは、newを使わずに呼び出すことができます。

オブジェクトとクラスとインスタンスの関係

オブジェクトとクラスとインスタンスの関係は密接です。それぞの特徴は以下の通り。

  • クラスは設計図
  • インスタンスは設計図を実物したもの
  • オブジェクトはクラスとインスタンスの両方を指す

料理で例えるならば、レシピがクラスで、実際にできた料理がインスタンスという感じです。

野球で例えるなら、サインがクラスで、実行されたものがインスタンスというイメージです。

オブジェクト指向を使うメリット

本項目では、オブジェクト指向を使用するメリットをご紹介していきます。

再利用で書くコード量が減る

1つ目はコード量が減ることです。

オブジェクト指向では、一度使ったコード(スーパークラス)で使用したコードをサブクラスで再利用しながら作成していくため、実際に書くコード量が少ないです。

複数人で作れて、柔軟性もある

2つ目のメリットは、柔軟性があることです。

上記の通り、オブジェクト指向ではスーパークラスで作ったものを派生させていくため、複数人がスーパークラスで作ったものをいじることができます。そのため、柔軟性があります。

また、クラスまたはインスタンスごとのコードがあるため、変更もしやすいという特徴もあります。

スポーツを例にオブジェクト指向を見てみる

最後にスポーツを例にオブジェクト指向を見ていきたいと思います。

スポーツを例にオブジェクト指向を見る

このように、「スポーツクラス」があり、その配下に「野球」「サッカー」「バスケットボール」などのスポーツがあります。

そして、またその配下にカテゴリーがあります。

このように、オブジェクト指向は物事を分解してカテゴリー分けをし、それぞれのクラスおよびインスタンスを作っていくようなイメージです。

本記事は以上となります。参考になれば幸いです。