◆当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

WEBCAMP【マンツーマンサポート】1ヶ月短期集中でプログラミングを学ぶスクール
1ヶ月通い放題・メンター常駐の教室環境でプログラミングを学びたい方!
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
Tech Camp教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
WEBCAMP PRO転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアへ3ヶ月で転職する為のスクールです!
1月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
11月生は満員となっております。12月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

Rubyは純粋なオブジェクト指向言語です。

そして、オブジェクト指向の基本はクラスです。

つまり、クラスの扱いを理解することが、Rubyの中級プログラマーへの必須条件と言えるでしょう。

ここでは、そんなクラスについて、概念と定義の仕方、使用方法を詳しく解説します。

クラスは設計図

※しばらくプログラムから離れて抽象的な話が続きます。少し退屈かもしれませんが、この点を押さえることで以降の理解がぜんぜん違ってきますので、お付き合いください。

クラスは、設計図や型と称されることが多いですが、Rubyでもそれは同様です。

Rubyでも、クラスから変数や配列が作られており、クラスに定義された動きをするようにできています。

ところで、Rubyは純粋な「オブジェクト指向言語」です。

つまり、クラスも、オブジェクトと何らかの関わりがあるということになります。まずはこの関わりを理解することから始めなければ、話を理解することが難しくなります。

狭義の「オブジェクト」については、【Ruby入門説明書】オブジェクトの理解について解説を読んでいただくとして、ここでは、もう少し広義のオブジェクトから考えていきましょう。

オブジェクトとは

オブジェクト指向で扱っているオブジェクトというのは、システムを構成する様々なものです。それは、プログラム内部からシステムを使っている人まで、すべてをオブジェクトだと考えます。

ここまで話が抽象的になると、よく分からないので、話をプログラムの中に戻すと、プログラムはある処理とある処理、ある変数とある変数がどう関わって、どう変化するかを定義していくものです。そして、その関わり合いを考える方法の1つを「オブジェクト指向」と呼ぶわけです。

設計図であるクラスも、オブジェクトに関わりがある「もの」ですので、オブジェクトということになります。もちろん、設計図からは実際に使える「もの」ができますので、そのできた「もの」もオブジェクトです。

つまり、オブジェクトであるクラスは、オブジェクトの設計図であるとも言えます。が、後者の「オブジェクト」は狭義のオブジェクトですので、話がややこしくなります。

そのため、クラスからできた実際に使える「オブジェクト」のことを「インスタンス」と呼びます。

インスタンスで動く

インスタンスは、クラスをもとに作られた実態だと言えます。

例えば、自動車の設計図(=クラス)と、それをもとに作られた自動車(=インスタンス)のような関係です。

インスタンスは、自動車と同じように実際に使うことができる「もの」なわけです。

メソッドと変数

当然ですが、クラスには、実際の動きを示す設計図が含まれています。それが、メソッドです。

つまり、前述の例で言うと、自動車のハンドルやエンジン、ルームミラーやドアなど、自動車を利用するための種々の部品がメソッドと考えてかまいません。

つまり、クラスを利用するために必要なインターフェイスが、メソッドだと言えます。

また、設計図には種々の設定値が記載してあります。

自動車で言えば、排気量やトルク、車体重量、サイズなど、設計図には数多くの設定値があります。また、自動車そのものにも、燃料の残量や速度、回転数、車内やエンジンの温度、座席の角度など、様々な値を保持しています。

このような、クラスが持っている値やインスタンスが持っている値も、変数として定義されています。

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】

クラス定義の文法

クラスの概念の説明が終わりましたので、実際のプログラムでクラスを定義していきましょう。

クラスの定義ができれば、Rubyでできることが大きく広がります。ぜひ、しっかりと読んで試してみてください。

文法

クラスのもっとも基本的な文法は、次のようになっています。

class クラス名
定義
end

クラス名には、以下のような制限がありますので、注意が必要です。

・1文字めは英大文字であること
・2文字め以降は英数文字、アンダーバー(_)であること
・全角文字は使えない

当然ですが、クラスの性質や用途が分かりやすいクラス名にしておくべきでしょう。

なお、定義部分には何も書かなくても、クラスを作ることは可能ですが(その場合は、空のクラスができることになります)、実際に使えるクラスにするためには、上述しているメソッドや変数が必要でしょう。

それぞれの文法は、以下のようになります。

なお、目で見てクラスに属していることが分かりやすいように、インデントを入れる(字下げする)のが一般的です。

メソッド

