• WebCampPro_インタビュー
    未経験でも寿司職人からWebデザイナーになった!ホスピタリティでスクールを支える宮脇トレーナー
    2017.05.26
  • WebCamp_インタビュー
    「自信の持てるスキルを得たい!」内定辞退した女子大生がプログラミングを学習したワケ。
    2018.04.28
  • WebCampPro_インタビュー
    未経験31歳からエンジニア転職を実現【実際に聞いてみた】
    2017.04.01
  • WebCamp_インタビュー
    「1カ月頑張ればこの先が見えてくる」地元メディアを立ち上げたママさん
    2017.07.20
  • WebCampPro_インタビュー
    未経験から上京し、エンジニアとしてチームラボグループに転職!【WebCampPro卒業生インタビュー】
    2018.03.10
  • WebCamp_インタビュー
    “未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
    2017.10.04
  • WebCamp_インタビュー
    時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
    2018.01.26
  • WebCamp_インタビュー
    【WebCamp受講生インタビュー】起業準備中にCEOが気がついたプログラミングスキルの重要性とは?
    2017.12.25
  • WebCampPro_インタビュー
    自分で稼ぐ力をつけるため、新卒5年目の営業マンがエンジニアに転職!【WebCampPro転職者インタビュー】
    2018.02.02
  • WebCamp_インタビュー
    【卒業生インタビュー】台湾で月間100万UUの訪日旅行メディアを手掛けるCEOが、プログラミングを学んで得たものとは?
    2018.01.15
  • WebCamp_インタビュー
    【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
    2018.01.15

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

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

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

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

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

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

クラスは設計図

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

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

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

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

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

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

オブジェクトとは

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

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

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

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

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

インスタンスで動く

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

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

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

メソッドと変数

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

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

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

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

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

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

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】
2018-03-22 23:28
今回の記事では、独学でPHPを1年半学習し、その後WebCampを受講して未経験からエンジニアへと転職された佐々木さんにお話を伺いました。 <プロフィール> 佐々木 祐樹 さん(2...

クラス定義の文法

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

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

文法

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

class クラス名
定義
end

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

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

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

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

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

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

メソッド

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

class クラス名

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

end

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

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

class クラス名

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

end

変数

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

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

ローカル変数

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

変数名
インスタンス変数

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

@変数名
クラス変数

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

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

@@変数名

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
2017-10-04 10:26
今回の記事では、未経験からWebCampを1ヶ月受講し、その後エンジニアとして転職をした喜田さんにお話を伺いました。 <プロフィール> 喜田 大介 さん (28歳) 大学時代はプ...

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

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

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

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卒業生インタビュー】
2018-01-26 13:03
今回の記事では、WebCampに1ヶ月間通い、未経験からエンジニアとして転職した星野さんにお話を伺いました。 <プロフィール> 星野 智洋 さん(25) 学生時代は日本大学芸術学部...

クラスを作るということ

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

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

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

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

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

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

まとめ

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

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

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


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

WebCamp・WebCamp Proについて

WebCampは1ヶ月でプログラミング・Webデザインスキルを学ぶ通い放題のプログラミングスクールです。WebCamp Proは3ヶ月間で未経験から即戦力エンジニアを育成するプログラミングスクールです。

2つのサービスを運営するインフラトップでは、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。

キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?

8月枠も残りわずか当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
7月受入枠は満員となっております。8月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

▼未経験から1ヶ月でWebデザイン・プログラミングを学びたい方はこちら!

▼ついに開講!オンラインでWebデザインを学びたい方はこちら!

 

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

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

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

転職のサポートがほしい

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

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
2018-01-15 13:23
今回の記事では、WebCampで1ヶ月間Rubyを学習し、Webエンジニアとして転職した卒業生の田中さんにお話を伺いました。 <プロフィール> 田中 デニス 昭彦さん(...
関連キーワード
Rubyの関連記事
  • 【Ruby入門説明書】クラスの継承について解説
  • 【Ruby入門説明書】インスタンスと変数について説明
  • 【Ruby入門説明書】メソッドの基本から応用までの全体像、一覧表について解説
  • 【Ruby入門説明書】クラスの定義について解説
  • 【Ruby入門説明書】ハッシュについて解説
  • 【Ruby入門説明書】arrayについて解説

当サイトで人気のオススメ転職サービスTOP3

1位 マイナビエージェント×IT

おすすめポイント

・平日忙しい人も、土曜日開催の個別キャリア相談会に参加できる

・職種や仕事内容(要件定義、上流工程から携わる仕事など)の要望が細かくできる
・マイナビの規模を活かした豊富で幅広い求人数

マイナビエージェント×ITの登録はこちら

2位 レバテックキャリア

おすすめポイント

・求人登録数4,000件以上

・エンジニア未経験、経験者両方に対応

・有名企業の採用担当者インタビューがみれる

・一次面接NGからの内定実績もあるほど、内定率が高い

レバテックキャリアの登録はこちら

 3位 type転職エージェント

おすすめポイント

転職者の71%が年収アップ

・IT系企業、特にエンジニアに限らず営業職の求人も充実している

各職種専門の転職アドバイザーが援助

type転職エージェントの登録はこちら

おすすめの記事