2017/2/13
class(クラス)はメソッドなどの共通処理を一つにまとめたものです。プログラミングを行う上でクラスを定義することはよくありますが、いまいち使い方をわかっていない人も多いのではないでしょうか?
そんな方にむけて、ここではRubyのclass(クラス)について網羅的に解説します。 クラス(class)とは インスタンスとは クラスのinitialize クラスのメソッド クラスの変数 クラスの継承 クラスとモジュール
このページで、Rubyのclass(クラス)の使い方をよく把握して、自分のスキルとしていきましょう!
この記事の目次
画像:shutter stock
クラス(class)とは、メソッドなどの処理を入れる入れ物のようなものです。Rubyなどのオブジェクト指向型の言語では、この入れ物であるクラスの中に処理を書くことが基本となってきます。
クラスを定義するということは、具体的にはクラスの定義よりRuby言語に新しい「型」を加えることです。その型をnewすると、変数に新しい型の「値」を代入できるようになります。
たとえば、以下のサンプルコードは、Stringクラスという「型」からnewしてString型の値を作成し、変数whoへ値を代入しています。そして、「p who」でwhoの中身の値を表示しています。
この場合は文字列の”jobs”ですね。
次のサンプルコードでは、上に記載したUserクラスの「型」からnewしてUserクラスの値を作成し、変数userに値を代入しています。
実行結果の1行目で、「p user」の出力結果が得られています。この場合、Rubyのクラスの表示方法として決められている定型フォーマットに沿った「なにがしかのクラスです」という意味の表示である「#<User:0x4da9330>」という表示になっています。
これの意味するところは「Userクラスの値ですよ」ということです。実行結果の2行目は、Userクラスのメソッドの出力です。RubyにはStringなどあらかじめ用意されている便利なクラス(型)がたくさんあります。
それに加えて、ユーザー自身がRubyに新たなクラス(型)を付け加えて、ユーザーがより良くRubyを使えるようにカスタマイズすることができます。
この点について、以降で詳しく解説していきます。
クラスには処理を書いていきますが、実際に処理を行うときは、クラスから「インスタンス」と呼ばれるものを生成して、処理を行わせることが多いです。インスタンスの生成には「new」メソッドを使用します。
このようにクラスを使用するときは基本的に、「new」メソッドを使用してインスタンスを生成して、処理を行うという流れを意識しましょう。よく言われる例としてはクラスがたい焼きの型、インスタンスがたい焼きなどと言われます。
要はクラスからインスタンスが生成されるというイメージを持つことが大切です。また、インスタンスはそれぞれ独立して値を持つことができます。
上の例では、Userのインスタンスを作成して、それぞれにデータを持っていることが確認できます!
Rubyのクラスのinitializeメソッドはクラスがnewされた際に一度だけ実行されるメソッドです。主にクラスの初期化を行います。
実際にコードを見てみましょう。
上のコードでは、newの引数に”Kevin”を与えて実行しています。newが呼ばれた際にHelloクラスのinitializeメソッドが呼び出され、newの引数がinitializeの引数に渡されます。
initializeでは、引数をもとにクラス変数@usernameを初期化しています。その後Helloクラスのhelloメソッドを呼び出した際に、@usernameがきちんと初期化した通り表示されていますね。
ただし、initializeは複数定義してオーバーロードできません。実際に例をみてみましょう。
Helloクラスの一番目のinitializeメソッドを使用しようとするとエラーがでますね。これは、一番目のinitializeメソッドの定義が、二番目のinitializeメソッドの定義で上書きされてしまっているからです。
そのため、一番目のinitializeメソッドの定義はもう存在せず、それを使おうとするとエラーとなります。クラスのinitializeについてはこちらにまとめられているので参考にしてください。
クラスメソッドはクラス名をレシーバとして実行するメソッドです。クラスメソッドからは、後述するクラス変数しかアクセスできません。
クラス変数とは、クラスから作成したすべての変数(インスタンス)が共通して持っている変数です。通常、変数(インスタンス)は、値を変数ごとに別々に持っていますが、クラス変数だけは、共通して持っています。
また、クラスメソッドからは、後述するインスタンス変数にはアクセスできません。クラスメソッドはそのクラスから作成したすべての変数(インスタンス)が共通して持っているメソッドです。
そのため、別々に分かれた変数(インスタンス)が別々の値として持っているインスタンス変数は操作できません。実際にサンプルコードで確認してみましょう。
実行結果の1行目では、クラスメソッド「Counter.get_cnt」からクラス変数@@cntにアクセスした値が表示されています。Counterをnewするたびに、initializeで「@@cnt+=1」していました。
Counterの変数(インスタンス)を3つ作成してるので、@@cntも「3」までカウントアップされています。実行結果の2行目では、クラスメソッド「Counter.couter_name」から、インスタンス変数「@counter_name」にアクセスしています。
しかし、クラスメソッドからインスタンス変数にはアクセスできないため、結果はnilとなっています。クラスメソッドについてはこちらの記事にまとめられているので参考にしてください。
クラスメソッドで解説したCounterクラスで、インスタンスメソッドについて解説します。今度は、「self. counter_name」というクラスメソッドから「self」を外し、「counter_name」というインスタンスメソッドに変更します。
また、「self.get_cnt」クラスメソッドも、「get_cnt」インスタンスメソッドにしましょう。違いはこれだけです。
実際にサンプルコードを見ていきましょう。
「counter_name」をインスタンスメソッドにしただけで、インスタンス変数「@counter_name」にアクセスできています。また、「@counter_name」はインスタンス変数ですので、cntの変数ごとに値が違います。
クラスに共通して持つクラス変数@@cntにも、インスタンスメソッド「get_cnt」からアクセスできています。「cnt3.get_cnt」と、インスタンス変数cnt3経由で、「get_cnt」を呼んでいることに注意してください。
このように、インスタンスメソッドからは、クラス変数、インスタンス変数ともにアクセスが可能です。
Rubyの変数には以下の種類があります。 ローカル変数 定数 グローバル変数 ブロック変数 インスタンス変数 クラス変数 クラスインスタンス変数
このうちクラスに関する変数はインタンス変数とクラス変数とクラスインスタンス変数の3つです。前章でも記載した通り、クラスメソッドからは、クラス変数にしかアクセスできません。
また、インスタンスメソッドからはクラス変数、インスタンス変数ともにアクセスできます。クラスインスタンス変数とは、クラス変数、インスタンス変数などとは違う変数です。クラスインスタンス変数もクラスの定義内で定義する変数です。
クラス変数とクラスインスタンス変数の違いは、クラス変数はそのクラスを継承した子クラスからもアクセスできるのに対して、クラスインスタンス変数はそのクラスを継承した子クラスからはアクセスできなくなるという違いがあります。
クラス変数の扱い方に関してはこちらの記事でまとめられているので参考にしてください。
Rubyの継承は「<」を使うことでできます。今回はAnimalクラスをDogクラスに継承してみましょう。
継承が成功し、DogクラスでもAnimalクラスのnameメソッドが使えていることがわかります。このようにRubyでは「<」を使用することで簡単に継承を行うことができます。
また、クラスの継承を行うと、以下のことができるようになります。 機能の流用 親クラスの機能をそのまま子クラスで流用すること。 機能の変更 ポリモルフィズム(多様性)と言い、同じメソッドを使い子クラスでメソッド動作内容を変更することで、親クラスとは違う機能を提供すること。 機能の追加 差分プログラミングといい、親クラスにない機能を子クラスのメソッドで追加こと。
このように、継承には機能の流用・変更・追加などの利点があります。
一つ注意点があり、Rubyは継承を1クラスしか行うことができません。そのため、複数の継承のように実装しようと思うと、後に説明するMixinという機能を使う必要があります。
モジュールを一言で表すと「インスタンス化能力はないが、メソッドを格納できるもの」です。難しく考えずにメソッドを入れるための箱なんだなという意識で大丈夫です。
モジュールは 「module」から「end」 を一つの塊として定義できます。moduleの後にはモジュール名を与えましょう。
クラスの継承では機能の流用・変更・追加が可能でした。ただし、クラス間には、「継承」関係が必要で、親クラスと子クラスは継承関係の「定義」により固く結びついている必要がありました。
モジュールは、このクラスの「継承」の問題を解決するもので、「継承」の定義によらず、ばらばらなクラスに対して、モジュールを入れ込む(MixInといいます)ことにより、機能の流用・変更・追加を行うものです。
モジュールを入れ込んだクラスは、すべて同じモジュールのメソッドを使用できますので、別々のクラスなのに、まるで同じクラスであるかのように、共通の(モジュール)のメソッドを呼べます。また、呼び出すメソッドは、クラスごとに動作が異なります。
さらに、モジュールにより、クラスに新しいメソッドが追加されます。これらが「継承」の定義をせずに得られるのです。モジュールの扱い方についてはこちらにまとめられていますので参考にしてみてください。
またクラスとモジュールの違いには主に 定義の仕方 継承の有無 インスタンスを作成できるか Mixinできるか Ruby上のどのオブジェクトなのか
です。クラスとモジュール違いについてはこちらの記事にまとめられているので参考にしてみてください。
今回は、Rubyのclass(クラス)について学習しました。学習のポイントを振り返ってみましょう! クラスとはRubyに新しい「型」を追加すること。 クラスはインスタンスという変数にすることで使用できる。 クラスのinitializeはクラスがnewされる際に呼び出される。 クラスのメソッドにはクラスメソッドとインスタンスメソッドがある。 クラスの変数にはクラス変数とインスタンス変数、クラスインスタンス変数がある。 クラスメソッドはクラス変数とクラスインスタンス変数にアクセスできる。 インスタンスメソッドはクラス変数とインスタンス変数、クラスインスタンス変数にアクセスできる。 クラスは継承することで、機能の流用・変更・追加ができる。 モジュールは継承関係を使用せずに、機能の流用・変更・追加をすることができる。
以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!
\業界最安級/ 月額2,980円のプログラミングスクール
✔ 業界最安値の月定額2,980円 ✔ 「Q&A掲示板」で平均30分以内に回答がもらえる ✔ 月に一度の「オンライン相談」で悩みを解決 ✔ 教材の数は30種類以上 ✔ 入会金不要+いつでも退会OK
公式サイトはこちら
Writer
貝原 輝昌
こんにちは!貝原(@touhicomu)と申します。 現在は、Web業界のフリーランスとして、主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務を受注しています。 現住所は、日本の西海岸、長崎県は波佐見町です。田舎ライフです。^^ 地元の観光団体「笑楽井石」にボランティアでほたる撮影会やそば塾などのスタッフとして参加させて頂いています。 以下の活動も行っています。 ・笑楽井石のブログ ・エクセル関数を日本語化するソフト ・エクセルVBAを日本語で記述するソフト
2021/10/1
2021/10/1
2021/8/1
2021/8/1
2021/8/1
2021/8/1
VBAとは?マクロとは?初心者向けに基礎の基礎をわかりやすく解説
Macのショートカットキー早見表92個|効かないときの対処法も紹介します
Webサイトの作り方は3パターンしかない!それぞれの手順を徹底解説
【C言語入門】scanfで数値、文字列の入力(sscanfの使い方も解説)
HTMLのホームページは30分で作れる!5つの手順でわかる簡単な作り方
更新日 2022年7月8日
未経験でも挫折しないプログラミングスクール
日本最大級のサブスク型オンラインITスクール
「一人で稼げる」スキルを身につける