以下の文法で記載することで、メソッドを定義することができます。メソッド名の制限などの詳細は<リンク>【Ruby入門説明書】メソッド解説と一覧表について解説を確認してください。

class クラス名

  def メソッド名(第1引数,第2引数,,)
    処理
  end

end

なお、「initialize」という名前が付けられたメソッドは、インスタンスが生成されたときに実行される特別なメソッドとして扱われます。

生成されるときに必ず実行されることが約束されていますので、クラスで保持する値に初期値を設定するなど、クラスを初期化する場合に活用することになるでしょう。

class クラス名

  def initialize(第1引数,第2引数,,)
    処理
  end

end

変数

クラス内での変数の定義は、その変数の役割や参照できる範囲(有効範囲)によっていくつか種類があります。

詳細は後述するとして、文法は以下の3種類になります。

ローカル変数

メソッド内やクラス内だけで有効な変数です。処理が終わると失われます。

変数名
インスタンス変数

メソッドの中で定義される変数で、最初に使用された瞬間に生成されます。インスタンスごとに保持される変数で、同じクラスから生成されたインスタンスでも、処理に合わせて別の値を保持します。

@変数名
クラス変数

クラス定義の中(メソッドの外)で定義される変数です。メソッドから参照や変更もできますが、同じクラスから生成されたインスタンスすべてで共有していますので、1つのインスタンスで変更すると、他のインスタンスからは変更後の値が参照されることになります。

なお、インスタンスがなくても保持されています。

@@変数名

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー

クラスを定義して使ってみる

実際にクラスを作って、動かしてみましょう。

今回は、保持している整数の足し算と引き算ができる簡単な計算機クラスを作ってみます。

class00-1.rb

# 計算機クラス
class Calc

  puts("計算機クラスの試作") # .............(1)

  # 初期化
  def initialize(name = "calc") # ..........(2)
    @name = name
    cl
  end

  # 足し算
  def inc(val)
    temp = @result  # ......................(3)
    @result += val
    disp("inc", temp.to_s, val.to_s)
  end

  # 引き算
  def dec(val)
    temp = @result
    @result -= val
    disp("dec", temp.to_s, val.to_s)
  end

  # 値の初期化
  def cl
    temp = @result
    @result = 0
    disp("Init", temp.to_s, "0")
  end

  # 結果表示
  def disp(method, last_ret = "", val = "", result = @result)
    puts("#{@name}.#{method}(#{val}): #{last_ret} --> #{result}")
  end
end

# 計算機インスタンスを生成
calc = Calc.new  # .........................(4)

# 計算
calc.inc(5)
calc.dec(3)
calc.cl

(結果)

計算機クラスの試作
calc.Init(0):  --> 0
calc.inc(5): 0 --> 5
calc.dec(3): 5 --> 2
calc.Init(0): 2 --> 0

詳しく見ていきましょう。

クラス定義内でのメソッド実行

class00-1.rbの(1)は、クラスの設計図に対しては少し不自然に感じるかもしれません。

このputsメソッドがいつのタイミングで実行されるのかは、実行結果を見れば明らかです。

これは、計算機クラスが定義されたときに実行されます。

クラス定義の中、メソッドの定義の外に記載されたプログラムは、すべてクラスが定義されたとき(Rubyがプログラムを読み込んで準備したとき)に実行されます。

この「実行タイミングを知る」というのは、プログラムをする上でとても重要なポイントですので、今後プログラムをするときには、常に意識しておくようにしましょう。

initializeメソッド

(2)は、上述した、生成時に実行されるinitializeメソッドの定義です。

initializeメソッドでも、デフォルト値の設定はできますので、活用しています。

class00-1.rbのinitializeメソッド内では、その下に定義されているclメソッドとdispメソッドを使用して、値の初期化と表示を行っています。

このように、クラス内ではオブジェクトを指定せずに同じクラスで定義されているメソッドを使用できますので、シンプルに記載できます。

インスタンス変数やローカル変数

(3)の記載を見て、不自然に感じた人は、プログラムにずいぶん慣れてきていると言えるでしょう。

なぜなら、ここでは、メソッドが始まった瞬間にローカル変数tempへインスタンス変数@resultの値を代入しようとしているからです。

この部分だけを見ると、何も値が入っていない@resultを参照しています。そのため、このまま実行すれば、エラーが発生するように思えるでしょう。

しかし、class00-1.rbの実行結果を見る限り、インスタンス生成後すぐにcalc.inc(10)を行っても正常に動作しています。

これは、initializeメソッドで生成時に@resultを初期化しているからです。

