オブジェクト指向とは?

オブジェクト指向とは? プログラミング
オブジェクト指向とは?

近年プログラミングの最初の学習としてよく使われるPHPやRubyなど、
これらの言語を勉強していると度々出てくる「オブジェクト指向」と言う単語。
耳慣れないし、なかなか理解することが難しいですよね。
この記事では、オブジェクト指向をできるだけ分かりやすく解説します。

オブジェクト指向とは?

オブジェクト指向とは、「ある役割を持った物」とそれら物同士を組み合わせて
一つのシステムを作り上げるプログラミングの手法です。
と言ってもピンとこないですよね。。。
ここからは車を例に上げて一つ一つ段階を追って咀嚼していきましょう!

まずは「ある役割を持った物」についてです。
「ある役割」というのは、例えば「曲がる」「走る」「止まる」などです。
この役割を持った「物」というのは

  • 「曲がる」→ ハンドル
  • 「走る」 → アクセル
  • 「止まる」→ ブレーキ


という感じで一つの物に対して、その物の役割が決まっていますよね。
これが「ある役割を持った物」であり、これがオブジェクトです。

そして「物同士を組み合わせて一つのシステムを作り上げる」というのは。。。
もうなんとなくお察しかとは思いますが、
このハンドルやアクセルなどを組み合わせていくことで「車」というシステムができる!
この車の作り方がオブジェクト指向ですね。

車の詳しい作りについては分かりませんが、
実際には「ハンドル」を右に回転させることで「タイヤ」が右を向く。
そのハンドルとタイヤの間にも、「二つを連動させる部品」があるのでしょう。
オブジェクト指向プログラミングは、これら全ての
「ある役割を持った物」を組み合わせて一つのシステムを作っていきます。

プログラミング的な解説

では前述の例えを踏まえてオブジェクト指向をプログラミングの世界に当てはめてみましょう。

オブジェクトの中は「」と「役割」の2つに分かれていました。
「物」はプログラミングではデータになります。
そして「役割」はメソッド(指示を受けた時の動作や処理)になります。

例えば「勇者」というデータがあります。勇者には
「↑ボタンを押したら前進する」
「Aボタンを押したら目の前の物を取る」
「Bボタンを押したら攻撃する」
という付随する動作があるとします。
この「勇者」と「付随する動作(処理)」をまとめたものが
プログラミングでのオブジェクトです。

もう一つ、「剣」というデータがあります。
剣には
「取られたら右手に装備する」
「攻撃が当たったら100のダメージを与える」
という処理があります。

そして「勇者」が「剣」の前に行った時にAボタンを押したら、
「目の前の物を取る」動作が行われて剣を取得します。
剣は「取られたら右手に装備する」という処理が行われます。
さらにBボタンを押したら勇者が装備している剣で攻撃をし、
剣の攻撃が当たれば敵に100のダメージを与えます。

このようにオブジェクトを組み合わせていくことで、
勇者が敵を倒すプログラムが出来上がっていきます。

データ

先ほど「勇者というデータ」といいました。
「勇者」自体はそれに関する「名前」「HP」「MP」etc…などの
情報の器をまとめるための空箱で、
実際にこの中の器に情報を入れることで
「勇者 名前: アルス, HP: 500, MP: 50」のような
中身の詰まった箱が出来上がります。
この情報を詰めて出来上がった箱がデータです。

メソッド

先ほどからずっと、「動作」や「処理」などと言っていますが、
これらデータがどのような動きをするかというもの一つ一つをメソッドと言います。


ということで、プログラミングにおけるオブジェクトとは、
データとそれに付随するメソッドをまとめたものとなります。

クラスとインスタンス

ここまではオブジェクト指向そのものの解説でした。
ここからは実際にどのように使われるのかと、そのために必要となる
「クラス」と「インスタンス」という2つの概念を説明します。

クラス

クラスはよく設計図と説明されます。
前章の最後に、オブジェクトとはデータとそれに付随するメソッドをまとめた物とお話ししました。
クラスは、「このデータではこのメソッドが使える」というような感じで、
メソッドの定義と、メソッドとデータの紐づけのようなことを行っています。
最初にお話しした、「勇者(データ)」と「Aボタンで物を取る(動作)」を定義して紐づけているのがクラスです。

しかし、ここでは紐付けを行なっているだけなので動かすことはできません。
実体がないからです。なのでクラスは実体を作る時の設計図というわけです。

インスタンス

先ほどクラスではデータと定義したメソッドを紐づけている設計図と言いましたが、
インスタンスはこのクラスをもとにして作った実体のオブジェクトになります。

仮に「勇者」と「Aボタンで物を取る」を「勇者クラス」として、
勇者クラスをもとに「勇者アルス」を作成することで
実際にこのメソッドたちを使うことができるようになります。
「勇者アルスと実際に使えるようになったメソッドたち」がインスタンスです。

実際の流れ

ここまでの説明を踏まえて、実際にコードではどのように使われるか見てみましょう。
※ここではRailsを使わせていただきます。

# app/models/yusya.rb
class Yusya < ApplicationRecord
  def greeting
		puts 'Hello!!'
	end
end

この models/yusya.rb がクラスです。

$ yusya_arus = Yusya.create(name: 'アルス')
$ yusya_arus.greeting
=> 'Hello!!'

先ほどのクラスをもとに Yusya.create でインスタンスを作りました。
これで実体ができたので yusya_arus.greeting で実際の処理をさせることができたというわけです。

少し複雑になってしまいましたが、
クラスもインスタンスも、どちらもデータとメソッドの集まりなのでオブジェクトです。

まとめ

オブジェクト指向とはなかなか自分の中に浸透するのに時間のかかる概念かと思います。
クラスもインスタンスもどちらもオブジェクト?
結局言ってることはデータとメソッドの集まりで全部一緒じゃない?
なんで言い方が違うの?なんて私もずっと意味がわかりませんでしたが、
クラスは設計図、インスタンスは実体、
そしてどちらも「データとメソッド」で作り的には一緒だから両方オブジェクト。
そんな感じではないかと思います。

以上となりますが、少しでも皆さんの理解のお手伝いができれば幸いです。
ここまでありがとうございました。

p.s.
ところで、指向ってなんでしょうね?
全オブジェクトで一つのシステム構築に向かっているという意味で
「オブジェクト指向」でしょうか??

コメント

タイトルとURLをコピーしました