By U Zensen.

プログラミング、カメラを中心になんでも書く雑記ブログです。

【JavaとRuby比較】JavaプログラマーがRubyでクラスを書いてみる

2017 / 1 / 4 2017 / 1 / 12
Ruby
0103_title

はじめに!!

どうも!Ruby入門者ぴーすけです!

以前、JavaプログラマーがRubyに入門した際に調べたことまとめ!!でJavaプログラマーの僕がRubyの基本を学んでみましたが、今回はRubyでクラスを作ってみたいと思います。

これもまた、Javaとの違いを中心にまとめたいと思います。

スポンサードリンク

クラス

まずはJavaの場合はこんな感じ

Javaの場合

//クラスの定義 class Sample { //クラスの内容 }

Rubyも同じような感じです。クラス名は大文字始まりのキャメルケースが慣例みたいです。

Rubyの場合

#クラスの定義 class Sample #クラスの内容 end

コンストラクタ

コンストラクタとは、インスタンス生成時に動く処理を記述できるメソッドです。

Javaの場合はクラス名で戻り値なしのメソッドを定義する感じです。

Javaの場合

//クラスの定義 class Sample { //コンストラクタ Sample() { //処理 } }

Rubyの場合は、initializeメソッドを宣言します。

Rubyの場合

#クラスの定義 class Sample #コンストラクタ的なやつ def initialize() #処理 end end

インスタンス化

インスタンス化の書き方はJavaとはすこーし違います。

Javaの場合

//Sampleクラスのインスタンス化 Sample sample = new Sample();

Rubyはこうです。

Rubyの場合

#Sampleクラスのインスタンス化 sample = Sample.new() #括弧で引数を渡す sample = Sample.new #引数は省略可 #引数渡したい場合 sample = Sample.new("引数を渡してます") #括弧で引数を渡す sample = Sample.new "引数を渡してます" #引数は省略可

ちなみにRubyの場合はメソッドを呼ぶときの後ろの括弧を省略できます。引数があろうがなかろうと省略できます。

クラスメソッド

まずはJavaです。クラス内にstatic付きでメソッドを定義するとクラスメソッドになります。

Javaの場合

//クラスの定義 class Sample { //クラスメソッド static void call() { System.out.println("このメソッドはクラスメソッドです。"); } } //クラスメソッドを使う Sample.call();//=> このメソッドはクラスメソッドです。

Rubyのクラスメソッドの定義の仕方はいろいろあるみたいですが、一番基本的な宣言は以下のようにメソッド名の前にself.をつければいいようです。

Rubyの場合

#クラスの定義 class Sample #クラスメソッドの定義 def self.call() puts "このメソッドはクラスメソッドです。" end end #クラスメソッドを使う Sample.call #=> このメソッドはクラスメソッドです。

インスタンスメソッド

まずJavaです。クラス内でstaticなしでメソッドを定義すればそれがインスタンスメソッドになります。

Javaの場合

//クラスの定義 class Sample { //インスタンスメソッドの定義 void call() { System.out.println("このメソッドはインスタンスメソッドです。"); } } //インスタンス化 Sample sample = new Sample(); //インスタンスメソッドを使う sample.call();//=> このメソッドはインスタンスメソッドです。

Rubyのインスタンスメソッドもクラス内で普通にメソッドを宣言すればOKです。

Rubyの場合

#クラスの定義 class Sample #インスタンスメソッドの定義 def call() puts "このメソッドはインスタンスメソッドです。" end end #インスタンス化 sample = Sample.new #インスタンスメソッドを使う sample.call #=> このメソッドはインスタンスメソッドです。

クラス変数

はい、Javaです。クラス内でstatic付きで宣言した変数がクラス変数になります。

Javaの場合

//クラスの定義 //インスタンス化するたびにクラス変数が増える class Sample { //クラス変数 static int count = 0; //コンストラクタ Sample() { count++; } //クラスメソッド static void getCount() { System.out.println(count); } } //インスタンス化 Sample sample1 = new Sample(); //クラスメソッドを使う Sample.getCount();//=> 1 //インスタンス化 Sample sample2 = new Sample(); //クラスメソッドを使う Sample.getCount();//=> 2

クラス変数の宣言はクラス内に@@変数名で宣言します。

Rubyの場合

#クラスの定義 #インスタンス化するたびにクラス変数が増える class Sample #クラス変数 @@count = 0 #コンストラクタ def initialize() @@count += 1 end #クラスメソッドの定義 def self.get_count() puts @@count end end #インスタンス化 sample1 = Sample.new #クラスメソッドを使う Sample.get_count #=> 1 #インスタンス化 sample2 = Sample.new #クラスメソッドを使う Sample.get_count #=> 2

インスタンス変数

Javaの場合は、クラス内で普通に変数を宣言したものがインスタンス変数となります。

Rubyの例と処理を揃えるためにかなり冗長になっています。

Javaの場合

//クラス定義 class Sample { //インスタンス変数を明示的に宣言 String name; //インスタンス変数へのセッターメソッド void setName(String name) { //carNameに値をセットする this.name = name; } //name変数がnullかどうか確認メソッド void isNullName() { if (name == null) { System.out.println("name変数はnullです"); } else { System.out.println("name変数はnullではありません"); } } //name変数を表示するメソッド void callName() { System.out.println("僕の名前は" + name + "です。"); } } //インスタンス化 Sample sample1 = new Sample(); //インスタンス変数を表示するメソッド sample1.callName() //=> 僕の名前はnullです。 //nullかどうか確かめるメソッド sample1.isNullName() //=> name変数はnullです //インスタンス変数に値を入れる sample1.setName("斎藤"); //nullかどうか確かめるメソッド sample1.isNullName() //=> name変数はnullではありません。 //インスタンス変数を表示するメソッド sample1.callName() //=> 僕の名前は斎藤です。

