オブジェクト?オブジェクト指向とは?(Ruby)

でも、オブジェクトだ!、オブジェクト指向だ!って言われてもよくわかりませんよね。

オブジェクト?クラス?インスタンス?プロパティ?メソッド?

この辺りの言葉について、例を用いて説明していきたいと思います。
また、いつもの通り、当ブログは駆け出しエンジニアさん向けなので、「カプセル化」や「継承」といったものの説明は省略させて頂きますね。

オブジェクトを説明する際、色々な例えが用いられますが、今回は「人間」を例えに説明していきますね。

オブジェクト指向といえば、Javaが有名だと思いますが、私はRubyがメインのため、ソース等についてはRubyで説明させて頂きます。ただし、考え的なのは基本違いはありませんので、どの言語であっても問題ないと思います。

オブジェクトとは?

翻訳すると、オブジェクト(Object)=「対象」となりますが、「物体」「物」と考えた方がわかりやすいかもですね。

「人間」というのも「物体」ですし、私「にゅ〜ぶる」も「物体」です。あなたも「物体」。

全ての物をオブジェクトという物体として考えて設計していく方法が、「オブジェクト指向」という物になります。

クラスとは?

クラス(Class)は、オブジェクトをプログラム言語に変えた物といった感じでしょうか。
そして、「設計図」とよく言われます。クラスに、プロパティやメソッドを定義して、設計図を作っていきます。

では、「人間」を例にクラス(設計図)を作ってみましょう。
ここでは、私「にゅ〜ぶる」を例にクラス(設計図)を作っていきますので、あなたはあなた自身と読み替えながら読んで頂ければと思います。

まず最初に、私もあなたも同じ「人間」というクラスを設計しましょう。
「人間」には、どんな、プロパティがありますか?

おっと、プロパティの説明がまだでしたね。
というわけで、一度、プロパティの説明に変えますね。

プロパティとは?

人間のプロパティと言われたら、何を想像するでしょうか?

「名前」「性別」「年齢」等々…

Rubyで書くとこんな感じですね
Rubyだと、属性(attribute)と考えた方がわかりやすいでしょうか。
attr_accessorという便利なもののありますが、今回は省略しますね。

# 人間クラス
class Person
  # 名前(name)のゲッター
  def name
    @name
  end
 
  # 名前(name)のセッター
  def name=(name)
    @name = name
  end
end
 
person = Person.new
person.name = "にゅ〜ぶる"
p person.name

実行結果

"にゅ〜ぶる"

メソッドとは?

ついでに、メソッドも考えてみましょう。

メソッドとは、クラスの「命令」「動き」と考えたら良いかと思います。
「人間」に動きを与えたい場合、どんな命令(メソッド)を作りますか?

「歩く」「走る」「手を上げる」「右を向く」「喋る」等々…

いっぱい出てきますよね?
こういったメソッドを、前述したプロパティを利用して処理を書いていきます。

例えば、「喋る」を考えると、「自己紹介」というメソッドが考えられますよね。
「自己紹介」となると、「こんにちは、{名前}です。」といった感じになるかと思います。

Rubyで書くと、こんな感じですね。

class Person
  ...

  # 自己紹介
  def selfIntroduction
    p "こんにちは、#{self.name}です。"
  end
end

person = Person.new
person.name = "にゅ〜ぶる"
person.selfIntroduction

実行結果

"こんにちは、にゅ〜ぶるです。"

クラスできた?!

あれ…?
もうクラス出来てますね?!

# 人間クラス
class Person
  # 名前(name)のゲッター
  def name
    @name
  end
 
  # 名前(name)のセッター
  def name=(name)
    @name = name
  end

  # 自己紹介
  def selfIntroduction
    p "こんにちは、#{self.name}です。"
  end
end

余裕があれば、ここに、「性別」「年齢」等々のプロパティを追加して、自己紹介メソッド(selfIntroduction)を改修して、自己紹介をそれっぽくしていってみてくださいね。
あなたのクラスが完成します!

インスタンスは?

あれ?ひとつ説明忘れてますね。「インスタンス」
実は既にもう実行してたんですが、わかりますでしょうか?

Rubyでは、person = Person.newの処理がそうでした!
他の言語でもnewしているところがインスタンス化しているところと覚えたかと思いますが、インスタンス化する=クラス(設計図)を具現化したものと思って貰えれば良いです。

DIYなどの工作では、設計図を元に、実物を作りますよね。それと同じです。

プログラムでも、クラスは設計図と言われているのはその為です。
クラスを定義しただけでは使えません。インスタンス化して初めて使えるようになります。

終わりに

最後まで読んで頂き、ありがとうございます!
何か疑問点等がありましたら、ここのコメントか、Twitter(@newburu)なりでご連絡頂ければ助かります。