Programing

クラス、メソッド、オブジェクトの関係性を分かりやすく解説【初心者向け】

railsを勉強しているけど、クラス、メソッド、オブジェクトの関係性がイマイチ理解できない。。オブジェクト指向ってなんなんだ?

そんな疑問にお答えします。

※初心者向けに分かりやすく解説していくため、多少説明がおかしいところもあるのかもしれません。

ただ、「あー!オブジェクト指向ってこんなもんだったのか!」

とある程度イメージが掴めるように解説していきますね。

オブジェクト指向とは?

コンピュータ内に生き物(オブジェクト)を生み出し、その生き物(オブジェクト)を操作(プログラミング)していく考え方のこと。

どういうことか、詳しく解説していきますね。

  • オブジェクト指向とは、私たち人間がPCの中に、生き物(オブジェクト)を生み出すことです。
  • しかもその生き物(オブジェクト)を自由に動かすことができます。
  • その生き物(オブジェクト)を効率的に量産することも可能です。

ちなみに、

  • メソッド:自由に動かすための指令
  • クラス:効率的に量産するための設計図

なんだかまだよくわからないですよね。

大丈夫です。

徐々に理解できるようになってきます。

ポケモンを例にオブジェクト指向を解説します

pokemon.rbファイルを作成します。

場所は、appディレクトリ内に、pokemonsなど任意のディレクトリを作り、その中にpokemon.rbファイルを作成しましょう。

app/pokemons/pokemon.rb

pokemon.rbファイルにまずはクラスを定義します。

ポケモンクラス

ここに記述する内容がポケモンを大量に生み出すための設計図となります。

ポケモンを生み出す時には初期設定があります。

ここでは、「名前」と「攻撃」がどのポケモンにも必要になるので、initializeメソッドを使って定義します。

initialize

name(名前)とattack(攻撃)をいつでも引っ張ってこれるように、@変数に代入します。

@変数

こう書くことで、@nameと@attackは、initializeメソッドの中ではなくても、このデータを利用できます。

ただ、こう言っても「???」って感じですよね。

次のメソッドを作ると徐々に理解できてきます。

put_nameメソッドを作ってみます。これは名前(name)を呼び出すメソッドです。

put_name

これで名前を呼び出せます。

クラスを元にオブジェクト(ポケモン)を生み出す

一旦、整理しましょう。

put_name
  • ポケモンクラスを作成
  • メソッドを2つ定義しました
  • 1つ目はinitializeメソッド。初期設定(どのポケモンにも必要な特徴を定義)。
  • 2つ目はput_nameメソッド。名前を呼び出すメソッド。

上記を元に、ポケモンを生み出してみます。

インスタンス生成

最下部に

pokemon1 = Pokemon.new(“ピカチュウ”, “十万ボルト”)

と記述しました。

これがいわゆる、インスタンスを生成するというものです。

要は、クラスを元に新しい生き物(オブジェクト、ポケモン)を生み出すことをインスタンスを生成すると言います。

ここでは、pokemon1というポケモンを生み出しました。

Pokemon.newはポケモンクラスを元に、新しいオブジェクト(ポケモン)を作るよ!

ということ。

initializeで初期設定を定義しましたね。

initialize(name, attack)

に合わせて、

pokemon1 = Pokemon.new(“ピカチュウ”, “十万ボルト”)

name = “ピカチュウ”
attack = “十万ボルト”

「名前がピカチュウ、攻撃は十万ボルト」

そんなポケモン(pokemon1)を以下のコードによってPC内に生み出しました。

pokemon1 = Pokemon.new(“ピカチュウ”, “十万ボルト”)

これが記事冒頭で言っていた、以下の一つ目のポイントのことです。

  • オブジェクト指向とは、私たち人間がPCの中に、生き物(オブジェクト)を生み出すことです。
  • しかもその生き物(オブジェクト)を自由に動かすことができます。
  • その生き物(オブジェクト)を効率的に量産することも可能です。

では、次は生き物(オブジェクト)を自由に動かすことをしてみましょう。

自由に動かすためにはメソッドが必要です。

先ほど定義したのが、put_nameメソッドでした。

PC内に生み出したオブジェクト(pokemon1)にname(名前:ピカチュウ)を出力させてみましょう。

put_name

最下部に以下のコードを追記しました。

pokemon1.name

これは、「pokemon1、put_nameメソッドをやれ!」と指示するものです。

pokemon1を自由に動かすための命令です。

コンソールを開き、以下のコードを叩きましょう。

rails bundle exec ruby pokemon.rb

※該当するディレクトリ(app/pokemons)に移動しておく必要があります。ご注意を。

これはpokemon.rbファイルを実行させるものです。

コンソール上に結果が出ます。

“ピカチュウ”

と出れば正解です。

要は、pokemon1に名前を出力させる指令を出したので、pokemon1の名前である「ピカチュウ」が返ってきました。

もう一個メソッド(put_attack)を足してみる

put_attack

今度は、クラス内にput_attackというメソッドを定義してみました。

put_nameと同様に、attack(攻撃)を出力させるメソッドです。