@resultはインスタンス変数ですので、インスタンスが保持している変数で、インスタンス内から参照や変更すると同じ変数に対して参照や変数を行うことになります。

@resultは、インスタンス生成時にinitializeメソッドで初期化されますので、値が入っていない状態には決してならないということです。

インスタンスからのメソッド実行

インスタンスを生成してしまえば、メソッドを利用するのは難しくありません。
オリジナルで作ったクラスであっても、整数型のメソッドや文字列型のメソッドなどと同じように以下のようにすれば、メソッドを利用することができます。

インスタンス.メソッド名(第1引数,第2引数,,)

クラスへのメソッド追加

Rubyでは、すでに作成してある既存のクラスに対して、メソッドを追加することができます。

文法としては、既存のクラス名で追加するメソッドだけが含まれたクラス定義をするだけです。

例えば、class00-1.rbに以下のプログラムを追記すると、計算機クラスに符号反転メソッドを追加できます。

class00-2.rb

# 符号反転メソッド
class Calc
  def p_m
    temp =@result
    @result *= -1
    disp("p_m", temp.to_s)
  end
end

もちろん、Rubyの環境に標準搭載されているクラスにも追加可能です。

しかし、他の環境への移行などを考慮すると、再利用性が下がりますので、多用しないようにしましょう。

クラスへのアクセスを制限する

クラスを作っていると、内部でだけ利用するちょっとしたメソッドができることがあります。

そういったメソッドは、クラスの外から使われることを想定して処理を作るのは余計な手間がかかりますので、クラスの外から利用できないようにする方が簡単です。

そのための仕組みが、Rubyにはメソッドとして備わっており、以下の3レベルでアクセス制限をかけられるようになっています。

アクセス制限メソッド 説明
public 外部からアクセスできる。
通常のメソッドは自動的にpublic扱いとなります
protected 同じクラスであれば、外部からアクセスできる
private 外部からアクセスできない。
initializeメソッドは自動的にprivateとなります

そして、次のようにして、アクセス制限を指定します。

アクセス制限メソッド :メソッド名

※アクセス制限メソッドのあとに空白、:メソッド名ですので、間違えないようにしてください(アクセス制限メソッドの引数として、メソッドが名シンボルを渡しています)

例えば、結果表示を行っているdispメソッドは、クラス内のメソッドに呼ばれますが、クラス外から呼ばれることは想定されていません。そもそも、引数が内部で扱っているものばかりですので、外部から使うにしても使いようがないでしょう。

そんなときには、次の一文をクラス定義内に追加します。

private :disp

こうすることで、dispメソッドを外部から使用とするとエラーが発生します。

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】

クラスを作るということ

以上が基本的なクラスの定義と使い方です。

この方法でのプログラムは、一旦クラスを作って、その後にインスタンスを生成してインスタンスからメソッドを呼び出す必要があります。

そのため、いままでのトップレベルでのプログラムに比べて、少し面倒に感じるかもしれません。

しかし、変数への直接アクセスや通常のメソッドすらアクセス制限を行う「クラス」という閉じた世界を作る(カプセル化と呼びます)ことは、扱うデータの意味や扱い方をしっかりと考慮して、プログラムで必要な処理のあるべき姿を分析して形にするという意味で、極めて効率的な方法です。

また、クラスを1つ作ってしまえば、簡単に他のプログラムで流用することができますので、プログラミング作業を効率的に進めていくことができるのです。(閉じた世界を他で流用するだけですので、「確実に動く処理」であることが保証されています)

Rubyはオブジェクト指向言語である理由は、このクラスにこそあるのです。

まとめ

Rubyは原則としてオブジェクトの内部で処理が実行されます。

クラスというのは、そのオブジェクトの設計図ですので、「クラスを作る=Rubyプログラムを作る」と言って良いものです。

ここで説明したのは、基本の部分だけですが、これだけでもいろいろなクラスを作ることができますので、ぜひオリジナルのクラスを作って、クラス定義に慣れていきましょう。


・クラスは設計図、作られたものがインスタンス。オブジェクトはそのすべてのこと
・クラス名は英大文字で始めること
・クラスの中にメソッドを定義する
・生成時にinitializeメソッドが必ず実行される
・クラス定義の中、メソッドの定義の外に書かれたプログラムは、クラス生成時に実行される
・インスタンス変数は、インスタンス内で共有される
・クラスを作ることで、メソッドと変数を閉じた世界に収めること(カプセル化)できる

WebCampOnline プログラミングコースについて

WebCampでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

WebCampOnlineが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWebデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

おすすめの記事