<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Class（クラス） | エンジニアライブログ</title>
	<atom:link href="https://tomoyuki65.com/tag/class/feed" rel="self" type="application/rss+xml" />
	<link>https://tomoyuki65.com</link>
	<description></description>
	<lastBuildDate>Wed, 29 Jun 2022 22:54:17 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://tomoyuki65.com/tag/class/feed"/>
	<item>
		<title>【Ruby入門】クラスを作る！メソッドの違いやアクセサを覚える【#8】</title>
		<link>https://tomoyuki65.com/introduction-to-ruby-8</link>
					<comments>https://tomoyuki65.com/introduction-to-ruby-8#respond</comments>
		
		<dc:creator><![CDATA[Tomoyuki]]></dc:creator>
		<pubDate>Wed, 23 Aug 2017 11:00:33 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Class（クラス）]]></category>
		<category><![CDATA[Introduction（入門）]]></category>
		<guid isPermaLink="false">https://tomoyuki65.com/?p=725</guid>

					<description><![CDATA[<p>こんにちは。Tomoyuki（@tomoyuki65）です。 オブジェクトやクラスについては、結構理解しづらいですよね。 特にクラスはオブジェクト指向のプログラミングにとって必須です。 &#160; でも、クラスは作って...</p>
The post <a href="https://tomoyuki65.com/introduction-to-ruby-8">【Ruby入門】クラスを作る！メソッドの違いやアクセサを覚える【#8】</a> first appeared on <a href="https://tomoyuki65.com">エンジニアライブログ</a>.]]></description>
										<content:encoded><![CDATA[<hr />
<p>こんにちは。Tomoyuki（<a href="https://twitter.com/tomoyuki65" target="_blank" rel="noopener">@tomoyuki65</a>）です。</p>
<p>オブジェクトやクラスについては、結構理解しづらいですよね。</p>
<p>特にクラスはオブジェクト指向のプログラミングにとって必須です。</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt;"><strong><span style="background-color: #ffc6d1;">でも、クラスは作ってみると結構簡単なんですよ。</span></strong></span></p>
<p>&nbsp;</p>
<p>この記事では、そんなクラスの作り方について解説します。</p>
<p>&nbsp;</p>
<p><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<ins class="adsbygoogle" style="display: block; text-align: center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9453826382162914" data-ad-slot="5514976097"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>
<h2>メソッドの作り方</h2>
<p>クラスを作る為に、まずはメソッドの作り方を学びましょう。</p>
<p>メソッドは何らかの役割や処理が出来る関数のようなものです。</p>
<p>メソッドは以下のように書きます。</p>
<pre>def メソッド名
  処理
end

# メソッドを実行する場合
メソッド名</pre>
<p>&nbsp;</p>
<p>では以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby"># メソッドの定義
def say
  puts "こんにちは！"
end

# メソッドを実行する場合
say</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
こんにちは！<br />
</div>
<p>&nbsp;</p>
<h3>メソッドにオプションを持たせる場合</h3>
<p>メソッドにはオプションを持たせることができます。</p>
<p>オプションの書き方は、メソッド名の後に（）を付け、（）の中に変数を記載します。</p>
<p>この変数のことを<span style="border-bottom: 2px solid #be3144;"><strong>引数</strong></span>と呼び、<strong><span style="border-bottom: 2px solid #be3144;">引数はカンマ区切りで複数持たせることができます。</span></strong></p>
<p>&nbsp;</p>
<p>では以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby"># 引数name
def say(name)
  puts "#{name}さん こんにちは！"
end

# メソッドを実行
say("田中")

# 意味が曖昧にならない場合は（）は省略できます。
say "田中"</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
<div>田中さん こんにちは！</div>
<div>田中さん こんにちは！</div>
</div>
<p>&nbsp;</p>
<div class="supplement "><strong>引数を複数持たせた場合</strong></p>
<div># カンマ区切りで引数を複数持たせることができる</div>
<div>def say(name1, name2)</div>
<div>  puts &#8220;#{name1}さん、#{name2}さん こんにちは！&#8221;</div>
<div>end</div>
<p>&nbsp;</p>
<div>say(&#8220;佐藤さん&#8221;, &#8220;木村さん&#8221;) # ()は省略可能</div>
<p>&nbsp;</p>
<div># 実行結果　=&gt;　佐藤さん、田中さん こんにちは！</div>
</div>
<p>&nbsp;</p>
<h3>メソッドの引数にデフォルト値を持たせる場合</h3>
<p>メソッドの引数には<span style="border-bottom: 2px solid #be3144;"><strong>デフォルト値</strong></span>を持たせることができます。</p>
<p>では以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby"># 引数nameにデフォルト値「"山田"」を持たせる場合
def say(name = "山田")
  puts "#{name}さん こんにちは！"
end

# メソッドを実行
say</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
山田さん こんにちは！<br />
</div>
<p>&nbsp;</p>
<h3>メソッドに値を返してもらいたい場合</h3>
<p><strong><span style="border-bottom: 2px solid #be3144;">メソッドは最後に評価した値を返します。</span></strong></p>
<p>したがって、以下のように書くと値を返すことができます。</p>
<pre style="background-color: #272822;"><code class="Ruby"># 引数nameにデフォルト値「"山田"」を持たせる場合
def say(name = "山田")
  "#{name}さん こんにちは！"
end

# 返ってきた値をpメソッドで出力
p say</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
山田さん こんにちは！<br />
</div>
<p>&nbsp;</p>
<div class="supplement "><strong>明示的に返す値を指定したい場合</strong></p>
<div>def say(name = &#8220;山田&#8221;)</div>
<div>  return &#8220;#{name}さん こんにちは！&#8221;</div>
<div>end</div>
<p>&nbsp;</p>
<div># 返ってきた値をpメソッドで出力</div>
<div>p say</div>
</div>
<p>&nbsp;</p>
<h3>メソッド内で定義した変数について</h3>
<p><strong><span style="border-bottom: 2px solid #be3144;">メソッド内で定義した変数には、外からアクセスできない</span></strong>というルールがあります。</p>
<p>例として以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby">def say(name = "山田")
  num = 100
  "#{name}さん こんにちは！"
end

# メソッド内で定義した変数numを指定
p num</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle red_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
undefined local variable or method `num&#8217; for main:Object (NameError)<br />
</div>
<p>&nbsp;</p>
<p>実行結果の通り、メソッド内で定義した変数にはアクセスできないため、エラーメッセージが出力されます。</p>
<p>&nbsp;</p>
<p><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<ins class="adsbygoogle" style="display: block; text-align: center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9453826382162914" data-ad-slot="5514976097"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>
<h2>クラスの作り方</h2>
<p>メソッドの作り方を理解したところで、クラスを作ってみましょう。</p>
<p>クラスは以下のように書きます。この時、<strong><span style="border-bottom: 2px solid #be3144;">クラス名の最初の文字は必ず大文字</span></strong>である必要があります。</p>
<pre>class クラス名
  メソッドなどを記載
end</pre>
<p>&nbsp;</p>
<p>例として、Userクラスを作りましょう。Userクラスには「こんにちは！」と表示するsayメソッドを持たせます。</p>
<p>では以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby"># クラスの定義
class User
  def say
    puts "こんにちは！"
  end
end

# 「tanaka」というインスタンスを作成
tanaka = User.new

# メソッド「say」を実行
tanaka.say</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
こんにちは！<br />
</div>
<p>&nbsp;</p>
<h3>インスタンス内の変数に値を保持する方法</h3>
<p>次にクラスを拡張してみます。</p>
<p>インスタンス内の変数に値を保持するため、インスタンス作成時に呼ばれる特殊なメソッド<span style="border-bottom: 2px solid #be3144;"><strong>「initialize」を追加</strong></span>します。</p>
<p>では以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby"># インスタンス作成時、インスタンス変数に名前を保持させる
class User
  <span style="background-color: #424242; width: 100%; display: inline-block;"># initializeメソッドを定義。インスタンス作成時に実行されます。
  def initialize(name)
    # インスタンス変数には頭に@を付ける
    @name = name
  end</span>

  def say
    # 文字列の中でインスタンス変数「@name」を展開
    puts "#{@name}さん こんにちは！"
  end
end

# インスタンスを作成時に文字列「"田中"」を渡す
tanaka = User.new("田中")

# メソッド「say」を実行
tanaka.say

# もう一つインスタンスを作成した場合
satou = User.new("佐藤")
satou.say</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
<div>田中さん こんにちは！</div>
<div>佐藤さん こんにちは！</div>
</div>
<p>&nbsp;</p>
<p>先ほどメソッド内で定義した変数は外からアクセスできないというルールがありましたが、インスタンス変数は特殊です。</p>
<p><strong><span style="border-bottom: 2px solid #be3144;">インスタンス内であればどこからでも呼び出すことができ、インスタンスごとに値が保持されます。</span></strong></p>
<p>&nbsp;</p>
<h3>インスタンス変数へのアクセス</h3>
<p>以下の例をみて下さい。</p>
<p>インスタンス変数はインスタンス外からはアクセスできません。</p>
<pre class="sp-warning">tanaka = User.new("田中")
# このようにインスタンス変数へはアクセスできない
tanaka.name = "山田"
p tanaka.name</pre>
<p>&nbsp;</p>
<p>したがって、上記のようにインスタンス変数の値を変えたり呼び出したい場合は、<span style="border-bottom: 2px solid #be3144;"><strong>通常それらを実現するためのメソッドを定義する必要</strong></span>があります。</p>
<p>&nbsp;</p>
<p>ただし、よく行う処理なのでRubyでは<b><span style="border-bottom: 2px solid #be3144;">アクセサ</span></b>という簡単な記法があります。</p>
<p>例として以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby">class User<span style="background-color: #424242; width: 100%; display: inline-block;">  # アクセサを定義。nameのシンボルを記述
  attr_accessor :name</span>

  def initialize(name)
    @name = name
  end

  def say
    puts "#{@name}さん こんにちは！"
  end
end

tanaka = User.new("田中")

# インスタンス変数nameにアクセス
tanaka.name = "山田"
p tanaka.name</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
&#8220;山田&#8221;<br />
</div>
<p>&nbsp;</p>
<p>このようにアクセッサーを定義すると、<span style="border-bottom: 2px solid #be3144;"><strong>値をセットするメソッド（setter）と、値を取得するメソッド（getter）が定義</strong></span>されます。</p>
<p>&nbsp;</p>
<p>「getter」だけを定義したい場合など、アクセサには以下の種類があります。</p>
<div class="supplement ">アクセサの種類</p>
<div>attr_reader :変数名       # 更新可能</div>
<div>attr_writer :変数名        # 参照可能</div>
<div>attr_accessor :変数名   # 参照と更新が可能</div>
</div>
<p>&nbsp;</p>
<h3>「self」オブジェクトについて</h3>
<p>次はメソッド内で使えるselfオブジェクトについて説明します。</p>
<p>selfはそのメソッドを受け取っているインスタンス自身を指します。</p>
<p>&nbsp;</p>
<p>例として、以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby">class User
  # @nameのsetterとgetterが定義される
  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def say<span style="background-color: #424242; width: 100%; display: inline-block;">    # ここでselfオブジェクトを使った場合、
    # メソッドを受け取っているインスタンス自身を指す。
    puts "#{self.name}さん こんにちは！"

    # 意味が曖昧にならなければ、selfは省略可能
    puts "#{name}さん こんにちは！"</span>
  end

end

tanaka = User.new("田中")
tanaka.name = "山田"

<span style="background-color: #424242; width: 100%; display: inline-block;">tanaka.say  # メソッドを受け取っているインスタンスをレシーバーと呼びます。</span></code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
山田さん こんにちは！<br />
山田さん こんにちは！<br />
</div>
<p>&nbsp;</p>
<h3>クラスメソッド</h3>
<p>今までクラスで定義してきたメソッドはインスタンスメソッドと呼ばれ、インスタンスから呼び出しました。</p>
<p>その他にも、<span style="border-bottom: 2px solid #be3144;"><strong>クラスから直接呼び出すことができるクラスメソッド</strong></span>を定義することもできます。</p>
<p>&nbsp;</p>
<p>例として以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby">class User
  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def say
    puts "#{name}さん こんにちは！" 
  end

  <span style="background-color: #424242; width: 100%;display: inline-block;">  # クラスメソッドを定義
  def self.info
    puts "User Classです。"
  end</span>
end

# クラスメソッドを実行
User.info</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
User Classです。<br />
</div>
<p>&nbsp;</p>
<h3>クラス変数</h3>
<p>さらに、クラス変数を定義することで<span style="border-bottom: 2px solid #be3144;"><strong>クラス自体に値を保持</strong></span>することもできます。</p>
<p>クラス変数を定義するには、<span style="border-bottom: 2px solid #be3144;"><strong>変数の頭に「@@」を付与</strong></span>します。</p>
<p>&nbsp;</p>
<p>例として、以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby">class User
  attr_accessor :name

  <span style="background-color: #424242; width: 100%;display: inline-block;">  # インスタンスの作成数を保持するクラス変数を定義
  @@count = 0</span>

  def initialize(name)
    # newされるたびにカウントアップ
    @@count += 1

    @name = name
  end

  def say
    puts "#{name}さん こんにちは！" 
  end

  def self.info
    # インスタンスの数を出力する。
    puts "User Classです。#{@@count}回インスタンスを作成しました。"
  end
end

# インスタンスを生成
tanaka = User.new("田中")
satou = User.new("佐藤")
suzuki = User.new("鈴木")

# クラスメソッドを実行
User.info</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
User Classです。3回インスタンスを作成しました。<br />
</div>
<p>&nbsp;</p>
<h3>クラス定数</h3>
<p>尚、クラス内では定数も定義できます。</p>
<p><span style="border-bottom: 2px solid #be3144;"><strong>定数は大文字から始めますが、慣習的に全て大文字</strong></span>にするのが推奨されています。</p>
<p>&nbsp;</p>
<p>では以下のプログラムを実行してみて下さい。</p>
<pre style="background-color: #272822;"><code class="Ruby">class User
  attr_accessor :name

  @@count = 0

  <span style="background-color: #424242; width: 100%;display: inline-block;">  # 定数を定義
  DESCRIPTION = "ユーザークラス"</span>

  def initialize(name)
    @@count += 1
    @name = name
  end

  def say
    puts "#{name}さん こんにちは！" 
  end

  def self.info
    # 定数も出力する。
    puts "#{DESCRIPTION} User Classです。#{@@count}回インスタンスを作成しました。"
  end
end

# インスタンスを生成
tanaka = User.new("田中")
satou = User.new("佐藤")
suzuki = User.new("鈴木")

# クラスメソッドを実行
User.info</code></pre>
<p>&nbsp;</p>
<div class="c_box intitle green_box type_normal"><div class="box_title"><span class="span__box_title">実行結果</span></div>
ユーザークラス User Classです。3回インスタンスを作成しました。<br />
</div>
<p>&nbsp;</p>
<div class="supplement "><span style="font-size: 10pt;"><strong>クラスの外から定数にアクセスしたい場合は、以下のように「::」を付けて記載します。</strong></span></p>
<div># pメソッドでクラス定数を出力</div>
<div>p <span style="color: #ff0000;">User::DESCRIPTION</span></div>
<p>&nbsp;</p>
<div># 実行結果 =&gt; &#8220;ユーザークラス&#8221;</div>
</div>
<p>&nbsp;</p>
<p><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<ins class="adsbygoogle" style="display: block; text-align: center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9453826382162914" data-ad-slot="5514976097"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>
<h2>まとめ</h2>
<ul>
<li> クラス名は大文字から始める</li>
<li> メソッドには引数を持たせることができ、複数持たせるにはカンマで区切る</li>
<li> 引数にはデフォルト値を持たせることができる</li>
<li> メソッドは最後に評価した値を返す（明示的にするにはreturnを付ける）</li>
<li> メソッド内で定義した変数には外からアクセスできない（インスタンス変数を除く）</li>
<li> インスタンスの作成は「クラス名.new」で行い、インスタンス作成時には定義したinitializeメソッドが呼ばれる</li>
<li> インスタンス変数は、インスタンス内であればどこからでも呼び出せる</li>
<li> Rubyではアクセサを定義することで、setterやgetterを簡単に定義できる</li>
<li> selfオブジェクトはメソッドを受け取っているインスタンス自身を指し、インスタンスのことをレシーバーと呼ぶ</li>
<li> クラスから直接呼び出すことができるクラスメソッド（self.メソッド名）、クラス変数（@@クラス変数名）や定数も定義できる</li>
<li> クラス内で定義した定数へのアクセスは「クラス名::定数名」で行う</li>
</ul>
<p>&nbsp;</p>
<p>今回はクラスの作り方について説明しました。</p>
<p><strong><span style="border-bottom: 2px solid #be3144;">クラスは奥が深いので、まずは基礎をしっかり押さえましょう！</span></strong></p>
<p>&nbsp;</p>
<ul>
<li> <strong>関連記事</strong></li>
</ul>
<div class="related_article cf labelnone"><a href="https://tomoyuki65.com/ruby-learning-method-summary"><figure class="eyecatch thum"><img fetchpriority="high" decoding="async" width="486" height="290" src="https://tomoyuki65.com/wp-content/uploads/2017/10/ruby190531-8-min-486x290.png" class="attachment-home-thum size-home-thum wp-post-image" alt="" /></figure><div class="meta inbox"><p class="ttl">【無料あり】Ruby入門サイトおすすめ３選！初心者向けの学習方法を解説</p><span class="date gf">2017年10月24日</span></div></a></div>
<div class="related_article cf labelnone"><a href="https://tomoyuki65.com/introduction-to-ruby-3"><figure class="eyecatch thum"><img decoding="async" width="486" height="290" src="https://tomoyuki65.com/wp-content/uploads/2017/07/ruby2-03-c-486x290.png" class="attachment-home-thum size-home-thum wp-post-image" alt="" /></figure><div class="meta inbox"><p class="ttl">【Ruby入門】オブジェクトとは？オブジェクト指向で設計や開発する理由【#3】</p><span class="date gf">2017年7月26日</span></div></a></div>
<div class="related_article cf labelnone"><a href="https://tomoyuki65.com/introduction-to-ruby-9"><figure class="eyecatch thum"><img decoding="async" width="486" height="290" src="https://tomoyuki65.com/wp-content/uploads/2017/08/ruby2-09-c-486x290.png" class="attachment-home-thum size-home-thum wp-post-image" alt="" /></figure><div class="meta inbox"><p class="ttl">【Ruby入門】クラスの継承！オーバーライドやアクセス制御【#9】</p><span class="date gf">2017年8月29日</span></div></a></div>
<div class="related_article cf labelnone"><a href="https://tomoyuki65.com/make-a-class-and-play-in-ruby"><figure class="eyecatch thum"><img loading="lazy" decoding="async" width="486" height="290" src="https://tomoyuki65.com/wp-content/uploads/2017/11/class2-00-c-486x290.png" class="attachment-home-thum size-home-thum wp-post-image" alt="" /></figure><div class="meta inbox"><p class="ttl">テスト駆動開発を実践！Rubyでテストコードを書きながらクラスを作って遊ぶ！</p><span class="date gf">2017年11月25日</span></div></a></div>
<p>&nbsp;</p>The post <a href="https://tomoyuki65.com/introduction-to-ruby-8">【Ruby入門】クラスを作る！メソッドの違いやアクセサを覚える【#8】</a> first appeared on <a href="https://tomoyuki65.com">エンジニアライブログ</a>.]]></content:encoded>
					
					<wfw:commentRss>https://tomoyuki65.com/introduction-to-ruby-8/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