さて、Rubyの場合はインスタンス変数を@変数名と宣言しますが、クラス変数とは違いクラス内に明示的に宣言する必要はありません。これがJavaとは大きく違います。

インスタンス変数はクラス内では宣言せずに、インスタンスメソッド内でいきなり@変数名で呼び出したり値を入れたりすることができます。つまり、コンストラクタやセッターなどのインスタンスメソッド内で@変数名と宣言した変数がインスタンスで参照できるインスタンス変数になるようなのです。

もし値の入っていないインスタンス変数を参照した場合は「nil」になります。

Rubyの場合

#クラスの定義 class Sample #以下のように明示的に宣言はしない #@name #こうすると「クラスインスタンス変数」という別物になってしまう。 #インスタンス変数へのセッターメソッド def set_name(name) #インスタンス変数に値を設定 @name = name end #name変数がnilかどうかの確認メソッド def name_nil?() if @name.nil? puts "name変数はnilです" else puts "name変数はnilではありません" end end #name変数を表示するメソッド def call_name() puts "僕の名前は#{@name}です。" end end #インスタンス化 sample = Sample.new #インスタンス変数を表示するメソッドを使う(nilなのでこうなる) sample.call_name #=> 僕の名前はです。 #name変数がnilかどうか確かめる sample.name_nil? #=> name変数はnilです #nilだったので値を入れる sample.set_name("斎藤") #もう一度nilかどうか確かめる sample.name_nil? #=>name変数はnilではありません #インスタンス変数を表示するメソッドを使う sample.call_name #=> 僕の名前は斎藤です。

こういう感じになります。宣言せずに取り出したり値を代入して使えちゃう感じになります。

クラス直下に明示的に「@変数名」とするとクラスインスタンス変数というものになってしまうらしいです。

クラスインスタンス変数

RubyにはJavaにはないクラスインスタンス変数というものがあります。

これがややこしいのですが、インスタンス変数と同じように@変数名で宣言するのです。クラスインスタンス変数には以下のような特徴があります。

  • サブクラスでは参照できない
  • インスタンスメソッドでは参照できない
  • 宣言はクラス内に@変数名

インスタンス変数と同じように@変数名と宣言しますが、宣言する場所が違います。

クラスインスタンス変数の場合にはクラス直下に宣言する。インスタンス変数はインスタンスメソッド内に宣言するという違いがあります。

Rubyの場合

#クラスの定義 class Sample @@class = "クラス変数" @class_instance = "クラスインスタンス変数" def initialize @instance = "インスタンス変数" end enc

インスタンス変数とクラスインスタンス変数はどちらも頭に@がついているので見間違えに注意です。以下のように同じ名前の変数名でも書けるので要注意ですね。

Rubyの場合

#クラスの定義 class Sample @sample = "クラスインスタンス変数" #同じ変数名 def initialize @sample = "インスタンス変数" #同じ変数名 end def self.get #クラスメソッド内なのでクラスインスタンス変数 @sample #=> クラスインスタンス変数 end def get #インスタンスメソッド内なのでインスタンス変数 @sample #=> インスタンス変数 end enc

アクセス修飾子

アクセス修飾子とは、変数やメソッドなどのアクセス可能な範囲の設定のことを言います。public、private、protectedなどがあります。

Javaの場合

//クラスの定義 class Car { public String sample1; //どこからでも参照できる private String sample2; //クラス内でのみ参照できる protected String sample3; //同パッケージか、サブクラスのみ参照できる String sample4; //クラス内と同じパッケージのみ参照できる //メソッドも同じです。 public void sample1() { //処理 } private void sample2() { //処理 } protected void sample3() { //処理 } void sample4() { //処理 } }

Rubyの場合はメソッドにのみアクセス修飾子が使えるみたいです。

Rubyの場合

#クラスの定義 class Car #パブリックメソッド(自動でパブリックだから明示的に書く必要はない) def sample1 #処理 end public :sample1 #プロテクテッドメソッド def sample2 #処理 end protected :sample2 #プライベートメソッド def sample3 #処理 end private :sample3 end

または

Rubyの場合

#クラスの定義 class Car public #これ以降がパブリックになる(自動でパブリックだから明示的に書く必要はない) def sample1 #処理 end protected #これ以降がプロテクテッドになる def sample2 #処理 end private #これ以降がプライベートになる def sample3 #処理 end end

こんな感じです。

Rubyの場合のインスタンス変数はインスタンスメソッド内でしか出てこない。ということはそのメソッドのアクセス修飾子に依存することになると思います。合理的っちゃ合理的ですね。

ちなみに変数についてのなんやかんやは

Rubyの場合

$sample1; #グローバル変数 sample2; #ローカル変数 @sample3; #インスタンス変数(クラスインスタンス変数) @@sample4; #クラス変数 Sample; #定数 SAMPLE; #定数

こんな感じです。

以上!!

以上、Javaと比較したRubyのクラスについての基本でした!

Rubyのクラスについての全てには触れられませんでしたので、今後まとめていけたらと思います!

いやー、プログラミング楽しいですね!!

おーわり!

Pocket

コメント

コメントを残す