このメソッド(put_attack)を、クラス内で定義すると、pokemon1もこのメソッドで動かすことができます。

pokemon1.put_attack

最下部に以下のコードを追加しました。

pokemon1.put_attack

「pokemon1、put_attackメソッドをやれ!」と指示しています。

もう一度コンソールで、以下のコードを叩きましょう。

rails bundle exec ruby pokemon.rb

※該当するディレクトリ(app/pokemons)に移動しておく必要があります。ご注意を。

これはpokemon.rbファイルを実行させるものです。

“十万ボルト”

と返ってくれば正解です。

要は、pokemon1に攻撃(attack)を出力させる指令を出したので、pokemon1の攻撃である「十万ボルト」が返ってきました。

次は自己紹介させます(introduceメソッド)

introduce

クラス内に、introduceというメソッドを定義しました。

このメソッドを使えば、オブジェクト(生み出したポケモン)に名前と特技を紹介させることができます。

introduce

最下部に以下のコードを追加しました。

pokemon1.introduce

「pokemon1、introduceメソッドをやれ!」と指示しています。

もう一度コンソールで、以下のコードを叩きましょう。

rails bundle exec ruby pokemon.rb

※該当するディレクトリ(app/pokemons)に移動しておく必要があります。ご注意を。

これはpokemon.rbファイルを実行させるものです。

“ピカチュウの特技は十万ボルトです。”

と返ってくれば正解です。

pokemon1にintroduceメソッドを実行するように指示しました。

プログラミング初心者
プログラミング初心者
introduceメソッドには、『p @name + “の特技は” + @attack + “です。”』と書いてあるのに、ピカチュウとか十万ボルトって出てくるの?

initializeメソッドのところでも解説しましたが、@nameと@attackは、initializeメソッドの中ではなくても利用できるものです。(インスタンス変数と言います。)

よって初期設定(initalize)で定義した、

@name = name:”ピカチュウ”
@attack = attack:”十万ボルト”

より、initializeメソッド以外のメソッド(今回はintroduceメソッド)でもピカチュウと、十万ボルトを引っ張ってこれるということです。

さて、ここまでで下記の二つ目までを解説しました。

  • オブジェクト指向とは、私たち人間がPCの中に、生き物(オブジェクト)を生み出すことです。
  • しかもその生き物(オブジェクト)を自由に動かすことができます。
  • その生き物(オブジェクト)を効率的に量産することも可能です。

pokemon1を生み出して、

  • 名前を出力させる(put_nameメソッド)
  • 攻撃を出力させる(put_attackメソッド)
  • 自己紹介をさせる(introduceメソッド)

という3つの指示を出して自由に動かすことができましたね。

次は生き物(オブジェクト)を効率的に量産するということをしてみましょう。

ここまでできれば大分理解が深まります。もう少しお付き合いください。

生き物(オブジェクト)を効率的に量産するって?

先ほどは、pokemon1というオブジェクト(ポケモン)を生み出しました。

pokemon1は、

nameがピカチュウ
attackが十万ボルト

でしたね。

では、同様に、pokemon2を生み出してみましょう。

nameがゼニガメ
attackがハイドロポンプ

と設定して生み出します。コードは下記の通り。

pokemon2にもintroduceメソッドを実行するように指示を出します。

上記のコードを実行すると、

“ピカチュウの特技は十万ボルトです。”
“ゼニガメの特技は水鉄砲です。”

が返ってきます。

pokemon2 = Pokemon.new(“ゼニガメ”, “ハイドロポンプ”)

  • Pokekmonクラスを元に新しくpokemon2というオブジェクト(ポケモン)を生み出す。
  • 名前(name)はゼニガメ。
  • 攻撃(attack)はハイドロポンプ。

pokemon2.introduce

  • pokemon2にintroduceメソッドを行わせる。

pokemonクラスを元にpokemon2も生み出しているため、クラス内で定義している

  • put_nameメソッド
  • put_attackメソッド
  • introduceメソッド

を実行するように、pokemon2にも指示を出すことができます。

同様に、pokemon3、pokemon4とあなたも生み出してみて欲しいです。

オブジェクト指向を理解するには手を動かすことが大事

ここまで、オブジェクト 指向について、ポケモンを例に解説してきました。

この記事を読む前よりは理解を深められましたか?

イメージは以前よりも湧きやすくなったかと思います。

ただ実際に理解して使いこなしていくためには、手を動かすことが必須です。

あなたもクラスを定義して、メソッドを設定して、生み出したオブジェクトに指示を出す練習をしてみてください。

まずは、上記を移しながら3回くらい練習してみてください。

3回を終えた頃には自分でデジモンや会社員とクラスを設定して、メソッドを持たせ、生み出したオブジェクトを自由に動かすことができるようになってきます。

とにもかくにも、まずは手を動かす!。

ぜひオブジェクト指向を掴み、プログラミングをさらに楽しめるようになって、エンジニアとして活躍できる人材に一緒に成長していきましょう。

ABOUT ME
アバター
Ryo
【複業家】会社員をしながら、web関連の事業を個人で行っています。SEOコンサル、Lステップ構築、ボイスパーカッション講師。