<?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>基本情報 - 工業大学生ももやまのうさぎ塾 (Momousagi Academy)</title>
	<atom:link href="https://www.momoyama-usagi.com/entry/category/kihon/feed" rel="self" type="application/rss+xml" />
	<link>https://www.momoyama-usagi.com</link>
	<description>人間からうさぎまで数学と情報をわかりやすくお届け！</description>
	<lastBuildDate>Sat, 21 Dec 2024 14:23:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.momoyama-usagi.com/wp-content/uploads/cropped-New-Usagi-Dosei-2-32x32.jpg</url>
	<title>基本情報 - 工業大学生ももやまのうさぎ塾 (Momousagi Academy)</title>
	<link>https://www.momoyama-usagi.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>うさぎでもわかる画像処理　Part01　コンピュータとデジタル画像</title>
		<link>https://www.momoyama-usagi.com/entry/info-img01</link>
					<comments>https://www.momoyama-usagi.com/entry/info-img01#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sat, 13 Nov 2021 12:28:20 +0000</pubDate>
				<category><![CDATA[コンピュータビジョン]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<category><![CDATA[画像処理]]></category>
		<category><![CDATA[ITパスポート]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/?p=4148</guid>

					<description><![CDATA[こんにちは、ももやまです。 コンピュータの世界では、あらゆるもの（命令・データ）が2進数（0 or 1）で管理されているのでしたね。 このあらゆるもの、データというのは文書ファイルにとどまらず、皆さんが普段目にする画像も [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、ももやまです。</p>



<p>コンピュータの世界では、あらゆるもの（命令・データ）が2進数（0 or 1）で管理されているのでしたね。</p>



<p>このあらゆるもの、データというのは文書ファイルにとどまらず、皆さんが普段目にする画像も含まれます。</p>



<div style="height:37px" class="wp-block-spacer"></div>



<p>しかし、写真などの画像データを2進数で表現するためにはちょっとした工夫が必要です。</p>



<p>今回は、コンピュータ上で画像が取り扱うための工夫について見ていきたいとおもいます！</p>



<div style="height:56px" class="wp-block-spacer"></div>



<p>※ 今回の分野を理解するためには、2進数に関する知識が必須です。もし「2しんすうってなんだ？」と思った方は、下の記事にて2進数に関する理解をしておきましょう。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-工業大学生ももやまのうさぎ塾 wp-block-embed-工業大学生ももやまのうさぎ塾"><div class="wp-block-embed__wrapper">
        <article class="pb p-id-238 is-position-relative pb-embed">
            <a class="pb-contents" href="https://www.momoyama-usagi.com/entry/info-calc-sys01">
                <div class="pb__thumb"><img width="300" height="135" src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20190612102246-1-300x135.gif" class="is-position-overlay wp-post-image" alt="" lazysizes="1" /></div><div class="pb__body l-column is-flex-1"><div class="pb-title is-omit-line:2">うさぎでもわかる計算機システム　Part01　2進数 [基本情報対応]</div><div class="pb-substr is-font-size:s is-omit-line:2">今回は計算機（コンピュータ）上であらゆるものを表現するために使われる2進数の基礎についてまとめです。10進数と2進数の変換、2</div></div>            </a>
        </article>
        
</div></figure>



<h2 class="wp-block-heading">1. 画像の最小単位・ピクセル（画素）</h2>



<p>2進数というのは、「0か1で管理する世界」でしたね。</p>



<p>この0か1というのを小さい四角を使って表現してみることにしましょう。具体的には、この四角が塗りつぶされていない状態を0、塗りつぶされている状態を1とします。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img width="331" height="172" src="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-17-58-23-954.jpg" alt="" class="wp-image-4149" srcset="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-17-58-23-954.jpg 331w, https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-17-58-23-954-300x156.jpg 300w" /></figure></div>



<p>この小さい四角1つでは何も表すことができません。しかし、この小さい四角を集めてあげると…</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img width="244" height="317" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-7.gif" alt="" class="wp-image-4150"/></figure></div>



<p>意味がありそうな画像が見えてきましたね…！</p>


<p>このようにコンピュータ上では、上のように小さい四角をたくさん集めることで画像を表現しているのです。また、この小さい四角のことを<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation blue">ピクセル</span>、もしくは<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation blue">画素</span>と呼び、<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation y">コンピュータの世界における画像データの最小単位</span>となります。</p>


<figure class="wp-block-image size-full"><img width="1018" height="411" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-1.gif" alt="" class="wp-image-4151"/></figure>







<h2 class="wp-block-heading">2. 明るさを表す単位・画素値</h2>



<p>白か黒かの2色では、表現できる画像にかなり限りがあります。</p>



<p>そこで、ピクセルに対して8ビット（1バイト）を用いて白から黒の間の色を表現することを考えましょう。</p>


<p><span>まず、真っ暗なピクセルを0、真っ白なピクセルを255と定めます。</span></p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img src="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-16-21-173.jpg" alt="" class="wp-image-4153" width="262" height="188" srcset="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-16-21-173.jpg 302w, https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-16-21-173-300x216.jpg 300w" /></figure></div>



<p><span>さらに、その中間の色（グレー）を0～255の数値で表すことを考えます。この明るさのことを<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation blue">画素値</span>、もしくは<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation blue">輝度値</span>と呼びます。</span></p>
<p>画素値が0に近ければ近いほど暗く（黒に近く）、255に近ければ近いほど明るく（白に近く）なります。</p>


<figure class="wp-block-image size-full"><img width="746" height="185" src="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-16-26-596.jpg" alt="" class="wp-image-4154" srcset="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-16-26-596.jpg 746w, https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-16-26-596-300x74.jpg 300w" /></figure>



<p>このように、1つのピクセルを表現するために8ビット<span class="footnote_referrer"><a tabindex="0" onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_1');" onkeypress="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_1');" ><sup id="footnote_plugin_tooltip_4148_2_1" class="footnote_plugin_tooltip_text">[1]</sup></a><span id="footnote_plugin_tooltip_text_4148_2_1" class="footnote_tooltip">nビットで表せる数の総数は \( 2^n \) 個のため。今回は8ビットなので \( 2^8 = 256 \) 通りの表現が可能となる。</span></span>を使うことで、256色のグレーをつくることができるのです。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img width="641" height="219" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-3.gif" alt="" class="wp-image-4152"/></figure></div>



<h2 class="wp-block-heading">3. カラー画像をコンピュータ上で扱うためには</h2>



<p>普段皆さんが目にする画像、写真はほとんどがカラー画像ですよね。そこで、コンピュータ上でカラー画像を表す方法も見ていきましょう。</p>


<p><span>皆さんは小学校のころ、<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation y">絵の具で色を混ぜ合わせて新しい色を作り出す</span>といったことをしましたね。</span></p>
<p><span>コンピュータ上でも同じように、<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation y">色を混ぜ合わせることで様々な色のピクセルを作り出します</span>。このときに使われる色が<span style="color: #ff0000;">赤</span>・<span style="color: #00ff00;">緑</span>・<span style="color: #0000ff;">青</span>の3色です。<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation blue">光の3原色</span>とも呼ばれます。</span></p>


<div class="wp-block-image"><figure class="aligncenter size-full"><img width="604" height="201" src="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-01-14-973.jpg" alt="" class="wp-image-4155" srcset="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-01-14-973.jpg 604w, https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-01-14-973-300x100.jpg 300w" /></figure></div>



<p>この光の3原色の混ぜる量を0 ～ 255で調整することでいろんな色が作れます<span class="footnote_referrer"><a tabindex="0" onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_2');" onkeypress="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_2');" ><sup id="footnote_plugin_tooltip_4148_2_2" class="footnote_plugin_tooltip_text">[2]</sup></a><span id="footnote_plugin_tooltip_text_4148_2_2" class="footnote_tooltip">&nbsp;&#x2026; <span class="footnote_tooltip_continue"  onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_2');">Continue reading</span></span></span>。</p>



<p>その数、なんと16,777,216色<span class="footnote_referrer"><a tabindex="0" onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_3');" onkeypress="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_3');" ><sup id="footnote_plugin_tooltip_4148_2_3" class="footnote_plugin_tooltip_text">[3]</sup></a><span id="footnote_plugin_tooltip_text_4148_2_3" class="footnote_tooltip">赤、緑、青それぞれで \( 2^8 \) パターンの色の調整が可能なので、合計で \( \( (2^8)^3 = 2^{24} \) 通りの色が表現できます。</span></span>！</p>



<p>下に混ぜ合わせてできる色の例を載せてみたので、ご覧ください。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img width="902" height="554" src="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-01-22-606.jpg" alt="" class="wp-image-4156" srcset="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-01-22-606.jpg 902w, https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-01-22-606-300x184.jpg 300w, https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-01-22-606-768x472.jpg 768w" /></figure></div>



<h3 class="wp-block-heading">カラーコードでモノクロ色を表現する</h3>



<p>「光の3原色を使って白色や黒色も表現できるの？」と思った人もいるかもしれません。</p>



<p>実は、白色や黒色も光の3原色から作り出すことができるのです。</p>



<p>具体的には、何も混ぜない場合（赤0・緑0・青0）は黒色、全部をフルに入れた（赤255・緑255・青255）場合は白色が作られます<span class="footnote_referrer"><a tabindex="0" onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_4');" onkeypress="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_4');" ><sup id="footnote_plugin_tooltip_4148_2_4" class="footnote_plugin_tooltip_text">[4]</sup></a><span id="footnote_plugin_tooltip_text_4148_2_4" class="footnote_tooltip">&nbsp;&#x2026; <span class="footnote_tooltip_continue"  onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_4');">Continue reading</span></span></span>。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img width="902" height="451" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-6.gif" alt="" class="wp-image-4182"/></figure></div>



<p>絵の具で、色々な色を混ぜて黒色を作ったことがある人から見ると、少し不思議な感覚になるかもしれません。</p>



<h3 class="wp-block-heading">余談　カラーコードとは</h3>



<p>プログラミング（特にhtml）をしていると、色の指定を #78cfec のように6桁の英数字を使って指定することがあります。</p>


<p>このカラーコードは、2桁ごとに赤・緑・青の画素値が16進数で表されたものとなっています。</p>


<div class="wp-block-image"><figure class="aligncenter size-full"><img width="558" height="365" src="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-45-37-745.jpg" alt="" class="wp-image-4157" srcset="https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-45-37-745.jpg 558w, https://www.momoyama-usagi.com/wp-content/uploads/bandicam-2021-11-12-18-45-37-745-300x196.jpg 300w" /></figure></div>



<h2 class="wp-block-heading">4. 画像のデジタル化・アナログからデジタルへ</h2>



<p>1～3章では、コンピュータ上で画像がどのように表現されるかについて説明していきました。</p>



<p>この4章では、普段皆さんが目にする景色（アナログ世界）がどのようにしてコンピュータ上で表現できる形（デジタル世界）に変換されるのかを見ていきましょう。</p>



<h3 class="wp-block-heading">Step1. 標本化</h3>


<p><span>まず、コンピュータ上で画像を表現するために、画像を細かく細かく刻みます。</span></p>


<div class="wp-block-image"><figure class="aligncenter size-full"><img width="664" height="268" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-11.gif" alt="" class="wp-image-4185"/></figure></div>



<p>この細かく刻んだものが先ほど説明した画像データの最小単位であるピクセル・画素となります。</p>


<p>Step1の刻む段階で<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation y">細かく刻めば刻むほど、より鮮明にコンピュータ上で画像を表すことができます</span>。</p>


<h4 class="wp-block-heading">余談　画素数とカメラのスペック</h4>



<p>なおコンピュータの世界では、どれくらい鮮明に刻んだのかを画像内のすべてのピクセル・画素の数で表現します。例えば、横300、縦200で刻んだ場合、画素数は300×200＝60,000となります。</p>



<p>この画素数は、スマートフォンや一眼に搭載されているカメラの性能を表す際によく使われます。例えば、2021年最新のiPhone（iPhone13）の場合、横4,032、縦3,024で刻まれており、画素数は約1,200万画素<span class="footnote_referrer"><a tabindex="0" onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_5');" onkeypress="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_5');" ><sup id="footnote_plugin_tooltip_4148_2_5" class="footnote_plugin_tooltip_text">[5]</sup></a><span id="footnote_plugin_tooltip_text_4148_2_5" class="footnote_tooltip">正確には1219万2768画素です。</span></span>となります。</p>



<h3 class="wp-block-heading">Step2. 量子化</h3>



<p>次に、細かく刻んだもの明るさを（画素値）0～255の256段階で数値化します。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img width="664" height="243" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-12-1.gif" alt="" class="wp-image-4184"/></figure></div>



<p>なお、カラー画像の場合、赤色・緑色・青色の明るさ（色の混ぜ具合）をそれぞれ0～255で数値化します。</p>



<h3 class="wp-block-heading">Step3. 符号化</h3>



<p>最後に画像の刻み具合（横と縦のピクセル数）と、それぞれの画素値を2進数にしてデータに書き込みます。</p>



<figure class="wp-block-image size-full"><img width="711" height="242" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-13.gif" alt="" class="wp-image-4186"/></figure>







<p>上の3ステップで、画像をコンピュータの世界で表現できるような形にすることができます。</p>


<p><span>なお、標本化→量子化→符号化の流れは画像だけでなく、<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation y">音をコンピュータ上で表現する際</span>にも使われます<span class="footnote_referrer"><a tabindex="0" onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_6');" onkeypress="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_6');" ><sup id="footnote_plugin_tooltip_4148_2_6" class="footnote_plugin_tooltip_text">[6]</sup></a><span id="footnote_plugin_tooltip_text_4148_2_6" class="footnote_tooltip">ITパスポートや基本情報では画像ではなく、音を用いて標本化、符号化、量子化に関する問題が出ることが多い。</span></span>。</span></p>


<h3 class="wp-block-heading">国家試験（基本情報技術者）の問題を解いてみよう！</h3>



<p>実際に国家試験の1つである基本情報技術者には、このような問題が出題されています。</p>


<div class='wp-block-dbp-frame l-frame-float is-design-onframe is-frame-style-default dbp-frame has-bgcolor'><div class="dbp-frame-title">問題1</div><div class="dbp-frame-content has-content-gap">
<p>標本化、符号化、量子化の三つの工程で、アナログをディジタルに変換する場合の順番として、適切なものはどれか。</p>

<p>ア：標本化，量子化，符号化<br>イ：符号化，量子化，標本化<br>ウ：量子化，標本化，符号化<br>エ：量子化，符号化，標本化</p>

<p>[基本情報技術者平成28年秋期 午前問5]</p>
</div></div>


<p>解答：ア</p>



<p>このような問題を解く際、順番を丸暗記するのではなく、デジタル化の流れを頭に入れておくことでど忘れを減らすことができるので、この際にデジタル化の流れを理解しておきましょう。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img width="1024" height="217" src="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-14-1024x217.gif" alt="" class="wp-image-4187" srcset="https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-14-1024x217.gif 1024w, https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-14-300x63.gif 300w, https://www.momoyama-usagi.com/wp-content/uploads/image_pro1-14-768x162.gif 768w" /></figure></div>



<h2 class="wp-block-heading">5. 画像のサイズ計算</h2>



<p>最後に、コンピュータ上に画像を保存するためにはどのくらいの容量を使うのかを計算してみましょう。</p>



<h3 class="wp-block-heading">(1) 1ピクセルあたりのデータ量</h3>



<p>まずは、1ピクセルあたりに使われるデータ量を、「白黒」・「グレースケール」・「カラー」の3つに分けて計算してみましょう。</p>



<figure class="wp-block-table aligncenter"><table><thead><tr><th class="has-text-align-center">種類</th><th class="has-text-align-center">表現可能な色の数</th><th class="has-text-align-center">1ピクセルあたりのデータ量</th></tr></thead><tbody><tr><td class="has-text-align-center">白黒</td><td class="has-text-align-center">\( 2^1 \) 色</td><td class="has-text-align-center">1ビット</td></tr><tr><td class="has-text-align-center">グレースケール</td><td class="has-text-align-center"> \( 2^8 \) 色 </td><td class="has-text-align-center">8ビット＝1バイト</td></tr><tr><td class="has-text-align-center">カラー</td><td class="has-text-align-center"> \( 2^{24} \) 色 </td><td class="has-text-align-center">24ビット＝3バイト</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">(2) あとは画素数を掛けるだけ</h3>



<p>1ピクセル当たりの容量が分かってしまえば、あとは</p>



<p class="has-text-align-center">(容量) = (1ピクセルあたりのデータ量) × (総画素数)</p>



<p>で簡単に計算ができます。</p>



<p>試しに計算の練習をしてみましょう。</p>


<div class='wp-block-dbp-frame l-frame-float is-design-onframe is-frame-style-default dbp-frame has-bgcolor'><div class="dbp-frame-title">問題2</div><div class="dbp-frame-content has-content-gap">
<p>iPhoneで撮影できる画像の大きさは横4,032画素、縦3,024画素のカラー画像である。</p>

<p>このカラー画像1枚を保存するために必要な容量を計算しなさい。</p>

<p>※1 画像は圧縮されていないものとする。<br>※2 お手元に電卓をご用意ください。</p>
</div></div>


<p><strong>[解答]</strong></p>



<p>必要な容量は\[\begin{align*}<br>3 \times 4032 \times 3024 &amp; = 36578304 \mathrm{[byte]}<br>\\ &amp; \fallingdotseq 35721  \mathrm{[KB]} <br> \\ &amp; \fallingdotseq 34.88 \mathrm{[MB]}  <br>\end{align*}\]となり、容量が約34.9MBであることがわかります。</p>



<h3 class="wp-block-heading">(3) 画質の名前・画素数・容量一覧表</h3>



<p>フルHD、4Kのような画像のきれいさを表す単語を聞いたことがあるかと思います。</p>



<p>下に、画質のきれいさを表す名前と、その大きさ、画素数、1枚あたりの容量を表にしたものをおいておくので参考までにどうぞ。</p>



<figure class="wp-block-table aligncenter"><table><thead><tr><th class="has-text-align-center">画質名</th><th class="has-text-align-center">大きさ</th><th class="has-text-align-center">画素数</th><th class="has-text-align-center">容量 [カラー]</th><th class="has-text-align-center">容量 [モノクロ]</th></tr></thead><tbody><tr><td class="has-text-align-center">SD</td><td class="has-text-align-center">720×480</td><td class="has-text-align-center">34.6万</td><td class="has-text-align-center">0.989 [MB]</td><td class="has-text-align-center">338 [KB]</td></tr><tr><td class="has-text-align-center">HD</td><td class="has-text-align-center">1,280×720</td><td class="has-text-align-center">92.2万</td><td class="has-text-align-center">2.63 [MB]</td><td class="has-text-align-center">900 [KB]</td></tr><tr><td class="has-text-align-center">フルHD</td><td class="has-text-align-center"> 1,920×1,080</td><td class="has-text-align-center">207万</td><td class="has-text-align-center">5.93 [MB]</td><td class="has-text-align-center">1.98 [MB]</td></tr><tr><td class="has-text-align-center">2K</td><td class="has-text-align-center">2,560×1,440</td><td class="has-text-align-center">369万</td><td class="has-text-align-center">10.5 [MB]</td><td class="has-text-align-center">3.52 [MB]</td></tr><tr><td class="has-text-align-center">4K</td><td class="has-text-align-center">3,840×2,160</td><td class="has-text-align-center">830万</td><td class="has-text-align-center">23.7 [MB]</td><td class="has-text-align-center">7.91 [MB]</td></tr><tr><td class="has-text-align-center">8K</td><td class="has-text-align-center">7,680×4,320</td><td class="has-text-align-center">3318万</td><td class="has-text-align-center">94.9 [MB]</td><td class="has-text-align-center">31.6 [MB]</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">(4) 画像の圧縮技術</h3>



<p>先ほど、iPhoneの撮影画像1枚を保存するために34.9MB必要であると説明しました。</p>



<p>しかし、1枚保存するのに34.9MBかかってしまうと、あっという間にiPhoneの容量を食いつくしてしまいます。</p>



<div style="height:48px" class="wp-block-spacer"></div>


<p>そこで使われるのが画像の圧縮技術です。</p>
<p>簡単に説明すると<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation y">省略できる無駄な部分を削除</span>したりするなどで、容量を減らす技術のことを表します。</p>


<p>この画像圧縮技術のおかげで、1枚あたり34.9MB必要なiPhoneの写真データが2MB～3MB程度まで小さくできるのです！</p>



<p>※ 圧縮技術については、機会があれば記事にしたいと思います。</p>



<h3 class="wp-block-heading">国家試験（ITパスポート）の問題を解いてみよう！ </h3>



<p>画像のサイズに関する計算は、ITパスポートでも出てきます。さっそく過去問を見てみましょう。</p>


<div class='wp-block-dbp-frame l-frame-float is-design-onframe is-frame-style-default dbp-frame has-bgcolor'><div class="dbp-frame-title">問題3</div><div class="dbp-frame-content has-content-gap">
<p>300×600ドットで構成され、1画素の情報を記録するのに24ビットを使用する画像データがある。これを150×300ドットで構成され、1画素の情報を記録するのに8ビットを使用する画像データに変換した。必要な記憶容量は何倍になるか。</p>

<p>ア：1 / 12<br>イ：1 / 6<br>ウ：1 / 4<br>エ：1 / 2</p>

<p class="has-text-align-right">[ITパスポート平成28年秋期 問78]</p>
</div></div>


<p><strong>正解：ア</strong></p>



<p>このように2つの画像の記憶容量を比較するタイプの問題の場合、「2つの記憶容量をすべて計算して最後に割る」計算をしてしまうと計算量が増えてしまい、ミスが増加します。</p>






<p>ではどのような方法がおすすめかと言いますと、<span  style="background-image:linear-gradient(to bottom,transparent 0%,#FFF387 0%);" class="dbp-e-marker-animation y">それぞれの画像の記憶容量を計算する式を立ててから、分数の掛け算を計算するように途中で約分する</span>方法です。</p>


<p>具体的には、\[\begin{align*}<br>\frac{\mathrm{変換後}}{ \mathrm{変換前} } &amp; = \frac{150 \times 300 \times 8}{300 \times 600 \times 24}<br>\\ &amp; =  \frac{ \cancel{ 150 } \times \cancel{300} \times  \cancel{  8 } }{ \cancel{ 300 }^{ \ 2} \times \cancel{600}^{ \ 2}  \times  \cancel{  24 }^{ \ 3} } <br>\\ &amp; = \frac{1 \times 1 \times 1}{ 2 \times 2 \times 3}<br>\\ &amp; = \frac{1}{12}<br>\end{align*}\]と計算します。</p>



<p>よって、答えはアの 1/12 となります。</p>



<h3 class="wp-block-heading">国家試験（基本情報）の問題を解いてみよう！ </h3>



<p>ITパスポートよりワンランク上の基本情報でも、同じような問題が出題されます。</p>



<p>ただし、ITパスポートよりは若干計算量が増加するため、計算ミスに注意が必要です。</p>


<div class='wp-block-dbp-frame l-frame-float is-design-onframe is-frame-style-default dbp-frame has-bgcolor'><div class="dbp-frame-title">問題4</div><div class="dbp-frame-content has-content-gap">
<p>横1,600画素、縦1,200画素で、24ビットのカラー情報をもつ画像が撮影できるディジタルカメラがある。このカメラに8Mバイトの記録用メモリを使用すると、何枚の画像が記録できるか。ここで、画像は圧縮しないものとする。</p>

<p>ア：1<br>イ：4<br>ウ：11<br>エ：15</p>

<p class="has-text-align-right">[基本情報技術者平成18年秋期 午前問26]</p>
</div></div>


<p><strong>正解：ア</strong></p>



<p>まず、1枚あたりに必要な画像を計算しましょう。</p>



<p>なお、本来は 1[KB] = 1,024[byte]、1[MB] = 1,024[KB] なのですが、4択の問題なので多少横着をして、1[KB] = 1,000[byte]、1[MB] = 1,000[KB] で計算をします<span class="footnote_referrer"><a tabindex="0" onclick="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_7');" onkeypress="footnote_moveToReference_4148_2('footnote_plugin_reference_4148_2_7');" ><sup id="footnote_plugin_tooltip_4148_2_7" class="footnote_plugin_tooltip_text">[7]</sup></a><span id="footnote_plugin_tooltip_text_4148_2_7" class="footnote_tooltip">計算を横着することで、計算ミスを減らすことと、問題を解くスピードが両方上がるので、選択肢があるタイプの問題では横着を絶対しましょう。</span></span>。また、24ビット＝3バイトとしてから計算することをおすすめします。</p>



<p>\[\begin{align*}<br> 3 \times 1600 \times 1200 &amp; = 5760000 \mathrm{[byte]}<br>\\ &amp; \fallingdotseq 5760  \mathrm{[KB]} <br> \\ &amp; \fallingdotseq 5.76 \mathrm{[MB]}   <br>\end{align*}\]</p>



<p>となり、1枚当たり約5.76MBの容量を食うことがわかります。</p>



<p>カメラに設定されているのは8MBのメモリなので、2枚目を取ろうとした時点で明らかに8MBを超えてしまいますね。</p>



<p>なので、記録できるのは1枚だけとなり、答えはアとなります。</p>



<h2 class="wp-block-heading">6. さいごに</h2>



<p>今回は、画像処理の最初の1歩として画像がコンピュータ上でどのように表されるのかについて説明していきました。</p>



<p>この部分は、ITパスポートや基本情報のような国家試験においても頻出な分野なので、これから画像処理を勉強しない人も理解をしておきましょう！</p>
<div class="speaker-mute footnotes_reference_container"> <div class="footnote_container_prepare"><p><span tabindex="0" class="footnote_reference_container_label pointer">注釈</span><span tabindex="0" class="footnote_reference_container_collapse_button" style="display: none;">[<a id="footnote_reference_container_collapse_button_4148_2">+</a>]</span></p></div> <div id="footnote_references_container_4148_2"><table class="footnotes_table footnote-reference-container"><caption class="accessibility">注釈</caption> <tbody> 

<tr class="footnotes_plugin_reference_row"> <th scope="row" class="footnote_plugin_index_combi pointer"  onclick="footnote_moveToAnchor_4148_2('footnote_plugin_tooltip_4148_2_1');"><a id="footnote_plugin_reference_4148_2_1" class="footnote_backlink"><span class="footnote_index_arrow">&#8593;</span>1</a></th> <td class="footnote_plugin_text">nビットで表せる数の総数は \( 2^n \) 個のため。今回は8ビットなので \( 2^8 = 256 \) 通りの表現が可能となる。</td></tr>

<tr class="footnotes_plugin_reference_row"> <th scope="row" class="footnote_plugin_index_combi pointer"  onclick="footnote_moveToAnchor_4148_2('footnote_plugin_tooltip_4148_2_2');"><a id="footnote_plugin_reference_4148_2_2" class="footnote_backlink"><span class="footnote_index_arrow">&#8593;</span>2</a></th> <td class="footnote_plugin_text">大学で習う線形代数の用語を使って難しく言うと、「任意の色を赤・緑・青の線形結合で表現できる」や「赤・緑・青を基底として任意の色が作られる」と表現することができます。</td></tr>

<tr class="footnotes_plugin_reference_row"> <th scope="row" class="footnote_plugin_index_combi pointer"  onclick="footnote_moveToAnchor_4148_2('footnote_plugin_tooltip_4148_2_3');"><a id="footnote_plugin_reference_4148_2_3" class="footnote_backlink"><span class="footnote_index_arrow">&#8593;</span>3</a></th> <td class="footnote_plugin_text">赤、緑、青それぞれで \( 2^8 \) パターンの色の調整が可能なので、合計で \( \( (2^8)^3 = 2^{24} \) 通りの色が表現できます。</td></tr>

<tr class="footnotes_plugin_reference_row"> <th scope="row" class="footnote_plugin_index_combi pointer"  onclick="footnote_moveToAnchor_4148_2('footnote_plugin_tooltip_4148_2_4');"><a id="footnote_plugin_reference_4148_2_4" class="footnote_backlink"><span class="footnote_index_arrow">&#8593;</span>4</a></th> <td class="footnote_plugin_text">赤・緑・青の量を同じにすることでグレースケールの色を表現することができます。例えば、赤128・緑128・青128はグレースケールの画素値128の色と全く同じです。</td></tr>

<tr class="footnotes_plugin_reference_row"> <th scope="row" class="footnote_plugin_index_combi pointer"  onclick="footnote_moveToAnchor_4148_2('footnote_plugin_tooltip_4148_2_5');"><a id="footnote_plugin_reference_4148_2_5" class="footnote_backlink"><span class="footnote_index_arrow">&#8593;</span>5</a></th> <td class="footnote_plugin_text">正確には1219万2768画素です。</td></tr>

<tr class="footnotes_plugin_reference_row"> <th scope="row" class="footnote_plugin_index_combi pointer"  onclick="footnote_moveToAnchor_4148_2('footnote_plugin_tooltip_4148_2_6');"><a id="footnote_plugin_reference_4148_2_6" class="footnote_backlink"><span class="footnote_index_arrow">&#8593;</span>6</a></th> <td class="footnote_plugin_text">ITパスポートや基本情報では画像ではなく、音を用いて標本化、符号化、量子化に関する問題が出ることが多い。</td></tr>

<tr class="footnotes_plugin_reference_row"> <th scope="row" class="footnote_plugin_index_combi pointer"  onclick="footnote_moveToAnchor_4148_2('footnote_plugin_tooltip_4148_2_7');"><a id="footnote_plugin_reference_4148_2_7" class="footnote_backlink"><span class="footnote_index_arrow">&#8593;</span>7</a></th> <td class="footnote_plugin_text">計算を横着することで、計算ミスを減らすことと、問題を解くスピードが両方上がるので、選択肢があるタイプの問題では横着を絶対しましょう。</td></tr>

 </tbody> </table> </div></div>]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-img01/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第04羽　SQL中編</title>
		<link>https://www.momoyama-usagi.com/entry/info-database04</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database04#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Fri, 16 Oct 2020 15:42:25 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database04</guid>

					<description><![CDATA[今回は、SQLの中編として、データベースや表の作成、変更、削除、およびデータの挿入、削除方法、データベースの権限について簡潔に説明しています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回は、SQLの中編ということで、</p>
<ul class="wp-block-list dbp-list"><li>データベースの作成、削除</li><li>表の定義, 構造変更, 削除</li><li>データの挿入, 削除</li><li>データベースの権限</li></ul>
<p>の4つについて説明します。</p>

<h2 class="wp-block-heading">１．データベースの作成・削除</h2>
<p>特に意識して覚える必要はなし。</p>
<h3 class="wp-block-heading">(1) データベースの作成</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">create</span> database 作成するデータベース名
</pre>
<h3 class="wp-block-heading">(2) データベースの削除</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">drop</span> database 削除するデータベース名
</pre>
<p><code>create</code> が作成、<code>drop</code> が削除というのは頭に入れておきましょう。</p>
<p>本番、SQLの構文をど忘れしたときでも選択肢を絞ることができます。</p>
<h2 class="wp-block-heading">２．表の定義, 構造変更, 削除</h2>
<h3 class="wp-block-heading">(1) 表の定義</h3>
<p>定義に関する問題はたまに見かけるので、どんなふうに書くのかをさらっと確認しておきましょう。</p>
<h4 class="wp-block-heading">基本構文</h4>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">create</span> <span class="synSpecial">table</span> 表名 (
列名<span class="synConstant">1</span>  データ型  [列名<span class="synConstant">1</span>の列制約]
列名<span class="synConstant">2</span>  データ型  [列名<span class="synConstant">2</span>の列制約]
列名<span class="synConstant">3</span>  データ型  [列名<span class="synConstant">3</span>の列制約]
　︙
[表制約]
)
</pre>
<p>それぞれの列の列制約、および表制約が必要ない場合は省略できます。また、2つ以上の制約を入れることもできます。</p>
<p>データ型、[列制約]、[表制約] に具体的に何が入れられるかは下で説明しています。</p>
<h4 class="wp-block-heading">データ型</h4>
<table>
<thead>
<tr>
<th>  種類  </th>
<th style="text-align:left;">  <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td>  int  </td>
<td style="text-align:left;">  整数  </td>
</tr>
<tr>
<td>  real  </td>
<td style="text-align:left;">  浮動小数  </td>
</tr>
<tr>
<td>  char(n)  </td>
<td style="text-align:left;">  n文字の固定長文字列  </td>
</tr>
<tr>
<td>  varchar(n)  </td>
<td style="text-align:left;">  n文字以下の可変長文字列  </td>
</tr>
<tr>
<td> date </td>
<td style="text-align:left;">  日付  </td>
</tr>
<tr>
<td> time </td>
<td style="text-align:left;">  時間  </td>
</tr>
</tbody>
</table>
<p><code>char</code> と <code>varchar</code> の違いに気をつけましょう。</p>
<p>例えば、<code>char(5)</code> であれば必ず「5文字」の文字列が格納される必要があります。一方 <code>varchar(5)</code> であれば「5文字以下」の文字列を格納することができます（5文字でなくてもOK）。</p>
<h4 class="wp-block-heading">列制約</h4>
<table>
<thead>
<tr>
<th>  種類  </th>
<th style="text-align:left;">  <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> unique </td>
<td style="text-align:left;"> 列内で値の重複を許さない </td>
</tr>
<tr>
<td> primary key </td>
<td style="text-align:left;"> 主キー扱いにする※ </td>
</tr>
<tr>
<td> not null </td>
<td style="text-align:left;"> 空値(NULL)を許さない </td>
</tr>
<tr>
<td> check(条件) </td>
<td style="text-align:left;"> 条件に一致する値のみを許す </td>
</tr>
<tr>
<td> default X </td>
<td style="text-align:left;"> 追加時の初期値をXとする </td>
</tr>
<tr>
<td> references 表名(列名) </td>
<td style="text-align:left;"> 外部キー扱いにする※ </td>
</tr>
</tbody>
</table>
<p>[※注意]</p>
<ul class="wp-block-list dbp-list"><li>primary keyを使って主キー制約を行うと、unique制約とnot null 制約も自動的に加わる<a href="#f-a5e2fcbe" name="fn-a5e2fcbe" title="主キーになるためには、列内で重複する値がなく、さらに値が空でない必要があるため。">*1</a></li><li>参照先は <code>references 表名(列名)</code> で指定した表、列となる</li></ul>
<h4 class="wp-block-heading">表制約</h4>
<p>表制約では (列名1, 列名2,…) と指定した列名に対して、一括で制約を加えることができます。</p>
<table>
<thead>
<tr>
<th>  種類  </th>
<th style="text-align:left;">  <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> unique(列名1,列名2,…) </td>
<td style="text-align:left;"> 値の重複を禁止に </td>
</tr>
<tr>
<td> primary key (列名1,列名2,…) </td>
<td style="text-align:left;"> 主キー扱いに </td>
</tr>
<tr>
<td> foreign key(列名1, 列名2)<br>references 表名 (列名1,列名2,…) </td>
<td style="text-align:left;"> 外部キー※ </td>
</tr>
<tr>
<td> check(条件) </td>
<td style="text-align:left;"> 表全体に対して条件を設定※ </td>
</tr>
</tbody>
</table>
<p>[※注意]</p>
<ul class="wp-block-list dbp-list"><li><code>foreign key(列名1, 列名2)</code> の部分で外部キーを設定し、<code>references</code> 以降で参照先を決定する</li><li><code>check(条件)</code> では、表全体に対して条件を満たすもののみを登録できるようにする</li></ul>
<h4 class="wp-block-heading">具体例</h4>
<p>具体的に表の定義例を見てみましょう。</p>
<p><b>表：メニュー</b></p>
<table>
<thead>
<tr>
<th>  番号 </th>
<th style="text-align:center;"> 名前  </th>
<th style="text-align:right;">  <center>値段</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> N001 </td>
<td style="text-align:center;"> カレー </td>
<td style="text-align:right;"> 250 </td>
</tr>
<tr>
<td> N002 </td>
<td style="text-align:center;"> ラーメン </td>
<td style="text-align:right;"> 300 </td>
</tr>
<tr>
<td> N003 </td>
<td style="text-align:center;"> 日替わり丼 </td>
<td style="text-align:right;"> 350 </td>
</tr>
<tr>
<td> N004 </td>
<td style="text-align:center;"> Aランチ </td>
<td style="text-align:right;"> 400 </td>
</tr>
<tr>
<td> N005 </td>
<td style="text-align:center;"> Bランチ </td>
<td style="text-align:right;"> 350 </td>
</tr>
</tbody>
</table>

<p>以下の条件を満たすように、表「メニュー」を定義してみましょう。</p>
<ul class="wp-block-list dbp-list"><li>必要な列は番号、メニュー、値段の3つ</li><li>番号は4文字の文字列型、メニューは10文字以内型、値段は0円以上の整数型</li><li>列「番号」に主キー制約を書ける</li></ul>

<p>実際に書いて見ると、以下のようになります。皆さんも同じになりましたか？</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">create</span> <span class="synSpecial">table</span> メニュー (
番号  <span class="synType">char</span>(<span class="synConstant">4</span>), primary key,
名前  <span class="synType">varchar</span>(<span class="synConstant">10</span>),
値段  int,
<span class="synSpecial">check</span>(値段 &gt;= <span class="synConstant">0</span>)
)
</pre>
<h3 class="wp-block-heading">(2) 表の変更</h3>
<p>表の変更 <code>alter</code> は、過去に1～2回ほど基本情報の午後問題で出題されたことがあります。（例えば<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2010h22_2/2010h22a_fe_pm_qs.pdf#page=9">平成22年度秋期</a>）</p>
<h4 class="wp-block-heading">列の追加</h4>
<p>列の追加と削除は念の為に覚えておくと安心。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">alter</span> <span class="synSpecial">table</span> 表名 <span class="synSpecial">add</span> 列名 データ型
</pre>
<p>列名　　：追加する列の名前<br>
データ型：追加する列のデータ型</p>
<h4 class="wp-block-heading">列の削除</h4>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">alter</span> <span class="synSpecial">table</span> 表名 <span class="synStatement">drop</span> 列名
</pre>
<p>列名　　：削除する列の名前</p>
<h4 class="wp-block-heading">表名の変更</h4>
<p>出ないから覚えなくてOK</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">alter</span> <span class="synSpecial">table</span> 旧表名 renames <span class="synSpecial">to</span> 新表名
</pre>
<h3 class="wp-block-heading">(3) 表の削除</h3>
<p><code>drop database</code> の <code>database</code> を <code>table</code> に変えただけ。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">drop</span> <span class="synSpecial">table</span> 削除する表名
</pre>
<h2 class="wp-block-heading">３．データの挿入(insert)・削除</h2>
<h3 class="wp-block-heading">(1) データの挿入</h3>
<p><code>insert</code> 文によるデータの挿入です。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> 表名 (列名<span class="synConstant">1</span>, 列名<span class="synConstant">2</span>, …)
<span class="synSpecial">values</span> (値<span class="synConstant">1</span>, 値<span class="synConstant">2</span>, …)
</pre>
<p>「列名1が値1、列名2が値2、…」となっているデータが挿入されます（列名1と値1、列名2と値2、のように同じ番号の列と値が1対1に対応しています。）。</p>
<p>例えば、下のように挿入を行うとします。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003757.gif" alt="f:id:momoyama1192:20201017003757g:plain" title="f:id:momoyama1192:20201017003757g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>このような操作を行うSQLは以下で表せます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> メニュー (番号, 名前, 値段) <span class="synSpecial">values</span> (<span class="synSpecial">'</span><span class="synConstant">N006</span><span class="synSpecial">'</span>, <span class="synSpecial">'</span><span class="synConstant">そば</span><span class="synSpecial">'</span>, <span class="synConstant">200</span>)
</pre>
<p>[注意]</p>
<ul class="wp-block-list dbp-list"><li>挿入対象は必ず1つの表（複数の表に同時挿入はできない）</li><li>文字列は必ず <code>''</code> で囲うこと</li></ul>
<h4 class="wp-block-heading">[応用] select文との併用</h4>
<p>データの挿入の際に <code>select</code> 文の結果をそのまま挿入することもできます。</p>
<p><code>select</code> 文の結果を挿入する場合、<code>values (値1, 値2,…)</code> の部分に <code>select</code> 文が入ります。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> 表名 (列<span class="synConstant">1-1</span>, 列<span class="synConstant">1-2</span>, …) <span class="synStatement">select</span> 列<span class="synConstant">2-1</span>, 列<span class="synConstant">2-2</span>, … <span class="synSpecial">from</span> 参照表名 <span class="synSpecial">where</span> 条件
</pre>
<p>[注意]</p>
<ul class="wp-block-list dbp-list"><li>列1-1と列1-2、列2-1と列2-2、…のように列の並びが1対1に対応するようにすること</li><li>whereによる条件が不要であれば省略もOK</li></ul>

<p>例えば、右側にある表「一覧」からジャンルが「うどん」であるものを表「メニュー」に追加する場合を考えましょう。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003819.gif" alt="f:id:momoyama1192:20201017003819g:plain" title="f:id:momoyama1192:20201017003819g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>この処理は、以下のSQLで実現できます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">insert</span> <span class="synSpecial">into</span> メニュー (番号, 名前, 値段)
<span class="synStatement">select</span> 番号, 名前, 値段 <span class="synSpecial">from</span> 一覧 <span class="synSpecial">where</span> ジャンル = <span class="synSpecial">'</span><span class="synConstant">うどん</span><span class="synSpecial">'</span>
</pre>
<h3 class="wp-block-heading">(2) データの更新</h3>
<p>列を指定する部分では、更新する列と値のみを記述すればOKです。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">update</span> 表名 <span class="synStatement">set</span> 列<span class="synConstant">1</span> = 値<span class="synConstant">1</span>, 列<span class="synConstant">2</span> = 値<span class="synConstant">2</span>, … <span class="synSpecial">where</span> 条件
</pre>
<p>[注意]</p>
<ul class="wp-block-list dbp-list"><li>条件には、select文で使える条件と同じものが使える（<code>between</code> やら <code>in</code> やら <code>like</code> なども使用OK）</li><li>必要がなければ <code>where 条件</code> は不要</li></ul>

<p>先程出てきた下の表で具体例を考えてみましょう。</p>
<p><b>表：メニュー</b></p>
<table>
<thead>
<tr>
<th>  番号 </th>
<th style="text-align:center;"> 名前  </th>
<th style="text-align:right;">  <center>値段</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td> N001 </td>
<td style="text-align:center;"> カレー </td>
<td style="text-align:right;"> 250 </td>
</tr>
<tr>
<td> N002 </td>
<td style="text-align:center;"> ラーメン </td>
<td style="text-align:right;"> 300 </td>
</tr>
<tr>
<td> N003 </td>
<td style="text-align:center;"> 日替わり丼 </td>
<td style="text-align:right;"> 350 </td>
</tr>
<tr>
<td> N004 </td>
<td style="text-align:center;"> Aランチ </td>
<td style="text-align:right;"> 400 </td>
</tr>
<tr>
<td> N005 </td>
<td style="text-align:center;"> Bランチ </td>
<td style="text-align:right;"> 350 </td>
</tr>
</tbody>
</table>

<p>例えば、ラーメンの値段を20円下げるのであれば以下のSQLで実現できます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">update</span> メニュー <span class="synStatement">set</span> 値段 = 値段 - <span class="synConstant">20</span> <span class="synSpecial">where</span> 名前 = <span class="synSpecial">'</span><span class="synConstant">ラーメン</span><span class="synSpecial">'</span>
</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003810.gif" alt="f:id:momoyama1192:20201017003810g:plain" title="f:id:momoyama1192:20201017003810g:plain" class="hatena-fotolife" itemprop="image"></span></p>

<p>同じように、全部のメニューを50円値下げするSQLは以下のように書けます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">update</span> メニュー <span class="synStatement">set</span> 値段 = 値段 - <span class="synConstant">50</span>
</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003815.gif" alt="f:id:momoyama1192:20201017003815g:plain" title="f:id:momoyama1192:20201017003815g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h3 class="wp-block-heading">(3) データの削除</h3>
<p>データの削除方法も確認しておきましょう。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">delete</span> <span class="synSpecial">from</span> 表名 <span class="synSpecial">where</span> 条件
</pre>
<p>例えば、先程の表「メニュー」から、Bランチを削除するのであれば以下のSQLで記述できます。</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">delete</span> <span class="synSpecial">from</span> メニュー <span class="synSpecial">where</span> 名前 = <span class="synSpecial">'</span><span class="synConstant">Bランチ</span><span class="synSpecial">'</span>
</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20201017003802.gif" alt="f:id:momoyama1192:20201017003802g:plain" title="f:id:momoyama1192:20201017003802g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">４．権限の変更</h2>
<p>基本情報ではあまり重要ではないので、基本情報で受験するだけであれば読み飛ばしてもらってOKです。</p>

<p>権限名には、以下の5つを選ぶことができます。</p>
<table>
<thead>
<tr>
<th style="text-align:center;">  名前 </th>
<th style="text-align:center;"> <center>説明</center>  </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center;"> select </td>
<td style="text-align:center;"> 検索 </td>
</tr>
<tr>
<td style="text-align:center;"> update </td>
<td style="text-align:center;"> 更新 </td>
</tr>
<tr>
<td style="text-align:center;"> insert </td>
<td style="text-align:center;"> 挿入 </td>
</tr>
<tr>
<td style="text-align:center;"> delete </td>
<td style="text-align:center;"> 削除 </td>
</tr>
<tr>
<td style="text-align:center;"> all privileges </td>
<td style="text-align:center;"> 上の4つ全部 </td>
</tr>
</tbody>
</table>
<h3 class="wp-block-heading">(1) 権限の付与</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">grant</span> 権限名 <span class="synSpecial">on</span> 表名 <span class="synSpecial">to</span> ユーザー名
</pre>
<p>例：<code>owner</code> には表「メニュー」に対しての全部の権限を付与する</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">grant</span> <span class="synStatement">all</span> <span class="synSpecial">privileges</span> <span class="synSpecial">on</span> メニュー <span class="synSpecial">to</span> owner
</pre>
<h3 class="wp-block-heading">(2) 権限の取り消し</h3>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">revoke</span> 権限名 <span class="synSpecial">on</span> 表名 <span class="synSpecial">to</span> ユーザー名
</pre>
<p>例：<code>momoyama</code> には表「メニュー」に対しての削除の権限を剥奪する</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">revoke</span> <span class="synStatement">delete</span> <span class="synSpecial">on</span> メニュー <span class="synSpecial">to</span> momoyama
</pre>
<h2 class="wp-block-heading">５．さいごに</h2>
<p>今回は、少しシンプルにSQLの中編として、以下の4つについて説明しました。</p>
<ul class="wp-block-list dbp-list"><li>データベースの作成、削除</li><li>表の定義, 構造変更, 削除</li><li>データの挿入, 削除</li><li>データベースの権限</li></ul>
<p>後編では、さらに応用として、以下の3つを中心に説明する予定です。</p>
<ul class="wp-block-list dbp-list"><li>複数の表を用いた <code>select</code> 文</li><li>副問合せ</li><li>仮想的な表「ビュー」の定義、利用</li></ul>
<div class="footnote">
<p class="footnote"><a href="#fn-a5e2fcbe" name="f-a5e2fcbe" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">主キーになるためには、列内で重複する値がなく、さらに値が空でない必要があるため。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database04/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第03羽　SQL前編（select文の使い方とその応用）</title>
		<link>https://www.momoyama-usagi.com/entry/info-database03</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database03#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Fri, 18 Sep 2020 01:03:05 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database03</guid>

					<description><![CDATA[基本情報の午前午後ともに頻出のSQLを３回に分けて説明しています。前編ではselect文の使い方とその応用例として複雑な条件の指定、集合関数の使い方、group by, having による場合分けを用いた集計、表の結合、表のソートなどについてまとめています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回から3回に分けてSQLの基礎について勉強していきましょう。</p>

<p>初回となる今回は、表を検索するために使うselect文の使い方を、少し応用的なところまで見てきましょう。</p>


<p>なお、重要度は「基本情報で必要かどうか」を基準に設定しています。★の意味は、以下の通りです。</p>
<ul class="wp-block-list dbp-list"><li>★★★：超重要、よく出る</li><li>★★☆：重要、結構出る</li><li>★☆☆：余裕があれば見とこうね</li></ul>
<h2 class="wp-block-heading">1．select文の基本　重要度：★★★</h2>
<p>select文では、関係データベース内に保存されているデータ（つまり表）の中から、条件に合致したものを抽出するのが基本です。</p>
<p>まずは、select文の基本的な使い方を見てきましょう。</p>
<h3 class="wp-block-heading">(1) 列の抽出（射影）</h3>
<p>射影演算は、<span class="marker-yellow"><b>表の中から列を取り出す演算</b></span>でしたね。</p>
<p>select文を用いて列を抽出する場合、列名の部分に抽出したい列名を列挙します。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名</pre>
<p>例えば下の例の場合、関係「学生一覧」の中から、「名前」、「学年」の列を取り出し、表示します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212424.gif" alt="f:id:momoyama1192:20200908212424g:plain" title="f:id:momoyama1192:20200908212424g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、下のように<span class="marker-yellow"><b>列名部分に <code>*</code> をつけると、すべての列を抽出</b></span>します。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生一覧</pre>
<h3 class="wp-block-heading">(2) 全く同じデータを表示させない方法 (distinct)</h3>
<p>射影演算の厳密な定義は<span class="marker-pink"><b>全く同じデータを2回以上出力しません</b></span>。</p>
<p>しかし、単にselect文で列を指定しただけだと、下のように重複したデータが2回以上出力されてしまう可能性があります。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212430.gif" alt="f:id:momoyama1192:20200908212430g:plain" title="f:id:momoyama1192:20200908212430g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>そこで、下のように列名を列挙する前に <code>distinct</code> をつけることで、<span class="marker-yellow"><b>重複データを2回以上出力させなくすること</b></span>ができます。</p>
<pre class="code" data-lang="" data-unlink>select distinct 列名 from 表名</pre>
<p>例えば下の例の場合、工学部と情報工学部が1度だけ出力されます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212435.gif" alt="f:id:momoyama1192:20200908212435g:plain" title="f:id:momoyama1192:20200908212435g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h3 class="wp-block-heading">(3) 行の抽出（選択）</h3>
<p>選択演算は、表の中から行を取り出す演算でしたね。</p>
<p>select文を用いて行を抽出する場合、<span class="marker-yellow"><b>where 以降の「条件」に一致するものを抽出</b></span>します。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件</pre>
<p>下の例の場合、関係「学生一覧」の中から、「学年が2であるもの（2年生）」を抽出します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212440.gif" alt="f:id:momoyama1192:20200908212440g:plain" title="f:id:momoyama1192:20200908212440g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">2．条件文の書き方　重要度：★★★</h2>
<p>第2章では、where以降で指定できる条件の書き方について見ていきましょう。</p>
<h3 class="wp-block-heading">(1) 条件の複数指定 (and, or)</h3>
<p>Excelやプログラミングと同じように、複数の条件を <code>and</code> (かつ) や <code>or</code> (または) で指定することができます。</p>
<h4 class="wp-block-heading">and（2つの条件をともに満たす行を出力）</h4>
<p><code>where 条件1 and 条件2</code> と書くことで、条件1、条件2を両方とも満たすものを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件1 and 条件2</pre>
<p>下の例の場合、「学年が1(1年生)」と「取得単位が30未満」の両方を満たす行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212445.gif" alt="f:id:momoyama1192:20200908212445g:plain" title="f:id:momoyama1192:20200908212445g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h4 class="wp-block-heading">or（2つの条件を片方でも満たす行を出力）</h4>
<p><code>where 条件1 or 条件2</code> と書くことで、条件1、条件2のうち、片方でも満たすものを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件1 or 条件2</pre>
<p>下の例の場合、「学年が1(1年生)」と「取得単位が70未満」のうち、片方もしくは両方満たす行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200918094714.gif" alt="f:id:momoyama1192:20200918094714g:plain" title="f:id:momoyama1192:20200918094714g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h3 class="wp-block-heading">(2) 条件の否定 (not)</h3>
<p>条件の最初に <code>not</code> をつけると、条件を満たさないものを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where not 条件</pre>
<p>下の例の場合、「学部が情報学部ではない」行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212456.gif" alt="f:id:momoyama1192:20200908212456g:plain" title="f:id:momoyama1192:20200908212456g:plain" class="hatena-fotolife" itemprop="image"></span></p>

<p>また、下のように <code>and</code>, <code>or</code> と <code>not</code> と組み合わせて条件を記述することができます。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生一覧 where not 学年 = 1 or 取得単位 &lt; 70 </pre>
<p>ただし、処理順序に気をつけましょう。(not → and → orの順に処理が行われます）</p>
<p>自分で記述をする際には、下のように<span class="marker-yellow"><b>括弧をつけて計算順序を明確化させておく</b></span>ことをおすすめします。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生一覧 where (not 学年 = 1) or (取得単位 &lt; 70) </pre>
<h3 class="wp-block-heading">(3) 範囲の指定 (between)</h3>
<p>条件の部分に <code>列名 between A and B</code> と書くことで、A以上B以下のデータを取り出すことができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 列名 between A and B</pre>
<p>下の例の場合、取得単位が40以上80以下である行を取り出し、出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212502.gif" alt="f:id:momoyama1192:20200908212502g:plain" title="f:id:momoyama1192:20200908212502g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、notを付け加えて <code>not between A and B</code> とすることで、値がA以上B以下ではないデータを取り出すことができます。</p>
<h3 class="wp-block-heading">(4) 指定した項目を抽出 (in)</h3>
<p>条件の部分を <code>列名 in (値1, 値2, …)</code> とすることで、括弧内で指定した値のどれかと一致するデータを出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 列名 in (値1, 値2, …)</pre>
<p>下の例の場合、学部が「文学部」もしくは「経済学部」となっている行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212510.gif" alt="f:id:momoyama1192:20200908212510g:plain" title="f:id:momoyama1192:20200908212510g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、notを付け加えて <code>not in (値1, 値2, …)</code> とすることで、括弧内で指定した値と一致しないデータを出力することができます。</p>
<h3 class="wp-block-heading">(5) 指定したパターンを出力 (like)</h3>
<p>条件の部分を <code>列名 like '文字パターン'</code> とすることで、特定の文字パターンと一致（部分一致）する行を出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 列名 like '文字パターン'</pre>
<p>文字パターンの指定では、下の２つのワイルドカードを使うことができます。</p>
<pre class="code" data-lang="" data-unlink>% → 任意の文字列
_ → 任意の1文字</pre>
<p>下の例の場合、番号が「Aで始まる」行を出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212514.gif" alt="f:id:momoyama1192:20200908212514g:plain" title="f:id:momoyama1192:20200908212514g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>また、notを付け加えて <code>not like '文字パターン'</code> とすることで、特定の文字パターンと一致しない行を出力することができます。</p>
<h3 class="wp-block-heading">(6) 空からどうかの判定 (ls null)　重要度：★★☆</h3>
<p><code>where 項目名 is null</code>  とすることで、項目が空になっているものを出力します。</p>
<p>ただし、実際には <code>is not null</code> のように not を付け加えて「項目が殻になっていない」ものを出力させることが多いです。</p>
<p>例えば、下のSQLの書き方であれば、番号（学生番号のこと）が空になっていない学生を出力することができます。</p>
<pre class="code" data-lang="" data-unlink>select 番号, 名前 from 受講一覧 where 番号 is not null </pre>
<h2 class="wp-block-heading">３．結果のソート (order by)　重要度：★★★</h2>
<p>条件を指定したあとに <code>order by</code> を付け加えることで出力結果に対して、昇順(asc)もしくは降順(desc)でソートを行うことができます。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件 order by 列名 ソート方法(asc / desc)</pre>
<p>下の例の場合、出力結果を点数の昇順(asc)でソートしたものを改めて出力します。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212522.gif" alt="f:id:momoyama1192:20200908212522g:plain" title="f:id:momoyama1192:20200908212522g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>なお、昇順ソートを行う場合は<span class="marker-yellow"><b>ソート方法を示す asc を省略</b></span>することができます。そのため、下のSQLでも先程の例と同じ結果を得ることができます。</p>
<pre class="code" data-lang="" data-unlink>select * from 受講一覧 order by 点数</pre>
<h3 class="wp-block-heading">2つ以上の列を用いたソート</h3>
<p>複数の列を用いてもソートすることができます。ただし、<span class="marker-yellow"><b>列名ごとに昇順(asc)か降順(desc)を指定</b></span>する必要があります。（昇順であれば省略OK）</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表名 where 条件 order by 列名1 条件1, 列名2 条件2, …</pre>
<p>複数の列を用いる場合、</p>
<ul class="wp-block-list dbp-list"><li>まずは1つ目の列の値でソート</li><li>1つ目の列の値が同じ行のみ、2つ目を確認し、ソート</li><li>さらに同じであれば3つ目……</li></ul>
<p>と行います。</p>
<p>下の例の場合、</p>
<ul class="wp-block-list dbp-list"><li>まずは国語の値が昇順になるように並べる</li><li>国語が同じ値の行に対し、数学の値が降順になるように並べる</li></ul>
<p>の２段階の処理が行われます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212527.gif" alt="f:id:momoyama1192:20200908212527g:plain" title="f:id:momoyama1192:20200908212527g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">４．様々な集合関数　重要度：★★★</h2>
<p>SQLでは集計を行う様々な関数（集合関数と呼びます）を使うことができます。</p>
<p>よく出てくる関数を下に載せておきます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200918094718.gif" alt="f:id:momoyama1192:20200918094718g:plain" title="f:id:momoyama1192:20200918094718g:plain" class="hatena-fotolife" itemprop="image"></span></p>

<p>実際に関数を用いて計算をするときは、下のように <code>列名</code> の部分に関数名を入れることで、関数を用いた演算を行えます。</p>
<pre class="code" data-lang="" data-unlink>select count(*) from 受験一覧  # 表に格納されている行の数を出力
select avg(点数) from 受験一覧 #  点数の平均値を出力</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212532.gif" alt="f:id:momoyama1192:20200908212532g:plain" title="f:id:momoyama1192:20200908212532g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h2 class="wp-block-heading">５．集合関数の応用1（グループごとの出力 group by）重要度：★★★</h2>
<p>ここからは、集合関数の応用的な使い方を見てきましょう。</p>
<p><code>group by 列名</code> とすることで、指定した列内にあるデータの種類それぞれに対して集合関数を適用することができます。</p>
<p>例えば、<code>group by 学部</code> とすると、各学部ごとに集合関数を適用することができます。</p>
<pre class="code" data-lang="" data-unlink>select 学部, count(*) from 受験一覧 group by 学部   # 学部ごとに行をcountする
select 学部, avg(得点) from 受験一覧 group by 学部  # 学部ごとの得点の平均（平均点）を求める</pre>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212549.gif" alt="f:id:momoyama1192:20200908212549g:plain" title="f:id:momoyama1192:20200908212549g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>なお、<code>select 学部, count(*)</code> のところを <code>select count(*)</code> のように「学部」を消してしまうと、数字だけが出力されるので要注意です。（どの数字がどの学部と対応しているかがわからなくなる）</p>
<h3 class="wp-block-heading">条件をつけた絞り込み (having)</h3>
<p>グループごとに集合関数を適用するときに、特定の条件を満たしたものだけを出力させたいと思うかもしれません。</p>
<p>このようにグループ化した後に、ある条件を満たしたものだけ出力する際には <code>group by 列名</code> の後に <code>having 条件</code> を付け加えます。</p>
<pre class="code" data-lang="" data-unlink>select 出力する列名, 集合関数 from 表名 group by 列名 having 条件</pre>
<p>（group by に対する条件指定では where は使わないので注意！）</p>

<p>下の例の場合、学部ごとの平均点を求めたあと、70点以上の学部のみを出力しています。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212554.gif" alt="f:id:momoyama1192:20200908212554g:plain" title="f:id:momoyama1192:20200908212554g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<h4 class="wp-block-heading">having と where の違い</h4>
<p><code>having</code> と <code>where</code> はどちらも抽出条件を定めるものですね。</p>
<p>しかし、なぜ group by を使ったときにだけ <code>where</code> を使わずに <code>having</code> を使わなければならないのでしょうか。</p>

<p>まず、<code>group by</code>, <code>where</code>, <code>having</code> の3つはそれぞれ呼び出される優先順位があり、下のようになっています。</p>
<ul class="wp-block-list dbp-list"><li>where</li><li>group by</li><li>having</li></ul>
<p>つまり、</p>
<ul class="wp-block-list dbp-list"><li><code>where</code> は <code>group by</code> の前に実行されるため、グループ化する前の元々のデータに対して絞りこみ条件を指定する</li><li><code>having</code> は <code>group by</code> の後に実行されるため、グループ化後の表に対しての絞りこみ条件を指定する</li></ul>
<p>ことになります。</p>
<p>そのため、グループ化後の表に対して条件を指定する際には、<code>where</code> ではなく <code>having</code> を使う必要があるのです。</p>

<p>逆に言うと、<code>group by</code> を使わなければ <code>having</code> も <code>where</code> も全く同じ働きをします。</p>
<p>そのため、多くの参考書では <span class="marker-yellow"><b><code>having</code> は <code>group by</code> に対して使うもの</b></span>と説明されています。</p>
<h2 class="wp-block-heading">６．集合関数の応用2（入れ子として使用）重要度：★★☆</h2>
<p>集合関数の結果を、<code>where</code> や <code>having</code> の条件として使うことができます。</p>
<p>例えば、下のように「受験一覧」から平均点以上をとっている人の行を抽出することができます。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212542.gif" alt="f:id:momoyama1192:20200908212542g:plain" title="f:id:momoyama1192:20200908212542g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>集合関数を絞り込みの条件として使う際には、条件文の中にselect文を入れる必要があることに注意しましょう。</p>
<p>例えば、抽出をする際に <code>点数 &gt;= avg(点数)</code> のように<span class="marker-pink"><b>直接集合関数を用いて比較をすることはできません</b></span>。</p>

<p>入れ子を用いたSQLについては、SQLの後編（応用）で詳しく説明します。</p>
<h2 class="wp-block-heading">７．列名の付け替え (as)　重要度：★☆☆</h2>
<p><code>select 列名 from 表名</code> で列名を指定する際に、<code>as 新列名</code> とすることで、出力結果の列名を付け替えることができます。（※asは省略OK）</p>
<pre class="code" data-lang="" data-unlink>select 列名 as 新列名 from 表名
select 列名 新列名 from 表名  # as を省略</pre>
<p>下の例の場合、列名 <code>count(*)</code> を <code>合計</code> と付け加えて出力しています。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212611.gif" alt="f:id:momoyama1192:20200908212611g:plain" title="f:id:momoyama1192:20200908212611g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p><code>as</code> は上の例のように、集合関数の名前を付け替える際に使われることが多いです。</p>
<p>なお、複数の列名を指定している場合、付け替えたい列名のみに <code>as 新列名</code> を付け加えます。（asは省略OK）</p>
<p>下の例の場合、列名1と列名2をそれぞれ新列名1、新列名2と付け替えて出力をします。</p>
<pre class="code" data-lang="" data-unlink>select 列名1 as 新列名1, 列名2 as 新列名2, 列名3 from 表名</pre>
<p>名前の付け替えは、基本的にめったに出ないので「こんなことができるんだ～」程度の理解度でOKです。</p>
<h2 class="wp-block-heading">８．複数の表から結果を得る（表の結合）重要度：★★★</h2>
<p>2つ以上の表を読み込むことにより、複数の表から結果を得ることができます。</p>
<p>ただし、2つの表をくっつけるための結合条件を書く必要があります。</p>
<pre class="code" data-lang="" data-unlink>select 列名 from 表1, 表2 where 結合条件</pre>
<p>例えば下の2つの表を結合させる場合、両方の表にある「学部コード」を結合条件として使います。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212558.gif" alt="f:id:momoyama1192:20200908212558g:plain" title="f:id:momoyama1192:20200908212558g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>しかし、whereで結合条件を示す際に <code>学部コード = 学部コード</code> と書いてしまうと、どっちの表の学部コードを読み込むかがわかりません。</p>
<p>そのため、読み込む表の中に同じ項目がある場合、<code>表名.列名</code> とすることで、<span class="marker-yellow"><b>どの表の列名なのかを明らかにします</b></span>。</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200908212604.gif" alt="f:id:momoyama1192:20200908212604g:plain" title="f:id:momoyama1192:20200908212604g:plain" class="hatena-fotolife" itemprop="image"></span></p>
<p>なお、列名部分を <code>*</code> としても同じ結果を得ることができます<a href="#f-90706547" name="fn-90706547" title="余談ですが、今回は学生の「学部コード」と学部の「学部コード」の列名が同じなので、重複した列名が２回出てきません（自然結合）。しかし、学生の「学部コード」と学部の「コード」のように、重複した列名になっていない場合は重複した列名が２回出てきてしまう（単結合）ので注意が必要です。">*1</a>。</p>
<pre class="code" data-lang="" data-unlink>select * from 学生, 学部 where 学生.学部コード = 学部.学部コード</pre>
<h2 class="wp-block-heading">９．まとめ</h2>
<p>今回はSQL前編として、select文の使い方を少し応用的なところまで見ていきました。</p>
<p>最後に、今回出てきた <code>select</code>, <code>from</code>, <code>where</code>, <code>group by</code>, <code>order by</code>, <code>having</code> をどの順番で並べるか確認しましょう。</p>

<p>まず、select文を使う場合、最初に <code>select 表示させる列名 from 使う表名</code> を必ず列挙する必要があります。その後必要であれば <code>where</code>, <code>group by</code>, <code>having</code>, <code>order by</code> の順に記します。</p>
<pre class="code" data-lang="" data-unlink>select 表示させる列名 from 使う表名 where 絞り込む条件 group by グループ化させる列名 having グループ化後の抽出条件 order by ソートに使う列名 (asc/desc)</pre>

<p>次回は、表の作成、更新などの <code>select</code> 文以外のSQLを紹介します。</p>
<div class="footnote">
<p class="footnote"><a href="#fn-90706547" name="f-90706547" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">余談ですが、今回は学生の「学部コード」と学部の「学部コード」の列名が同じなので、重複した列名が２回出てきません（自然結合）。しかし、学生の「学部コード」と学部の「コード」のように、重複した列名になっていない場合は重複した列名が２回出てきてしまう（単結合）ので注意が必要です。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database03/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第02羽　関係演算</title>
		<link>https://www.momoyama-usagi.com/entry/info-database02</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database02#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sun, 06 Sep 2020 04:43:38 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database02</guid>

					<description><![CDATA[今回は、データベースの中でも射影、選択、結合のような関係演算について例を踏まえながらわかりやすく説明しています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回はデータベースで出てくる関係演算について一緒にお勉強しましょう！</p>
<p> </p>
<p>関係演算には、集合でもよく使われる</p>
<ul class="wp-block-list dbp-list"><li>和</li><li>積</li><li>差</li><li>直積</li></ul>
<p>の4つと、データベースの関係演算独自の、</p>
<ul class="wp-block-list dbp-list"><li><strong><span class="marker-yellow">選択</span></strong></li><li><strong><span class="marker-yellow">射影</span></strong></li><li><strong><span class="marker-yellow">結合</span></strong></li><li>商</li></ul>
<p>の4つがあります。</p>
<p>特に今黄色い線を引いた3つは、基本情報の試験や期末試験にも頻出する超重要な演算です。必ず覚えましょう。</p>
<p> </p>
<h2 class="wp-block-heading">１．集合演算</h2>
<p>まずは、集合演算について見ていきましょう。</p>
<h3 class="wp-block-heading">(1) 和</h3>
<p>2つの表に対して、論理和(OR)を行う演算です。</p>
<p>つまり、2つの表のうち、<strong><span class="marker-yellow">どちらか一方でも存在する行を出力</span></strong>します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230535.gif" alt="f:id:momoyama1192:20200905230535g:plain" title="f:id:momoyama1192:20200905230535g:plain" class="hatena-fotolife" itemprop="image"></p>
<h4 class="wp-block-heading">演算が成立するための条件</h4>
<p>和、積、差の計算では、以下の2つの条件がそろっていない場合、そもそも計算を行うことができません。</p>
<p> </p>
<p><strong>(a) 2つの表の項目数が異なる場合</strong></p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230541.gif" alt="f:id:momoyama1192:20200905230541g:plain" title="f:id:momoyama1192:20200905230541g:plain" class="hatena-fotolife" itemprop="image"></p>
<p><strong>(b) 2つの表の項目名が異なる場合</strong></p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230546.gif" alt="f:id:momoyama1192:20200905230546g:plain" title="f:id:momoyama1192:20200905230546g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>基本的に、<strong><span class="marker-pink">2つの表の項目が全く同じでないと演算ができない</span></strong>と思っていただけたらOKです。</p>
<h3 class="wp-block-heading">(2) 積</h3>
<p>2つの表に対して、論理積(AND)を行う演算です。</p>
<p>つまり、<strong><span class="marker-yellow">2つの表の両方に存在する行を出力</span></strong>します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230550.gif" alt="f:id:momoyama1192:20200905230550g:plain" title="f:id:momoyama1192:20200905230550g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>和演算と同じく、2つの表にある項目が全く等しいときのみ演算を行うことができます。</p>
<h3 class="wp-block-heading">(3) 差</h3>
<p>2つの表に対して、演算元にある行の中から、演算先の行にないものを出力します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230555.gif" alt="f:id:momoyama1192:20200905230555g:plain" title="f:id:momoyama1192:20200905230555g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>差の演算は、今まで紹介してきた和や積の演算と異なり、<strong><span class="marker-yellow">計算順序を変えると演算結果も変わる</span></strong>ため、注意が必要です。</p>
<p>また、和演算・差演算と同じく、2つの表にある項目が全く等しいときのみ演算を行うことができます。</p>
<h3 class="wp-block-heading">(4) 直積</h3>
<p><strong>2つの表にある項目のすべての組み合わせ</strong>を出力します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230602.gif" alt="f:id:momoyama1192:20200905230602g:plain" title="f:id:momoyama1192:20200905230602g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<h2 class="wp-block-heading">２．関係演算（データベース独自）</h2>
<p>つぎに、データベース独自の関係演算について見ていきましょう。</p>
<p>ここからが超重要ですよ！</p>
<h3 class="wp-block-heading">(1) 選択</h3>
<p><strong><span class="marker-yellow">ある条件に従って特定の行を取り出す演算</span></strong>が<strong><span class="marker-green">選択</span></strong>です。</p>
<p>（条件を \( c \)、表名を \( P \) とし、\( \sigma_c (P) \) と記号で表されます。）</p>
<p>（※記号については、基本情報などの情報処理試験では出ないので覚えなくてOKです） </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230607.gif" alt="f:id:momoyama1192:20200905230607g:plain" title="f:id:momoyama1192:20200905230607g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>例えば、上の例の場合、表Pから「部活がサッカー部の人」を行単位で出力しています。</p>
<h4 class="wp-block-heading">SQLでの選択の書き方</h4>
<p>SQLの場合、以下の青線部分が「選択演算」に相当します。（where句以降ですね。）</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125033.gif" alt="f:id:momoyama1192:20200906125033g:plain" title="f:id:momoyama1192:20200906125033g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※SQLについては第03羽で詳しく説明するので、まだわからなくてもOKです。</p>
<h3 class="wp-block-heading">(2) 射影</h3>
<p><strong><span class="marker-yellow">ある条件に従って特定の列を取り出す演算</span></strong>が<strong><span class="marker-green">射影</span></strong>です。</p>
<p>（選択する項目(列)を \( i \)、表名を \( P \) とし、\( \pi_i (P) \) と記号で表されます。） </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230613.gif" alt="f:id:momoyama1192:20200905230613g:plain" title="f:id:momoyama1192:20200905230613g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>例えば、上の例の場合、表Pから 名前, 部活 の列を抽出し、出力しています。</p>
<h4 class="wp-block-heading">重複に注意！</h4>
<p>射影の演算では、選択する列によっては、下のように行内のすべてのデータが全く同じになってしまうことがあります。</p>
<p>この場合、全く同じデータとなるものは最初の1回だけ出力し、2回目以上は出力しません。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230620.gif" alt="f:id:momoyama1192:20200905230620g:plain" title="f:id:momoyama1192:20200905230620g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>射影演算では、重複するデータを2度以上出力しないと頭の中に入れておきましょう！</p>
<h4 class="wp-block-heading">SQLでの射影の書き方</h4>
<p>SQLの場合、以下の赤線部分が「射影」に相当します。</p>
<p> </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125038.gif" alt="f:id:momoyama1192:20200906125038g:plain" title="f:id:momoyama1192:20200906125038g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>重複データを2回以上出力しない disctinct が必要な点に注意しましょう。 </p>
<p>※SQLについては第03羽で詳しく説明します。</p>
<p> </p>
<h3 class="wp-block-heading">(3) 結合</h3>
<p><strong><span class="marker-yellow">2つの表をある共通の列を用いてくっつける演算</span></strong>が<strong><span class="marker-green">結合</span></strong>です。</p>
<p>結合演算には、</p>
<ul class="wp-block-list dbp-list"><li>等結合</li><li>自然結合</li></ul>
<p>の2つがあります。それぞれ見ていきましょう。</p>
<h4 class="wp-block-heading">(a) 等結合</h4>
<p>等結合は2つの表をある共通の列を用いて<strong><span class="marker-yellow">単純にくっつける</span></strong>演算です。</p>
<p>ただし、単純にくっつけるため、同じ意味を持った項目（ピンクの枠部分）が2つあって冗長になってしまいます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230624.gif" alt="f:id:momoyama1192:20200905230624g:plain" title="f:id:momoyama1192:20200905230624g:plain" class="hatena-fotolife" itemprop="image"></p>
<h4 class="wp-block-heading">(b) 自然結合</h4>
<p>等結合では、同じ意味を持った項目が2回出てきて冗長になってしまいます。</p>
<p>そこで、共通の列のうちの片方を削除する<a href="#f-525aa54d" name="fn-525aa54d" title="基本的に後者の列が消されることが多いです。つまり、結合元Pと結合先Qを自然結合させる場合、共通の列のうち、結合先Qの列を削除することが多いです。">*1</a>ことで<strong><span class="marker-yellow">冗長性を取り除いて結合</span></strong>したものが<strong><span class="marker-green">自然結合</span></strong>となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230630.gif" alt="f:id:momoyama1192:20200905230630g:plain" title="f:id:momoyama1192:20200905230630g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>特に指示がない限り、結合と言われたら、こちらの自然結合を表していると思っていただけたらOKです。</p>
<h4 class="wp-block-heading">(c) 結合演算の仕組み</h4>
<p>結合演算は、<strong><span class="marker-yellow">直積と選択の2つを組み合わせた</span></strong>演算です。</p>
<p>どうしてこの2つを組み合わせたら結合演算になるのかを、実際に1つ例で試すことで確認しましょう。</p>
<p><strong>Step1. 2つの表の直積を取る</strong></p>
<p>まず、2つの表の直積を求めることですべての組み合わせを求めます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230635.gif" alt="f:id:momoyama1192:20200905230635g:plain" title="f:id:momoyama1192:20200905230635g:plain" class="hatena-fotolife" itemprop="image"></p>
<p><strong>Step2. くっつけるための条件</strong></p>
<p>すべての組み合わせの中で、くっつけるための条件を満たすもの（結合元の列と結合先の列が等しい）を選択します。</p>
<p>（さらに、自然結合の場合、結合先の列を削除します。）</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230641.gif" alt="f:id:momoyama1192:20200905230641g:plain" title="f:id:momoyama1192:20200905230641g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>確かに、結合演算は直積と選択の2つで表せることを確認しましたね。</p>
<h4 class="wp-block-heading">(d) 結合の際の注意</h4>
<p>結合演算を用いる際には、結合するための列条件の書き方に注意が必要です。</p>
<p>例えば、下のP, Qの表を結合させる場合、条件で「部活=部活」と書いてしまうと、<strong><span class="marker-yellow">どちらの表にある部活なのかがわからなく</span></strong>なってしまいます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230646.gif" alt="f:id:momoyama1192:20200905230646g:plain" title="f:id:momoyama1192:20200905230646g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>このように項目名が2つの表で重複してしまう場合、どの表にある項目かを「表名.項目名」の形で書く必要があります。</p>
<p>例えば、上の例の場合、条件は、</p>
<p>学生.部活 = 部.部活</p>
<p>のように明記します。</p>
<h4 class="wp-block-heading">SQLでの選択の書き方</h4>
<p>SQLの場合、以下の青線部分が「結合」に相当します。</p>
<p>直積を意識せずに書けることが特徴ですが、項目名が2つの表で重複する場合は「表名.項目名」のように<strong><span class="marker-yellow">どの表の項目であるかを明記</span></strong>する必要があります。</p>
<p> </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125047.gif" alt="f:id:momoyama1192:20200906125047g:plain" title="f:id:momoyama1192:20200906125047g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※SQLについては第03羽で詳しく説明します。</p>
<p> </p>
<h3 class="wp-block-heading">(4) 商</h3>
<p>直積を逆算したものが商となります。</p>
<p>といきなり言われてもわかりにくいと思うので、実際に1つ例で確かめてみましょう。</p>
<p> </p>
<p>例えば、下のような演算でできる表 \( R \) があります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200905230652.gif" alt="f:id:momoyama1192:20200905230652g:plain" title="f:id:momoyama1192:20200905230652g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>表 \( R \) は \( P \times Q \) の直積演算によってできた表ですね。</p>
<p> </p>
<p>では、逆に直積によってできた表 \( R = P \times Q \) と表 \( P \) から表 \( Q \) を求めてみましょう、というのが商 \( R \div P \) の定義です。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125053.gif" alt="f:id:momoyama1192:20200906125053g:plain" title="f:id:momoyama1192:20200906125053g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>同じように、\( R \) と \( Q \) から \( P \) を求めることもできます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125057.gif" alt="f:id:momoyama1192:20200906125057g:plain" title="f:id:momoyama1192:20200906125057g:plain" class="hatena-fotolife" itemprop="image"></p>
<h2 class="wp-block-heading">３．練習問題</h2>
<p>では、前回と同じように基本情報の問題で3問ほど練習していきましょう。</p>
<h3 class="wp-block-heading">練習1</h3>
<p>関係データベースにおいて、表から特定の列を得る操作はどれか。</p>
<p>[基本情報技術者平成22年秋期 午前問30]</p>
<p>ア：結合<br>イ：削除<br>ウ：射影<br>エ：選択</p>
<p> </p>
<h3 class="wp-block-heading">練習2</h3>
<p>関係XとYを自然結合した後、関係Zを得る関係代数演算はどれか。</p>
<p>[基本情報技術者平成30年秋期 午前問28]</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125105.gif" alt="f:id:momoyama1192:20200906125105g:plain" title="f:id:momoyama1192:20200906125105g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ア：射影と和<br>イ：選択<br>ウ：選択と射影<br>エ：選択と和</p>
<p> </p>
<h3 class="wp-block-heading">練習3</h3>
<p>関係Rと関係Sに対して、関係Xを求める関係演算はどれか。</p>
<p>[応用情報技術者平成25年秋期 午前問30]</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125101.gif" alt="f:id:momoyama1192:20200906125101g:plain" title="f:id:momoyama1192:20200906125101g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ア：IDで結合<br>イ：差<br>ウ：直積<br>エ：和</p>
<p> </p>
<h2 class="wp-block-heading">４．練習問題の答え</h2>
<h3 class="wp-block-heading">解答1</h3>
<p>解答：ウ</p>
<p>表から列を抜き出す演算は「射影」です。よって答えはウ。</p>
<p>[それぞれの選択肢]</p>
<p>ア：結合<br>→ 2つの表をくっつける演算</p>
<p>イ：削除<br>→ 関係演算ですらない。</p>
<p>ウ：射影<br>→ 表から特定の列を抜き出す演算</p>
<p>エ：選択<br>→ 表から特定の行を抜き出す演算</p>
<h3 class="wp-block-heading">解答2</h3>
<p>解答：ウ</p>
<p>まず、関係XとYを自然結合してみましょう。すると、下のような表となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906132043.gif" alt="f:id:momoyama1192:20200906132043g:plain" title="f:id:momoyama1192:20200906132043g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ここで、表Zを見てみると、</p>
<ul class="wp-block-list dbp-list"><li>学生番号2, 4の行が抽出されている（選択）</li><li>学部名、学生番号、氏名の列が抽出されている（射影）</li></ul>
<p>が行われていることがわかりますね。よって、答えはウです。</p>
<p> </p>
<p>実際に結合した表に対して、選択演算と射影演算をやってみましょう。</p>
<p>まず、選択演算を行います。すると、下のような結果となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125109.gif" alt="f:id:momoyama1192:20200906125109g:plain" title="f:id:momoyama1192:20200906125109g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>さらに射影演算を行うことで、Zを得ることができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200906125113.gif" alt="f:id:momoyama1192:20200906125113g:plain" title="f:id:momoyama1192:20200906125113g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">解答3</h3>
<p>解答：エ</p>
<p>まず、関係R, S, Xで項目の種類、数が一致していますね。</p>
<p>そのため、集合演算の和、差、積のいずれかとなります。</p>
<p>よって、選択肢アとウが消えます。</p>
<p> </p>
<p>あとは和か差を考えるのですが、差演算であれば、計算元Rよりも結果Xのほうが行数が少なくなりますよね。（関係Rにあって関係Sにないものを出力するので、当然結果Xは関係Rよりも表の行数が減る）</p>
<p> </p>
<p>よって、答えは和のエとなります。</p>
<p>実際にRとSを和演算するとXになることを確認しましょう。</p>
<p> </p>
<h2 class="wp-block-heading">５．さいごに</h2>
<p>今回は、データベースの関係演算について説明しました。</p>
<p>関係演算を使うことで、データベース内にある表から様々な表を一時的に作り出すことができます。</p>
<p> </p>
<p>このような<strong><span class="marker-yellow">一時的に作られた仮想的な表</span></strong>のことを<strong><span class="marker-green">ビュー表</span></strong>と呼びます。</p>
<p>普段は整合性を保つために表を小分けにしておき、ユーザーに見せる際にユーザーが見やすいようにビュー表を一時的に作ることで、整合性、利便性の両立が可能となります。</p>
<p> </p>
<p>次回からは、データベースを操作するプログラミング言語SQLについて説明していきたいと思います。</p>
<div class="footnote">
<p class="footnote"><a href="#fn-525aa54d" name="f-525aa54d" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">基本的に後者の列が消されることが多いです。つまり、結合元Pと結合先Qを自然結合させる場合、共通の列のうち、結合先Qの列を削除することが多いです。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database02/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるデータベース　第01羽　関係データベース（主キーと外部キーの違い）</title>
		<link>https://www.momoyama-usagi.com/entry/info-database01</link>
					<comments>https://www.momoyama-usagi.com/entry/info-database01#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Fri, 04 Sep 2020 14:32:25 +0000</pubDate>
				<category><![CDATA[データベース]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-database01</guid>

					<description><![CDATA[今回はデータベースの単元に出てくる関係データベースの基本用語と、主キー、候補キー、外部キーなどの基本用語について復習していきます。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>最近忙しすぎて全然ブログを書くことに集中できていませんでしたが、久しぶりに更新をしていきたいと思います。 </p>
<p>今回から数回に分けてデータベースについて説明していきます。</p>
<p>初回となる今回は、データベースの中で一番出てくる関係データベースについて、用語などを確認しながら見ていきましょう。</p>
<h2 class="wp-block-heading">１．関係データベース (ﾘﾚｰｼｮﾅﾙﾃﾞｰﾀﾍﾞｰｽ)</h2>
<h3 class="wp-block-heading">(1) 関係データベースとは</h3>
<p>関係データベースでは、データをExcelのような<strong><span class="marker-yellow">2次元の表</span></strong>として管理します。リレーショナルデータベースと呼ぶ人もいます。</p>
<p> </p>
<p>下のような2次元の表として管理するので、我々人間にとって非常に確認をしやすいといえます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194702.gif" alt="f:id:momoyama1192:20200903194702g:plain" title="f:id:momoyama1192:20200903194702g:plain" class="hatena-fotolife" itemprop="image" width="501"></p>
<p>データベース単元では、基本的に関係データベースの操作方法、管理方法についてお勉強していきます。</p>
<p> </p>
<p> </p>
<p> </p>
<h3 class="wp-block-heading">(2) 用語紹介</h3>
<p>ここからは、関係データベースでよく出てくる単語について確認をしていきましょう。</p>
<h4 class="wp-block-heading">(a) 行と列</h4>
<p>データベースの世界では、</p>
<ul class="wp-block-list dbp-list"><li>行のことを<strong><span class="marker-green">レコード</span></strong>、タプル<br>（それぞれのデータを特定するのが行）</li><li>列のことを<strong><span class="marker-green">項目</span></strong>、フィールド、属性<br>（それぞれの項目を特定するのが列）</li><li>表のことを<strong><span class="marker-green">テーブル</span></strong></li></ul>
<p>と呼ぶこともあります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194707.gif" alt="f:id:momoyama1192:20200903194707g:plain" title="f:id:momoyama1192:20200903194707g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">(3) 関係データベースとスキーマ</h3>
<p>データベースに格納されているデータの種類を表したものをスキーマといいます。</p>
<p> </p>
<p>関係データベースの場合、2次元の表の「テーブル名と項目」を格納したものがスキーマ<a href="#f-7bac0155" name="fn-7bac0155" title="関係データベースのスキーマのことを関係スキーマと呼ぶ人もいます。">*1</a>となります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200904083855.gif" alt="f:id:momoyama1192:20200904083855g:plain" title="f:id:momoyama1192:20200904083855g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>なお、データベースの試験の場合、データベース内に格納されているデータは関係スキーマの形で表されることが多いです。さらに、</p>
<p>表名 ( 項目名1, 項目名2, 項目名3, … )</p>
<p>と省略した形で書かれることが基本です。</p>
<p> </p>
<p>例えば、上の学生一覧だと、関係スキーマの省略形は、</p>
<p>学生一覧 (学生番号, 氏名, 部活)</p>
<p>となります。</p>
<h2 class="wp-block-heading">２．主キー</h2>
<h3 class="wp-block-heading">(1) 主キーとは</h3>
<p><strong><span class="marker-yellow">この列を見れば、必ず各データを特定することができる！</span></strong>という列のことを<strong><span class="marker-green">主キー</span></strong>と呼びます。</p>
<p>言われてもわかりにくいと思うので、先ほどの表で確認しましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194711.gif" alt="f:id:momoyama1192:20200903194711g:plain" title="f:id:momoyama1192:20200903194711g:plain" class="hatena-fotolife" itemprop="image" width="531"></p>
<p>この表には、学生番号、氏名、部活の3つの項目があります。</p>
<p> </p>
<p>学生番号は、必ず<strong><span class="marker-yellow">各個人で異なり</span></strong>ますよね<a href="#f-49947bae" name="fn-49947bae" title="同じ番号になる人がいないように振られてます">*2</a>。そのため、学生番号は主キーです。</p>
<p>別に氏名でも各個人特定できるじゃん。と思った方もいると思います。しかし、運悪く同姓同名の人が入ってしまうことが考えられるので、各データを特定することはできません<a href="#f-a89b1210" name="fn-a89b1210" title="部活で各データを特定するのは絶対無理です。それぞれの部活に入っている人は1人とは限らないからです。というか、それぞれの部活に1人しか入れなかったら野球部とかどうするんですか。">*3</a>。</p>
<p> </p>
<p>主キーとなる項目は、<strong><span class="marker-yellow">学生番号、受験番号、社員番号などの個人を特定する番号番号(ID)</span></strong>がほとんどです。</p>
<h3 class="wp-block-heading">(2) 主キーに選ばれる項目の条件</h3>
<p>主キーは、各個人を1つに特定できるような項目でなければなりません。</p>
<p>そのために、以下の2つの条件が課されます。</p>
<ul class="wp-block-list dbp-list"><li><strong><span class="marker-yellow">データが一意</span></strong>であること（<strong><span class="marker-yellow">重複するデータがない</span></strong>こと）<br>→ 同じデータが2つ以上あるとデータを1つに特定できません</li><li><strong><span class="marker-yellow">NULLではない</span></strong>こと（<strong><span class="marker-yellow">値が設定されていないデータがない</span></strong>こと）<br>→ データが空だと、当然特定をすることができません。例えば、答案用紙に受験番号を忘れると、だれの答案用紙かわかりませんよね。</li></ul>
<h3 class="wp-block-heading">(3) 主キーの組み合わせ・複合キー</h3>
<p>1つの項目だけではデータを特定できないけど、2つ以上の項目を組みあわせれば1つに特定できる場合があります。</p>
<p>このように、<strong><span class="marker-yellow">複数の項目を組みあわせて主キーとしたもの</span></strong>を<strong><span class="marker-green">複合キー</span></strong>と呼びます。</p>
<p> </p>
<p>例えば学校の組ごとに出席番号が振られているとします。</p>
<p> </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194715.gif" alt="f:id:momoyama1192:20200903194715g:plain" title="f:id:momoyama1192:20200903194715g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>このとき、出席番号だけを主キーにしてしまうと、どの組（or 学年）かわかりません。</p>
<p> </p>
<p>しかし、学年、組、番号の3つがすべて異なればほかの人と重複することはありませんね。</p>
<p>そのため、「学年、組、番号」の3つの項目を組みあわせて主キーとして組み合わせれば各個人を特定できる複合キーとなりますね。</p>
<h3 class="wp-block-heading">(4) 主キーになるかも・候補キー</h3>
<p>主キーとなりうる項目、つまり<strong><span class="marker-yellow">データを1つに特定できる項目</span></strong>のことを<strong><span class="marker-green">候補キー</span></strong>と呼びます。</p>
<p>データを特定できる項目（候補キー）が2つ以上ある場合、<strong><span class="marker-yellow">特定できる列の中から1つを選び</span></strong>、主キーとします。</p>
<p> </p>
<p>例えば、下の表のように学生番号と（試験のとき用に使った）受験番号が両方入っているとしましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194719.gif" alt="f:id:momoyama1192:20200903194719g:plain" title="f:id:momoyama1192:20200903194719g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>学生番号は、学校の中で個人（それぞれの行）を識別するための番号なので、当然各個人を識別することができるデータだといえます。</p>
<p>今回は学生番号を主キーとしたいと思います。</p>
<p> </p>
<p>同じく、受験番号も受験する人の中で個人を識別するための番号なので、各個人を識別できます。</p>
<p> </p>
<p>そのため、候補キーは学生番号、受験番号の2つとなりますね。</p>
<p>（すでに特定に使っている主キーも候補キーに入るので注意）</p>
<p> </p>
<p>なお、候補キーの中で、主キーとして使っていないキーのことを代替キーと呼びます。</p>
<p> </p>
<p> </p>
<div class="box27" style="box-sizing: border-box; margin: 1em 0px; padding: 0.5em 1em; border: 3px solid #008000; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', YuGothic, 'Yu Gothic', Verdana, Meiryo, sans-serif; font-size: 16px; vertical-align: baseline; max-width: 640px; position: relative; color: #333333; letter-spacing: 0px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span class="box-title" style="box-sizing: border-box; margin: 0px; padding: 0px 9px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bold; font-stretch: inherit; line-height: 25px; font-size: 16px; vertical-align: middle; position: absolute; display: inline-block; top: -27px; left: -3px; height: 27px; background: #008000; color: #ffffff;">主キーで覚えるべき用語</span>
<p>主キー：各データを1通りに特定することができる項目（列）</p>
<p>複合キー：複数の項目を主キーとすることで各データを1通りに特定することができる項目</p>
<p>候補キー：主キーとなりうる候補となる項目</p>
<p> </p>
<p>主キーとなる項目にかけられる制約</p>
<ul class="wp-block-list dbp-list"><li>データが一意であること（重複するデータがないこと）</li><li>データが空ではないこと</li></ul>
</div>
<p> </p>
<h2 class="wp-block-heading">３．外部キー</h2>
<h3 class="wp-block-heading">(1) 外部キーとは</h3>
<p>関係データベースでは、複数の表同士を対応付ける場面が出てきます。その際、<strong><span class="marker-yellow">どのデータを使って表を対応づけるか</span></strong>を決める必要があります。</p>
<p> </p>
<p>例えば、下の2つの表があるとします。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194723.gif" alt="f:id:momoyama1192:20200903194723g:plain" title="f:id:momoyama1192:20200903194723g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> 下のように学生一覧にある部活IDから、部活一覧にあるIDを対応付けることで、各個人の部活を特定することができますね。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194727.gif" alt="f:id:momoyama1192:20200903194727g:plain" title="f:id:momoyama1192:20200903194727g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>このように、<strong><span class="marker-yellow">ほかの表の主キーを参照することで、表と表を対応付ける項目（列）</span></strong>のことを<strong><span class="marker-green">外部キー</span></strong>と呼びます。</p>
<h3 class="wp-block-heading">(2) 外部キーに選ばれる項目の条件</h3>
<p>外部キーは、ほかの表へ参照するために必要なため、<strong><span class="marker-pink">外部キーとなる項目は、参照先の項目の列内に存在する値しか設定できない</span></strong>という制限があります。</p>
<p>この制限のことを<strong><span class="marker-yellow">参照制約</span></strong>と呼びます。</p>
<h3 class="wp-block-heading">(3) 最初から表をくっつけたらいいのでは？</h3>
<p>わざわざ表を分けて外部キーまで設定しなくても、最初から下のように表をくっつけたらいいじゃんと思った人もいると思います。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194702.gif" alt="f:id:momoyama1192:20200903194702g:plain" title="f:id:momoyama1192:20200903194702g:plain" class="hatena-fotolife" itemprop="image" width="531"></p>
<p>しかし、このように表をくっつけて管理してしまうと、1つ問題が発生してしまいます。</p>
<p> </p>
<p>こちらが分けた後の表なのですが、分ける前の表には「サッカー部」や「帰宅部」の存在がありませんよね。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200903194723.gif" alt="f:id:momoyama1192:20200903194723g:plain" title="f:id:momoyama1192:20200903194723g:plain" class="hatena-fotolife" itemprop="image" p=""></p>
<p>このように、表をくっつけて管理してしまうと、だれも<strong><span class="marker-yellow">所属していない部</span></strong><a href="#f-05790033" name="fn-05790033" title="現実的にはあまりありませんが、新しくできた部活だと誰もいないということはあるかもしれません。">*4</a><strong><span class="marker-yellow">の存在が消えてしまう</span></strong>という問題があります</p>
<p>また、「かるた部」が「競技かるた部」のように名前を変えた場合、部活一覧表と分けて管理していた場合は、<strong><span class="marker-lightskyblue">部活一覧の部分を1か所変えるだけ</span></strong>で済みます。しかし、くっつけて管理していた場合は「かるた部」に<strong><span class="marker-pink">所属する人の部活全員をいちいち「競技かるた部」に変えなければ</span></strong>ならず、結構しんどいです。</p>
<p> </p>
<p>そのため、データベースではデータに矛盾が生じたり、管理をなるべく楽にするために適切に表を分けることで最適化をします。</p>
<p>この表を分ける操作のことを<strong><span class="marker-yellow">正規化</span></strong>と呼びます。正規化は、データベースの試験で頻出する項目なのでまた分けて紹介したいと思います。</p>
<p> </p>
<p> </p>
<div class="box27" style="box-sizing: border-box; margin: 1em 0px; padding: 0.5em 1em; border: 3px solid #008000; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', YuGothic, 'Yu Gothic', Verdana, Meiryo, sans-serif; font-size: 16px; vertical-align: baseline; max-width: 640px; position: relative; color: #333333; letter-spacing: 0px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span class="box-title" style="box-sizing: border-box; margin: 0px; padding: 0px 9px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bold; font-stretch: inherit; line-height: 25px; font-size: 16px; vertical-align: middle; position: absolute; display: inline-block; top: -27px; left: -3px; height: 27px; background: #008000; color: #ffffff;">外部キーで覚えるべき用語</span>
<p>外部キー：各データを1通りに特定することができる項目（列）</p>
<p> </p>
<p>外部キーとなる項目にかけられる制約</p>
<ul class="wp-block-list dbp-list"><li>参照先の項目の列内に存在する値以外は登録できない（参照制約）</li></ul>
</div>
<p> </p>
<h2 class="wp-block-heading">４．インデックス</h2>
<h3 class="wp-block-heading">(1) インデックスとは</h3>
<p>データベースには、大量のデータが記録されています。そんな大量のデータを、やみくもに上から下へ順番にデータを検索する（線形探索を行う）と非常に時間がかかってしまいます。</p>
<p> </p>
<p>そこで、<strong><span class="marker-yellow">データがどこにあるのかを表す目次</span></strong>をつけてあげます。この目次のことを<strong><span class="marker-green">インデックス</span></strong>と呼びます。</p>
<p>インデックスをつけることで、探したいデータがデータベース中のどこにあるのかをすぐ見つけることができるので、検索効率、速度のアップを行うことができます。</p>
<p> </p>
<h3 class="wp-block-heading">(2) インデックスがあまり有効ではない例</h3>
<p>ただし、インデックスを用意するだけで必ず速度が上がるとは限りません。</p>
<p> </p>
<p>データベースの中身を追加、削除を行うと当然場所が変わるので、目次の内容も書き換えないといけません。</p>
<p>そのため、<strong><span class="marker-yellow">頻繁に書き換わるデータに対しては、書き換えるたびに目次も書き換える必要が出てくるため、効率、速度がかえって落ちてしまいます</span></strong>。</p>
<p> </p>
<p>インデックスが有効な例は、以下の2つを満たすときが条件です。</p>
<ul class="wp-block-list dbp-list"><li>データベース内にあるデータが大量にあるとき</li><li>データベース内のデータの追加、削除があまり起こらない場合</li></ul>
<p> </p>
<h2 class="wp-block-heading">５．練習問題</h2>
<p>では、3問ほど練習していきましょう。</p>
<h3 class="wp-block-heading">練習1</h3>
<p>関係データベースの主キーの性質として適切なものはどれか。</p>
<p>[基本情報技術者平成21年秋期 午前問32]</p>
<p>ア：主キーとした列に対して検索条件を指定しなければ、行の検索はできない。<br>イ：数値型の列を主キーに指定すると、その列は算術演算の対象としては使えない。<br>ウ：一つの表の中に、主キーの値が同じ行が複数存在することはない。<br>エ：複数の列からなる主キーを構成することはできない。</p>
<h3 class="wp-block-heading">練習2</h3>
<p>関係データベースの主キー制約の条件として、キー値が重複していないことの他に、主キーを構成する列に必要な条件はどれか。</p>
<p>[基本情報技術者平成25年秋期 午前問30]</p>
<p>ア：キー値が空でないこと<br>イ：構成する列が一つであること<br>ウ：表の先頭に定義されている列であること<br>エ：別の表の候補キーとキー値が一致していること</p>
<p> </p>
<h3 class="wp-block-heading">練習3</h3>
<p>関係データベースにおいて、外部キ一定義を行う目的として、適切なものはどれか。</p>
<p>[基本情報技術者平成23年特別 午前問34]</p>
<p>ア：関係する相互のテーブルにおいて、レコード間の参照一貫性が維持される制約をもたせる。</p>
<p>イ：関係する相互のテーブルの格納場所を近くに配置することによって、検索、更新を高速に行う。</p>
<p>ウ：障害によって破壊されたレコードを、テーブル間の相互の関係から可能な限り復旧させる。<br>エ：レコードの削除、追加の繰返しによる、レコード格納エリアの虫食い状態を防止する。</p>
<p> </p>
<h2 class="wp-block-heading">６．練習問題の答え</h2>
<h3 class="wp-block-heading">解答1</h3>
<p>解答：ウ</p>
<p>ア：主キーとした列に対して検索条件を指定しなければ、行の検索はできない。<br>→ そんなことはありません。</p>
<p>イ：数値型の列を主キーに指定すると、その列は算術演算の対象としては使えない。<br>→ 主キーだろうが演算の対象として使えます。</p>
<p>ウ：一つの表の中に、主キーの値が同じ行が複数存在することはない。<br>→ 正解。</p>
<p>エ：複数の列からなる主キーを構成することはできない。<br>→ できる。複合キーのこと。</p>
<h3 class="wp-block-heading">解答2</h3>
<p>解答：ア</p>
<p>主キーになるための2つの条件を必ず覚えておきましょう。</p>
<ul class="wp-block-list dbp-list"><li>キー値が重複していないこと</li><li>キー値が空でないこと</li></ul>
<h3 class="wp-block-heading">解答3</h3>
<p>解答：ア</p>
<p>外部キーは、参照一貫性を保つために参照先の項目の列内に存在する値しか登録できないようにするのでしたね。</p>
<p>よって答えはア。</p>
<p> </p>
<h2 class="wp-block-heading">７．さいごに</h2>
<p>今回は関係データベースの基本用語（主キー、外部キー、候補キーなど）について説明していきました。</p>
<p>次回は、関係データベース内で使われる演算について確認していきましょう。</p>
<div class="footnote">
<p class="footnote"><a href="#fn-7bac0155" name="f-7bac0155" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">関係データベースのスキーマのことを関係スキーマと呼ぶ人もいます。</span></p>
<p class="footnote"><a href="#fn-49947bae" name="f-49947bae" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">同じ番号になる人がいないように振られてます</span></p>
<p class="footnote"><a href="#fn-a89b1210" name="f-a89b1210" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">部活で各データを特定するのは絶対無理です。それぞれの部活に入っている人は1人とは限らないからです。というか、それぞれの部活に1人しか入れなかったら野球部とかどうするんですか。</span></p>
<p class="footnote"><a href="#fn-05790033" name="f-05790033" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">現実的にはあまりありませんが、新しくできた部活だと誰もいないということはあるかもしれません。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-database01/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるソフトウェア工学　Part10　テスト</title>
		<link>https://www.momoyama-usagi.com/entry/info-software10</link>
					<comments>https://www.momoyama-usagi.com/entry/info-software10#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sat, 08 Aug 2020 03:01:39 +0000</pubDate>
				<category><![CDATA[ソフトウェア工学]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-software10</guid>

					<description><![CDATA[今回は、基本情報や実務でも非常によく出てくるテストについてまとめています。特に理解が難しいブラックボックステストによるテスト手法（同値分割、境界値分析）やホワイトボックステスト（命令網羅、分岐網羅、条件網羅、複数条件網羅）によるテスト手法は非常にわかりやすく記載しています。
]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、ももやまです。</p>



<p>今回はソフトウェア分野の「テスト」について基本情報を出る部分を中心にまとめていきたいと思います。</p>



<h2 class="wp-block-heading" id="１テストとは">１．テストとは</h2>



<p>システム開発では、決められた要件に沿ってプログラムを記述していきます。</p>



<p>しかし、プログラムの記述は機械ではなく人間が行うものなので、プログラムのミス（バグ）を防ぐことは限りなく不可能に近いです。</p>



<p>ただ、ミスを防げないからといって「バグだらけのシステムをそのまま納品する」わけにはいきません。そんな怖いシステム誰も使いたくないですね。</p>



<p>そこで、システム開発では「ミスを減らす」のではなく、<span class="marker-yellow"><b>ミスを発見して、つぶす</b></span>ことでプログラムのバグを防いでいきます。</p>



<p>この「ミスを発見して、つぶす」こと（デバッグ）をテストで行います。</p>



<p>次の章以降では、テストの種類、様々なテストの方法について説明します。</p>



<h2 class="wp-block-heading" id="２テストの流れ">２．テストの流れ</h2>



<p>テストは、</p>



<ol class="wp-block-list"><li>まずは小規模（各モジュールごと）でテスト [単体テスト]</li><li>問題がなければ規模を大きくしてテスト [結合テスト]</li><li>つぎに、システム全体を稼働させてテスト [システムテスト]</li><li>最後に利用者視点でシステムが問題なく動くかテスト [運用テスト]</li></ol>



<p>という4ステップで行われます。</p>



<p>（下流工程から上流工程に向かってテストをすると思ってください）</p>



<p>4ステップそれぞれのテストが設計段階のどこにあたるかはV字モデル（下の図）を見るとわかりやすいかと思います。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200621215738.gif" alt="f:id:momoyama1192:20200621215738g:plain" title="f:id:momoyama1192:20200621215738g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h2 class="wp-block-heading" id="３単体テストの2つのテスト技法">３．単体テストの2つのテスト技法</h2>



<p>まずは、単体テストでのテスト技法を紹介しましょう。</p>



<p>単体テストでは、<span class="marker-yellow"><b>モジュールが思った通りの（仕様通り）の動きをするのか</b></span>をテストします。</p>



<p>ただし、やみくもに入力（テストデータ）を決めてもあまりテストの効果はありません。</p>



<p>そこで、「ある一定の規則<a href="#f-bd5b458d" name="fn-bd5b458d" title="誰でも客観的に（テストする人の主観が入らないような）テストができる規則となっている必要がある。">*1</a>」に従ってテストする入力の種類を決定します。</p>



<p>よく行われるテストの方法として、</p>



<ul class="wp-block-list"><li>ブラックボックステスト</li><li>ホワイトボックステスト</li></ul>



<p>があります。</p>



<h3 class="wp-block-heading" id="1-ブラックボックステスト">(1) ブラックボックステスト</h3>



<p>ブラックボックステストは、モジュール（プログラム）の内部をブラックボックスとして（内部を意識せず<span class="marker-yellow"><b>外部に注目</b></span>して）テストする手法です。（利用者視点で行われるテストです。）</p>



<p><span class="marker-yellow"><b>与えられた入力（テストデータ）に対して、正しく出力が得られるか</b></span>をチェックします。</p>



<p>ブラックボックステストでは、主に「同値分割」、「境界値分析（限界値分析）」と呼ばれる方法でテストをする入力の種類（テストケース）を作成します。</p>



<h4 class="wp-block-heading" id="同値分割">同値分割</h4>



<p>同値分割とは、データをある一定の範囲ごとにグループ化し、<span class="marker-yellow"><b>グループの中で代表的な値を1つ選ぶ</b></span>方法です。</p>



<p>例えば、月（1～12）を入力するモジュールを考えましょう。この場合グループは、</p>



<ul class="wp-block-list"><li>有効値のグループ（1以上12以下が入力された場合）</li><li>有効値を超えた値を入力して無効になるグループ（12を超えた値が入力された場合）</li><li>有効値未満の値を入力して無効になるグループ（1未満の値が入力された場合）</li></ul>



<p>の3つのグループに分けることができます。</p>



<p>この場合、</p>



<ul class="wp-block-list"><li>有効値のグループの代表例：8</li><li>有効値超過のグループの代表例: 17</li><li>有効値未満のグループの代表例: -5</li></ul>



<p>のように代表的な値を取ることで同値分割が行えます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230754.gif" alt="f:id:momoyama1192:20200803230754g:plain" title="f:id:momoyama1192:20200803230754g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>もう少し難しい例を考えてみましょう。</p>



<p>例えば、100点満点のテストの成績を入力し、ある一定の成績ごと（0～59点、60～79点、80～100点）にランク分けするようなモジュールを考えましょう。この場合、グループは、</p>



<ul class="wp-block-list"><li>合格Aのグループ（80点以上100点以下の場合）</li><li>合格Bのグループ（60点以上79点以下の場合）</li><li>不合格のグループ（0点以上59点以下の場合）</li><li>有効値超過のため無効となるグループ（101点以上の場合）</li><li>有効値未満のため無効となるグループ（-1点以下の場合）</li></ul>



<p>の5つに分けることができます。</p>



<p>この場合、</p>



<ul class="wp-block-list"><li>合格Aのグループの代表例: 85</li><li>合格Bのグループの代表例: 70</li><li>不合格のグループの代表例: 50</li><li>有効値超過のグループの代表例: 130</li><li>有効値未満のグループの代表例: -20</li></ul>



<p>のように代表的な値を取ることで同値分割が行えます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230759.gif" alt="f:id:momoyama1192:20200803230759g:plain" title="f:id:momoyama1192:20200803230759g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="境界値分析限界値分析">境界値分析（限界値分析）</h4>



<p>境界値分析とは、データをある一定の範囲ごとにグループ化したときの<span class="marker-yellow"><b>グループの境目付近</b></span>（境目+1 or 境目-1が多い）を重点的にチェックします。</p>



<p>先ほど同じ月（1～12）を入力するモジュールを例に考えましょう。この場合グループは、</p>



<ul class="wp-block-list"><li>有効値のグループ（1以上12以下が入力された場合）</li><li>有効値を超えた値を入力して無効になるグループ（12を超えた値が入力された場合）</li><li>有効値未満の値を入力して無効になるグループ（1未満の値が入力された場合）</li></ul>



<p>の3つのグループに分けることができます。</p>



<p>この場合、境目は</p>



<ul class="wp-block-list"><li>有効値未満と有効値の部分 (0月と1月)</li><li>有効値と有効値超過の部分 (12月と13月)</li></ul>



<p>にあるため、テストケースを</p>



<ul class="wp-block-list"><li>有効値未満と有効値の境目：0, 1</li><li>有効値と有効値超過の境目：12, 13</li></ul>



<p>とすることで境界値分析（限界値分析）が行えます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230804.gif" alt="f:id:momoyama1192:20200803230804g:plain" title="f:id:momoyama1192:20200803230804g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>もう少し難しい例として、100点満点のテストの成績を入力し、ある一定の成績ごと（0～59点、60～79点、80～100点）にランク分けするようなモジュールを考えましょう。（こちらも先ほどと同じです）</p>



<p>グループは、</p>



<ul class="wp-block-list"><li>合格Aのグループ（80点以上100点以下の場合）</li><li>合格Bのグループ（60点以上79点以下の場合）</li><li>不合格のグループ（0点以上59点以下の場合）</li><li>有効値超過のため無効となるグループ（101点以上の場合）</li><li>有効値未満のため無効となるグループ（-1点以下の場合）</li></ul>



<p>の5つに分けることができるます。</p>



<p>このとき境目部分は、</p>



<ul class="wp-block-list"><li>有効値未満と不合格の境目：0, 1</li><li>不合格と合格Bの境目：59, 60</li><li>合格Bと合格Aの境目：79, 80</li><li>合格Aと有効値超過の境目：100, 101</li></ul>



<p>となるのでこの8つの値をテストケースとすれば境界値分析（限界値分析）が行えます。</p>



<h3 class="wp-block-heading" id="2-ホワイトボックステスト">(2) ホワイトボックステスト</h3>



<p>ホワイトボックステストは、モジュール（プログラム）の<span class="marker-yellow"><b>内部に注目</b></span>して（つまり、プログラムの中身を見て）テストを行います。</p>



<p>具体的には、プログラムの条件分岐（if文での分岐）に着目して、プログラムが正しく追跡（分岐するか）するかを調べます。</p>



<p>ホワイトボックステストでは、何を網羅する部分によって以下の4つの網羅方法があります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200807213802.gif" alt="f:id:momoyama1192:20200807213802g:plain" title="f:id:momoyama1192:20200807213802g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>では、これら4つの網羅方法がどのようなものなのかを以下のプログラムを例に説明していきましょう。 </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
def ex1(A, B):
    if A and B:
        print(&quot;処理&quot;)
</pre></div>


<p>[注意]</p>



<p>今回は、基本情報や応用情報の試験でも使われる「コード網羅率」におけるそれぞれの網羅方法を説明しています<a href="#f-799d44e3" name="fn-799d44e3" title="「コード網羅率」以外に実務でも使われる網羅（カバレッジ）の基準に「論理網羅」があります。「論理網羅」では、コード網羅の複数条件網羅(MCC)を条件網羅(C2)と呼ぶため、基本情報や応用情報の参考書を読んだ人は違和感あるかもしれません。">*2</a>。</p>



<h4 class="wp-block-heading" id="命令網羅-C0">命令網羅 (C0)</h4>



<p>命令網羅では、<span class="marker-yellow"><b>プログラム中にあるすべての命令を最低1回実行するような</b></span>テストケースを考えます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230818.gif" alt="f:id:momoyama1192:20200803230818g:plain" title="f:id:momoyama1192:20200803230818g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>上のフローチャートで表されるプログラムの例の場合、<code>A and B</code> が真になるとき、つまりA, Bがともに真になるときのテストケースだけを考えればOKです。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>A</th><th>B</th><th>命令</th></tr></thead><tbody><tr><td>1</td><td>真</td><td>真</td><td>される</td></tr></tbody></table></figure>



<p>もう1つ別の例を出してみましょう。</p>



<p>先程とは逆に、<code>A and B</code> が偽のときだけ命令が実行されるようなプログラムを考えてみましょう。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230828.gif" alt="f:id:momoyama1192:20200803230828g:plain" title="f:id:momoyama1192:20200803230828g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>この場合、<code>A and B</code> が偽になるパターン、つまり</p>



<pre class="wp-block-preformatted code">A = 真, B = 偽
A = 偽, B = 真
A = 偽, B = 偽</pre>



<p>の3つのうちのどれか1つだけをテストケースとすれば命令網羅を満たします<a href="#f-1c1c46fc" name="fn-1c1c46fc" title="満たす＝網羅率100%になるという意味です。">*3</a>。</p>



<h4 class="wp-block-heading" id="分岐網羅判定条件網羅-C1">分岐網羅・判定条件網羅 (C1)</h4>



<p>命令網羅では、<span class="marker-yellow"><b>プログラム中にあるすべての分岐を最低1回は通る</b></span>テストケースを考えます。</p>



<p>例えば、下のフローチャートで表されるプログラムの場合、</p>



<ul class="wp-block-list"><li><code>A and B</code> が真のときに通る分岐</li><li><code>A and B</code> が偽のときに通る分岐</li></ul>



<p>の2つが確かめられていればOKです。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230834.gif" alt="f:id:momoyama1192:20200803230834g:plain" title="f:id:momoyama1192:20200803230834g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>そのため、下の2つの入力をテストケースとすれば分岐網羅を満たすことができます。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>A</th><th>B</th><th>A and B</th><th>命令</th></tr></thead><tbody><tr><td>1</td><td>真</td><td>真</td><td>真</td><td>される</td></tr><tr><td>2</td><td>真</td><td>偽</td><td>偽</td><td></td></tr></tbody></table></figure>



<p>なお、No.2のテストは、<code>A and B</code> が偽になればいいので、</p>



<pre class="wp-block-preformatted code">A = 偽, B = 真
A = 偽, B = 偽</pre>



<p>でもOKです。</p>



<p>なお、分岐網羅はプログラム中のすべての分岐を試すため、<span class="marker-yellow"><b>分岐網羅(C1)を満たすテストケースであれば必ず命令網羅(C0)も満たします</b></span>。</p>



<p>（すべての分岐を試せば「実行されない命令」は絶対にありませんよね。）</p>



<h4 class="wp-block-heading" id="条件網羅-C2">条件網羅 (C2)</h4>



<p>条件網羅は、コード内の個々の条件について、<span class="marker-yellow"><b>すべての真偽が少なくとも1回は出現するようなテストケース</b></span>を考えます。</p>



<p>例えば、下のフローチャートで表されるプログラムの場合、</p>



<ul class="wp-block-list"><li><code>A</code> が真になるとき</li><li><code>A</code> が偽になるとき</li><li><code>B</code> が真になるとき</li><li><code>B</code> が偽になるとき</li></ul>



<p>の4つが確かめられていればOKです。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230839.gif" alt="f:id:momoyama1192:20200803230839g:plain" title="f:id:momoyama1192:20200803230839g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>そのため、下の2つの入力をテストケースとすれば条件網羅を満たすことができます。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>A</th><th>B</th><th>A and B</th><th>命令</th></tr></thead><tbody><tr><td>1</td><td>真</td><td>偽</td><td>偽</td><td></td></tr><tr><td>2</td><td>偽</td><td>真</td><td>偽</td><td></td></tr></tbody></table></figure>



<p>なお、A, Bの真偽が少なくとも1回は出現すればいいので、テストケースは</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>A</th><th>B</th><th>A and B</th><th>命令</th></tr></thead><tbody><tr><td>1</td><td>真</td><td>真</td><td>真</td><td>される</td></tr><tr><td>2</td><td>偽</td><td>偽</td><td>偽</td><td></td></tr></tbody></table></figure>



<p>でもOKです。</p>



<p>条件網羅は個々の条件の真, 偽が1回でも出てくることに注目するため、</p>



<ul class="wp-block-list"><li>すべての分岐をチェックすることができない<br>（分岐網羅(C1)を満たさない）</li><li>すべての命令が実行されないことがある<br>（命令網羅(C0)を満たさない）</li></ul>



<p>ことがあります<a href="#f-55b4b4f1" name="fn-55b4b4f1" title="まさに条件網羅の1種類目のテストケースが該当しますね">*4</a>。</p>



<h4 class="wp-block-heading" id="複数条件網羅-複合条件網羅-MCC">複数条件網羅 [複合条件網羅] (MCC)</h4>



<p>複数条件網羅は、コード内の判定文におけるすべての条件で<span class="marker-yellow">、<b>とり得る真偽のすべてのパターンを（最低1回は）網羅するような</b></span>テストケースを考えます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230843.gif" alt="f:id:momoyama1192:20200803230843g:plain" title="f:id:momoyama1192:20200803230843g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>例えば、上のフローチャートで表されるプログラムの場合、下のように \( 2^{2} = 4 \) 通りの入力をテストケースとすることで複数条件網羅を満たすことができます。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>A</th><th>B</th></tr></thead><tbody><tr><td>1</td><td>真</td><td>真</td></tr><tr><td>2</td><td>真</td><td>偽</td></tr><tr><td>3</td><td>偽</td><td>真</td></tr><tr><td>4</td><td>偽</td><td>偽</td></tr></tbody></table></figure>



<h4 class="wp-block-heading" id="あれ条件網羅C2の定義おかしくない">あれ、条件網羅(C2)の定義おかしくない？</h4>



<p>参考書によっては条件網羅(C2)を「個々の条件について、全ての可能な結果を最低1回とるように実行するようなテストケース」と書かれている場合があります。（先程説明した複数条件網羅(MCC)に相当する条件です）</p>



<p>これは、基本情報や応用情報で使われる網羅方法（コード網羅率による網羅方法）と参考書による網羅方法（論理網羅と呼ばれます）が異なるために発生しています。</p>



<p>この記事では、基本情報や応用情報の対策をメインとするため、条件網羅は「すべての真偽が少なくとも1回は出現するようなテストケース」と記述しています。（後ろの練習問題でもこの定義を使います。）</p>



<h2 class="wp-block-heading" id="４命令網羅分岐網羅条件網羅複数条件網羅を練習してみよう">４．命令網羅・分岐網羅・条件網羅・複数条件網羅を練習してみよう</h2>



<p>ホワイトボックステストは少し難しいので、少し難しいプログラムの場合で理解できているかを確認しましょう。</p>



<h3 class="wp-block-heading" id="問題">問題</h3>



<hr class="wp-block-separator"/>



<p>以下の関数 <code>ex2</code> において、</p>



<ol class="wp-block-list"><li>命令網羅 (C0)</li><li>分岐網羅 (C1)</li><li>条件網羅 (C2)</li><li>複数条件網羅（複合条件網羅） (MCC)</li></ol>



<p>を満たすテストデータの例を示しなさい。ただし、テストデータの個数が最小個数になるようにすること。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
def ex2(x, y, z):
    if x == 3 and y &lt;= 5:
        print(&quot;処理1&quot;)
    else:
        print(&quot;処理2&quot;)
    
    if z &gt; 0:
        print(&quot;処理3&quot;)
</pre></div>


<p>※網羅を満たすテストデータを答える場合は、下のようにフローチャートを書くことを強くおすすめします。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200807205201.gif" alt="f:id:momoyama1192:20200807205201g:plain" title="f:id:momoyama1192:20200807205201g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>（慣れれば書かなくてもいいですが…）</p>



<h3 class="wp-block-heading" id="解答例">解答例</h3>



<h4 class="wp-block-heading" id="命令網羅-C0-1">命令網羅 (C0)</h4>



<p>命令網羅ということは、命令1、命令2、命令3がすべて実行されるようなテストケースを考える必要があります。</p>



<p>そのような最小のテストケースの例には、以下のようなものがあります。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>x</th><th>y</th><th>z</th><th>実行される命令</th></tr></thead><tbody><tr><td>1</td><td>3</td><td>4</td><td>1</td><td>命令1, 命令3</td></tr><tr><td>2</td><td>2</td><td>6</td><td>1</td><td>命令2, 命令3</td></tr></tbody></table></figure>



<h4 class="wp-block-heading" id="分岐網羅-C1">分岐網羅 (C1)</h4>



<p>分岐網羅ということは、すべての分岐（分岐1～4と名前を付けましょうか）がすべて実行されるようなテストケースを考える必要があります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200808001650.gif" alt="f:id:momoyama1192:20200808001650g:plain" title="f:id:momoyama1192:20200808001650g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>そのような最小のテストケースの例には、以下のようなものがあります。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>x</th><th>y</th><th>z</th><th>実行される分岐</th></tr></thead><tbody><tr><td>1</td><td>3</td><td>4</td><td>1</td><td>分岐1, 分岐3</td></tr><tr><td>2</td><td>2</td><td>6</td><td>-1</td><td>分岐2, 分岐4</td></tr></tbody></table></figure>



<h4 class="wp-block-heading" id="条件網羅-C2-1">条件網羅 (C2)</h4>



<p>条件網羅ということは、個々の条件の真, 偽がすべて実行されるようなテストケースを考える必要があります。</p>



<p>そのような最小のテストケースの例には、以下のようなものがあります。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>x</th><th>y</th><th>z</th><th>x == 3</th><th>y &lt;= 5</th><th>z &gt; 0</th></tr></thead><tbody><tr><td>1</td><td>3</td><td>6</td><td>4</td><td>真</td><td>偽</td><td>真</td></tr><tr><td>2</td><td>1</td><td>1</td><td>-4</td><td>偽</td><td>真</td><td>偽</td></tr></tbody></table></figure>



<h4 class="wp-block-heading" id="複数条件網羅-MCC">複数条件網羅 (MCC)</h4>



<p>複数条件網羅ということは、個々の条件の真, 偽のパターンがすべて試されるようなテストケースを考える必要があります。</p>



<p>そのような最小のテストケースは、下の例のように \( 2^{3} = 8 \) 通り試す必要があります。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>x</th><th>y</th><th>z</th><th>x == 3</th><th>y &lt;= 5</th><th>z &gt; 0</th></tr></thead><tbody><tr><td>1</td><td>3</td><td>3</td><td>4</td><td>真</td><td>真</td><td>真</td></tr><tr><td>2</td><td>3</td><td>3</td><td>-4</td><td>真</td><td>真</td><td>偽</td></tr><tr><td>3</td><td>3</td><td>6</td><td>4</td><td>真</td><td>偽</td><td>真</td></tr><tr><td>4</td><td>3</td><td>6</td><td>-4</td><td>真</td><td>偽</td><td>偽</td></tr><tr><td>5</td><td>2</td><td>3</td><td>4</td><td>偽</td><td>真</td><td>真</td></tr><tr><td>6</td><td>2</td><td>3</td><td>-4</td><td>偽</td><td>真</td><td>偽</td></tr><tr><td>7</td><td>2</td><td>6</td><td>4</td><td>偽</td><td>偽</td><td>真</td></tr><tr><td>8</td><td>2</td><td>6</td><td>-4</td><td>偽</td><td>偽</td><td>偽</td></tr></tbody></table></figure>



<p>（なお、基本情報のような情報処理試験以外の参考書では複数条件網羅のことを条件網羅(C2)としているものもあるので注意しましょう）</p>



<h4 class="wp-block-heading" id="論理的に全パターン試せない場合は">論理的に全パターン試せない場合は…？</h4>



<p>例えば、下のようなプログラムを例に考えましょう</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
if c == &#039;X&#039; or c == &#039;Y&#039;:
    print(&quot;1&quot;)
else:
    print(&quot;2&quot;)

if c == &#039;Z&#039;:
    print(&quot;3&quot;)
</pre></div>


<p>例えば、この場合だと <code>&nbsp;c == 'X'</code>, <code>c == 'Y'</code>, <code>c == 'Z'</code> が2つ以上同時に真になることはありませんね。</p>



<p>このように、<span class="marker-pink"><b>論理的に絶対に満たさないようなケースは想定する必要がありません</b></span>。</p>



<p>つまり、上のプログラムの場合、論理的に満たす可能性のある下の4つのテストケースを試せばよいことがわかります。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>c</th><th>c == 'X'</th><th>c == 'Y'</th><th>c == 'Z'</th></tr></thead><tbody><tr><td>1</td><td>X</td><td>真</td><td>偽</td><td>偽</td></tr><tr><td>2</td><td>Y</td><td>偽</td><td>真</td><td>偽</td></tr><tr><td>3</td><td>Z</td><td>偽</td><td>偽</td><td>真</td></tr><tr><td>4</td><td>O</td><td>偽</td><td>偽</td><td>偽</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="５様々なテスト支援ツール">５．様々なテスト支援ツール</h2>



<h3 class="wp-block-heading" id="1-テスト支援ケースの種類">(1) テスト支援ケースの種類</h3>



<p>先程は1つの条件文に対してテストケースを考えてきました。</p>



<p>しかし実際のプログラムは条件文などが非常に複雑に絡み合っています。</p>



<p>そのため、テストの数は膨大になってしまい、我々人間だけでテストを行うには非常に時間がかかってしまいます。</p>



<p>そこで、テストを行う時間を短くするような支援ツールが導入されました。</p>



<p>支援ツールには大まかに分けると、</p>



<ul class="wp-block-list"><li>静的テスト支援ツール<br>（プログラムを実行せずにプログラムの検証を行う<a href="#f-18929dc2" name="fn-18929dc2" title="自動構文チェッカーなどが該当する">*5</a>）</li><li>動的テスト支援ツール<br>（プログラムを実行しながらプログラムの検証を行う）</li><li>環境設定ツール<br>（テスト環境、テストケースを作成する）</li></ul>



<p>の3種類があります。</p>



<p>この中でも動的テスト支援ツールについての出題が多いため、今回は動的テスト支援ツールに絞って説明をします。</p>



<h3 class="wp-block-heading" id="2-動的テスト支援ツール">(2) 動的テスト支援ツール</h3>



<p>代表的な動的テスト支援ツールには、以下のようなものがあります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200807213808.gif" alt="f:id:momoyama1192:20200807213808g:plain" title="f:id:momoyama1192:20200807213808g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="インスペクタ">インスペクタ</h4>



<p>プログラムの<span class="marker-yellow"><b>実行の際に使われた変数や、構造体の中身を確認</b></span>することができます。</p>



<h4 class="wp-block-heading" id="トレーサ">トレーサ</h4>



<p><span class="marker-yellow"><b>プログラムの実行過程を追跡、可視化</b></span>します。</p>



<p><span class="marker-lime"><b>「トレース」で追跡する</b></span>という意味なので、追跡するツールと頭に入れておきましょう<a href="#f-d0af7b66" name="fn-d0af7b66" title="プログラミング系の授業で「とりあえずこのプログラムの動きをトレースしてみよう」と言われることありませんでしたか。私は先生によく言われていました。">*6</a>。</p>



<h4 class="wp-block-heading" id="アサーションチェッカー">アサーションチェッカー</h4>



<p>プログラムの正当性をチェックします。</p>



<p>具体的には、<span class="marker-yellow"><b>変数間の関係や条件のような「論理的に成立する条件」をある個所に入れ、実行の際に成立するか</b></span>を確かめます。</p>



<h4 class="wp-block-heading" id="テストカバレージ分析ツール">テストカバレージ分析ツール</h4>



<p>ホワイトボックステストでの<span class="marker-yellow"><b>テストの網羅率（カバレージと呼びます）がどれくらいなのかを定量的に測定</b></span>します。</p>



<h2 class="wp-block-heading" id="６結合テスト統合テスト">６．結合テスト（統合テスト）</h2>



<p>単体テストをクリアすると、クリアしたモジュールをつなぎ合わせてテストを行う結合テスト（統合テスト）を行います。</p>



<p>結合テストには、モジュールの上位からテストするか下位からテストするかによって</p>



<ul class="wp-block-list"><li>トップアップテスト（上位からテスト）</li><li>ボトムアップテスト（下位からテスト）</li></ul>



<p>の2種類があります。</p>



<h3 class="wp-block-heading" id="1-トップアップテスト">(1) トップアップテスト</h3>



<p>トップアップテストは、モジュールの上位側から順番にテストをしていく方法です。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230849.gif" alt="f:id:momoyama1192:20200803230849g:plain" title="f:id:momoyama1192:20200803230849g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>しかし、結合テストを始める前にすべてのモジュールが出来てないこともあります。</p>



<p>このようにまだ完成していないモジュールがある場合、<span class="marker-green"><b>スタブ</b></span>と呼ばれる仮のモジュールを付けることによりテストを行います。</p>



<h3 class="wp-block-heading" id="2-ボトムアップテスト">(2) ボトムアップテスト</h3>



<p>ボトムアップテストは、モジュールの下位側から順番にテストをしていく方法です。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230853.gif" alt="f:id:momoyama1192:20200803230853g:plain" title="f:id:momoyama1192:20200803230853g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>ボトムアップテストではまだ完成していないモジュールがある場合、<span class="marker-green"><b>ドライバ</b></span>と呼ばれる仮のモジュールを付けることによりテストを行います。</p>



<div class="box27" style="box-sizing: border-box; margin: 1em 0px; padding: 0.5em 1em; border: 3px solid #008000; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', YuGothic, 'Yu Gothic', Verdana, Meiryo, sans-serif; font-size: 16px; vertical-align: baseline; max-width: 640px; position: relative; color: #333333; letter-spacing: 0px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span class="box-title" style="box-sizing: border-box; margin: 0px; padding: 0px 9px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bold; font-stretch: inherit; line-height: 25px; font-size: 16px; vertical-align: middle; position: absolute; display: inline-block; top: -27px; left: -3px; height: 27px; background: #008000; color: #ffffff;">よく出る！　仮のモジュールの名前</span>

<p>トップアップテスト：スタブ</p>
<p>ボトムアップテスト：ドライバ</p>
</div>



<h2 class="wp-block-heading" id="７信頼性成長モデルバグ管理図">７．信頼性成長モデル（バグ管理図）</h2>



<p>「このプログラム（モジュール）にはバグがない」ことを証明することは非常に難しいです。</p>



<p>ですが、プログラムのバグを見つけ、修正して…、また見つけ…、を繰り返していくことでバグが十分に発見された、つまり「品質のよいシステムだ」というのを言うことができます。</p>



<p>この「品質のよいシステムだ」と判断するために使うものが下の信頼性成長モデル（ゴンベルツ曲線とも呼ばれます）です。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230857.gif" alt="f:id:momoyama1192:20200803230857g:plain" title="f:id:momoyama1192:20200803230857g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>信頼性成長モデルでは、下の1～3の流れでバグが発見されることを表しています。</p>



<ol class="wp-block-list"><li>最初はバグが緩やかに発見される</li><li>途中から急激にバグが発見される</li><li>最終的にバグの発見は緩やかになり、頭打ちになる</li></ol>



<p>累積バグ件数とテスト項目消化件数に対する図（バグ管理図）が下のようなグラフになってしまう（信頼性成長モデルに従わない）場合は、まだバグが残っている（十分な品質ではない）可能性が高いです。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200803230901.gif" alt="f:id:momoyama1192:20200803230901g:plain" title="f:id:momoyama1192:20200803230901g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h2 class="wp-block-heading" id="８練習問題">８．練習問題</h2>



<p>では、5問ほど基本情報の問題で練習しましょう。</p>



<h3 class="wp-block-heading" id="練習1">練習1</h3>



<p>ホワイトボックステストの説明として，適切なものはどれか。</p>



<p>[基本情報技術者平成23年特別 午前問49]</p>



<p>ア：外部仕様に基づいてテストデータを作成する。<br>イ：同値分割の技法を使用してテストデータを作成する。<br>ウ：内部構造に基づいてテストデータを作成する。<br>エ：入力と出力の関係からテストデータを作成する。</p>



<h3 class="wp-block-heading" id="練習2">練習2</h3>



<p>表は、あるプログラムの入力データを、有効同値クラスと無効同値クラスに分けたものである。同値分割法によってテストケースを設計する場合、最小限のテストデータの組み合わせとして、適切なものはどれか。</p>



<figure class="wp-block-table"><table><thead><tr><th>同値クラス</th><th>データ</th></tr></thead><tbody><tr><td>無効同値クラス</td><td>-2, -1, 0</td></tr><tr><td>有効同値クラス</td><td>1, 2, 3, 4, 5</td></tr><tr><td>無効同値クラス</td><td>6, 7, 8</td></tr></tbody></table></figure>



<p>[基本情報技術者平成18年秋期 午前問43]</p>



<p>ア：-2, 0, 1, 5, 6, 8<br>イ：0, 1, 5, 6<br>ウ：-1, 3, 6<br>エ：1, 5</p>



<h3 class="wp-block-heading" id="練習3">練習3</h3>



<p>整数 1～1,000 を有効とする入力値が、1～100 の場合は処理Aを、101～1,000 の場合は処理Bを実行する入力処理モジュールを、同値分割法と境界値分析によってテストする。次の条件でテストするとき、テストデータの最小個数は幾つか。</p>



<p>☆条件☆</p>



<ol class="wp-block-list"><li>有効同値クラスの1クラスにつき、一つの値をテストデータとする。ただし、 テストする値は境界値でないものとする。</li><li>有効同値クラス、無効同値クラスの全ての境界値をテストデータとする。</li></ol>



<p>[基本情報技術者平成28年秋期 午前問48]</p>



<p>ア：5<br>イ：6<br>ウ：7<br>エ：8</p>



<h3 class="wp-block-heading" id="練習4">練習4</h3>



<p>流れ図で表される部分を命令網羅によってテストするとき、テストケースは少なくとも幾つ用意する必要があるか。</p>



<p>[基本情報技術者平成28年春期 午前問49]</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200807205206.gif" alt="f:id:momoyama1192:20200807205206g:plain" title="f:id:momoyama1192:20200807205206g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>ア：2<br>イ：3<br>ウ：4<br>エ：5</p>



<h3 class="wp-block-heading" id="練習5">練習5</h3>



<p>プログラムの流れ図で示される部分に関するテストデータを、判定条件網羅(分岐網羅)によって設定した。このテストデータを複数条件網羅による設定に変更したとき、加えるべきテストデータのうち、適切なものはどれか。ここで、()で囲んだ部分は、一組のテストデータを表すものとする。</p>



<ul class="wp-block-list"><li>判定条件網羅(分岐網羅)によるテストデータ<br>(A＝4、B＝1), (A＝5、B＝0)</li></ul>



<p>[基本情報技術者平成20年春期 午前問48]</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200807205210.gif" alt="f:id:momoyama1192:20200807205210g:plain" title="f:id:momoyama1192:20200807205210g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>ア：(A＝3, B＝0), (A＝7, B＝2)<br>イ：(A＝3, B＝2), (A＝8, B＝0)<br>ウ：(A＝4, B＝0), (A＝8, B＝0)<br>エ：(A＝7, B＝0), (A＝8, B＝2)</p>



<h3 class="wp-block-heading" id="練習6">練習6</h3>



<p>プログラム実行中の特定の時点で成立する変数間の関係や条件を記述した論理式を埋め込んで、そのプログラムの正当性を検証する手法はどれか。</p>



<p>ア：アサーションチェック<br>イ：コード追跡<br>ウ：スナップショットダンプ<br>エ：テストカバレッジ分析</p>



<p>[基本情報技術者平成20年春期 午前問48]</p>



<h3 class="wp-block-heading" id="練習7">練習7</h3>



<p>ボトムアップテストの特徴として、適切なものはどれか。</p>



<p>[基本情報技術者平成27年秋期 午前問48]</p>



<p>ア：開発の初期の段階では、並行作業が困難である。<br>イ：スタブが必要である。<br>ウ：テスト済みの上位モジュールが必要である。<br>エ：ドライバが必要である。</p>



<h2 class="wp-block-heading" id="９練習問題の答え">９．練習問題の答え</h2>



<h3 class="wp-block-heading" id="解答1">解答1</h3>



<p>解答：ウ</p>



<p>[それぞれの選択肢]</p>



<p>ア：外部仕様に基づいてテストデータを作成する。<br>→ ブラックボックスの説明。ホワイトボックスでは内部仕様に基づいてテストデータを作成する。</p>



<p>イ：同値分割の技法を使用してテストデータを作成する。<br>→ 同値分割はブラックボックステストの手法。</p>



<p>ウ：内部構造に基づいてテストデータを作成する。<br>→ 正解。</p>



<p>エ：入力と出力の関係からテストデータを作成する。<br>→ ブラックボックスでの手法。</p>



<h3 class="wp-block-heading" id="解答2">解答2</h3>



<p>解答：ウ</p>



<p>同値分割法は、それぞれの同値クラス（グループ）が取りうる値を最低1つ選んでテストを行う方法である。</p>



<p>そのため、無効同値クラス（有効値未満）、有効同値クラス、無効同値クラス（有効地超過）からそれぞれ値を1つ選んでいるウが答えとなる。</p>



<h3 class="wp-block-heading" id="解答3">解答3</h3>



<p>解答：エ</p>



<p>まず、入力値がどのクラスに分けられるのかを表で表してみよう。</p>



<figure class="wp-block-table"><table><thead><tr><th>同値クラス</th><th>データ範囲</th></tr></thead><tbody><tr><td>有効値未満</td><td>0以下</td></tr><tr><td>処理A</td><td>1以上100以下</td></tr><tr><td>処理B</td><td>101以上1,000以下</td></tr><tr><td>有効値超過</td><td>1,001以上</td></tr></tbody></table></figure>



<p>まず、「有効同値クラスの1クラスにつき、境界値以外の1つの値をテストデータとする。」ので、処理Aと処理Bで2つのテストデータが必要となる。</p>



<p>つぎに、「有効同値クラス、無効同値クラスの全ての境界値をテストデータとする。」とある。今回は、</p>



<ul class="wp-block-list"><li>有効値未満と処理Aの境界</li><li>処理Aと処理Bの境界</li><li>処理Bと有効値超過の境界</li></ul>



<p>の3か所に境界がある。</p>



<p>1つの境界につき、2つのテストデータ（境界値ちょうどと1だけ外れた値）が必要になるので、合計2×3=6通りのテストケースが必要となる。</p>



<p>よって、合計2+6=8通りのテストケースが必要なので答えはエ。</p>



<h3 class="wp-block-heading" id="解答4">解答4</h3>



<p>解答：ア</p>



<p>命令網羅なので、<code>x=1</code>, <code>x=2</code>, <code>y=1</code>,<code>y=2</code> のすべての命令を網羅すればよい。</p>



<p>そのため、以下の2つの命令を使えば最小個数のテストケースとなる。</p>



<figure class="wp-block-table"><table><thead><tr><th><center>No.</center></th><th>a</th><th>b</th><th>命令</th></tr></thead><tbody><tr><td>1</td><td>0</td><td>0</td><td>x=1, y=1</td></tr><tr><td>2</td><td>1</td><td>1</td><td>x=2, y=2</td></tr></tbody></table></figure>



<p>（もちろん (a,b) = (0,1), (1,0) の2個でもOK）</p>



<p>よって答えはア。</p>



<h3 class="wp-block-heading" id="解答5">解答5</h3>



<p>解答：エ</p>



<p>複数条件網羅で必要になるテストケースは、以下の4つである。</p>



<pre class="wp-block-preformatted code">(1) A &gt; 6 を満たし、B = 0 も満たす場合
(2) A &gt; 6 を満たし、B = 0 を満たさない場合
(3) A &gt; 6 を満たさず、B = 0 を満たす場合
(4) A &gt; 6 を満たさず、B = 0 も満たさない場合</pre>



<p>ここで、判定条件網羅により (A,B) = (4,1), (5,0) はすでに入っている。(A,B)=(4,1) のときは(4)の条件に、(A,B) = (5,0)のときは(3)の条件を満たしているため、残りの(1),(2)の条件を満たすテストケース、つまり</p>



<pre class="wp-block-preformatted code">(1) A &gt; 6 かつ B = 0 となるとき
(2) A &gt; 6 かつ B ≠ 0 となるとき</pre>



<p>を選べばよい。</p>



<p>そんなケースになるのはエが答え。</p>



<h3 class="wp-block-heading" id="解答6">解答6</h3>



<p>解答：ウ</p>



<p>「アサーションチェッカー→プログラムの正当性を調査する。」も覚えておきましょう。</p>



<h3 class="wp-block-heading" id="解答7">解答7</h3>



<p>解答：エ</p>



<p>ア：開発の初期の段階では、並行作業が困難である。<br>→ モジュールを分割しているため、並行作業が可能である。</p>



<p>イ：スタブが必要である。<br>→ スタブが必要なのはトップダウンテスト。</p>



<p>ウ：テスト済みの上位モジュールが必要である。<br>→ 上位モジュールの代わりにドライバを使うことで上位モジュールなしにテストが行えます。</p>



<p>エ：ドライバが必要である。<br>→ 正解。</p>



<h2 class="wp-block-heading" id="10さいごに">10．さいごに</h2>



<p>今回は、ソフトウェア分野における「テスト」についての説明でした。</p>



<p>基本情報に頻出する以下の項目はぜひ頭に入れておきましょう。</p>



<ul class="wp-block-list"><li>ブラックボックステストとホワイトボックステストの違い</li><li>ブラックボックステストで出てくる同値分割と境界値分析</li><li>ホワイトボックステストで出てくる各種網羅方法</li><li>スタブとドライバの違い</li><li>様々なテスト支援ツール</li><li>信頼性成長モデルについて（バグ管理図）</li></ul>



<p>ソフトウェアについての記事はここまでです！</p>



<p>Part10までお読みいただきありがとうございました！</p>



<div class="footnote">
<p class="footnote"><a href="#fn-bd5b458d" name="f-bd5b458d" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">誰でも客観的に（テストする人の主観が入らないような）テストができる規則となっている必要がある。</span></p>
<p class="footnote"><a href="#fn-799d44e3" name="f-799d44e3" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">「コード網羅率」以外に実務でも使われる網羅（カバレッジ）の基準に「論理網羅」があります。「論理網羅」では、コード網羅の複数条件網羅(MCC)を条件網羅(C2)と呼ぶため、基本情報や応用情報の参考書を読んだ人は違和感あるかもしれません。</span></p>
<p class="footnote"><a href="#fn-1c1c46fc" name="f-1c1c46fc" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">満たす＝網羅率100%になるという意味です。</span></p>
<p class="footnote"><a href="#fn-55b4b4f1" name="f-55b4b4f1" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">まさに条件網羅の1種類目のテストケースが該当しますね</span></p>
<p class="footnote"><a href="#fn-18929dc2" name="f-18929dc2" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">自動構文チェッカーなどが該当する</span></p>
<p class="footnote"><a href="#fn-d0af7b66" name="f-d0af7b66" class="footnote-number">*6</a><span class="footnote-delimiter">:</span><span class="footnote-text">プログラミング系の授業で「とりあえずこのプログラムの動きをトレースしてみよう」と言われることありませんでしたか。私は先生によく言われていました。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-software10/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるソフトウェア工学　Part09　モジュール分割とモジュール独立度（強度、結合度）</title>
		<link>https://www.momoyama-usagi.com/entry/info-software09</link>
					<comments>https://www.momoyama-usagi.com/entry/info-software09#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sun, 02 Aug 2020 15:05:28 +0000</pubDate>
				<category><![CDATA[ソフトウェア工学]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-software09</guid>

					<description><![CDATA[ソフトウェア分野の中でも、モジュール分割、および基本情報に特に頻出するモジュール独立度（モジュール強度と結合度）についてうさぎでもわかるようにわかりやすくまとめています
]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、ももやまです。</p>



<p>今回はプログラム設計（ソフトウェア詳細設計）の際に行われるモジュール分割と、モジュールの独立度（モジュール強度、結合度）についてまとめを書きました。</p>



<p>特にモジュール独立の関する</p>



<ul class="wp-block-list"><li>モジュール強度</li><li>モジュール結合度</li></ul>



<p>については基本情報で頻出するため、基本情報を受ける人は必ず確認しておきましょう。</p>



<p>前回のソフトウェア工学の記事はこちら！</p>



<p><cite class="hatena-citation"><a href="https://www.momoyama-usagi.com/entry/info/software08">www.momoyama-usagi.com</a></cite></p>



<p>UMLの振る舞いを表すユースケース図、シーケンス図、アクティビティ図についての説明です！</p>



<h2 class="wp-block-heading" id="１モジュール分割のメリット">１．モジュール分割のメリット</h2>



<p>内部設計（プログラム方式設計）されたプログラムは、プログラム設計（ソフトウェア詳細設計）の際にモジュールと呼ばれる単位に分割を行います。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802213952.gif" alt="f:id:momoyama1192:20200802213952g:plain" title="f:id:momoyama1192:20200802213952g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>モジュール単位に分割することで、モジュール単位で作成、テストを行えるため、<span class="marker-yellow"><b>並行して複数の作業を行う</b></span>ことができます。</p>



<p>また、モジュール単位で問題が起こった位置の特定、デバッグが行えるため、<span class="marker-yellow"><b>保守性に優れたプログラムを作る</b></span>ことができます。</p>



<h2 class="wp-block-heading" id="２2つのモジュール分割技法">２．2つのモジュール分割技法</h2>



<p>モジュール分割技法には<span class="marker-lightskyblue"><b>データの流れに着目する方法3種類</b></span>と<span class="marker-lime"><b>データの構造に注目する方法2種類</b></span>の合計5種類があります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214025.jpg" alt="f:id:momoyama1192:20200802214025j:plain" title="f:id:momoyama1192:20200802214025j:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p><span class="marker-yellow"><b>人名がついている分割技法はデータの構造に注目する方法、人名がついていない分割技法はデータの流れに注目する方法</b></span>と頭にいれておきましょう。</p>



<p>この方法で頭に入れておけば、試験のときに「あれ、この手法ってデータの流れと構造どっちに注目するんだっけ？」となるのを防ぐことができます。</p>



<p>では、それぞれの分割手法の特徴を下でおさえましょう。</p>



<h3 class="wp-block-heading" id="1-データの流れに着目する分割技法">(1) データの流れに着目する分割技法</h3>



<p>データの流れに着目する方法には、STS分割法、トランザクション(TR)分割法、共通機能分割法の3つがあります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802231726.jpg" alt="f:id:momoyama1192:20200802231726j:plain" title="f:id:momoyama1192:20200802231726j:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="i-STS分割法">(i) STS分割法</h4>



<p>STSでは、プログラムを入力処理(Source)、メイン処理(Transform)、出力処理(Sink)の3つに分割する方法です。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802213957.gif" alt="f:id:momoyama1192:20200802213957g:plain" title="f:id:momoyama1192:20200802213957g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>なお、STSは、Source(源泉), Transform(変換), Sink(吸収)の3つの頭文字を表したものです。</p>



<h4 class="wp-block-heading" id="ii-トランザクション分割法TR分割法">(ii) トランザクション分割法（TR分割法）</h4>



<p>プログラムを処理内容ごとにトランザクションと呼ばれるグループに分け、トランザクションごとにモジュールを分割する方法です。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214003.gif" alt="f:id:momoyama1192:20200802214003g:plain" title="f:id:momoyama1192:20200802214003g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="iii-共通機能分割法">(iii) 共通機能分割法</h4>



<p>プログラム中にある共通な機能を1つにまとめて、共通モジュールとして独立、分割する方法です。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214009.gif" alt="f:id:momoyama1192:20200802214009g:plain" title="f:id:momoyama1192:20200802214009g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h3 class="wp-block-heading" id="2-データの構造に注目する分割手法">(2) データの構造に注目する分割手法</h3>



<p>データの構造に注目する分割手法では、ジャクソン法とワーニエ法の2つがあります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214020.jpg" alt="f:id:momoyama1192:20200802214020j:plain" title="f:id:momoyama1192:20200802214020j:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>ジャクソン法は<span class="marker-yellow"><b>入力、出力両方のデータ構造</b></span>に着目して分割しますが、ワーニエ法では<b><span class="marker-yellow">入力のデータ構造のみ</span></b>に注目して分割するのが特徴です。</p>



<h2 class="wp-block-heading" id="３モジュールの独立度">３．モジュールの独立度</h2>



<p>モジュール分割を行う際には、それぞれのモジュールの設計を切り離して行うために、「それぞれのモジュールが独立するような分割方法」、具体的には、</p>



<ul class="wp-block-list"><li>それぞれのモジュールが明確である</li><li>入出力データが明確である</li></ul>



<p>の2点を満たすようにモジュールを分割する必要があります。</p>



<p>そこで、どれくらいモジュールが独立しているか（モジュールの独立性）を測る尺度として、</p>



<ul class="wp-block-list"><li>モジュール強度</li><li>モジュール結合度</li></ul>



<p>の2つが使われるようになりました。</p>



<h3 class="wp-block-heading" id="1-モジュール強度">(1) モジュール強度</h3>



<p>モジュール内にある機能の関連の強さを表す基準となるのが<span class="marker-green"><b>モジュール強度</b></span>です。</p>



<p>具体的に言うと、<span class="marker-yellow"><b>モジュールがどれくらい単一の機能に特化して設計されているか</b></span>の度合いを表します。</p>



<p>モジュール強度には、以下の7段階があります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214029.gif" alt="f:id:momoyama1192:20200802214029g:plain" title="f:id:momoyama1192:20200802214029g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>基本的に、</p>



<ul class="wp-block-list"><li>単一の機能をモジュールにしたのか、複数の機能をモジュールにしたのか</li><li>複数の機能をモジュールにしている場合、順番が関係あるのかないのか</li><li>モジュールの入力、出力データは共通なのか機能ごとに独立しているか</li></ul>



<p>の3つを基準に強度が決定します。</p>



<p>基本情報などの情報処理試験に超頻出するので必ず頭に入れておきましょう。</p>



<p>ということで、それぞれの強度が具体的にどのような状態なのかを強い順に見ていきましょう。</p>



<h4 class="wp-block-heading" id="機能的強度">機能的強度</h4>



<p>単一の機能を実行するモジュールです。</p>



<p>シンプルでわかりやく、強度が高いため、非常に独立性が高いです。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214039.gif" alt="f:id:momoyama1192:20200802214039g:plain" title="f:id:momoyama1192:20200802214039g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="情報的強度">情報的強度</h4>



<p>同じデータ構造を扱う機能をまとめたモジュールです。</p>



<p>イメージは<a href="https://www.momoyama-usagi.com/entry/info/software06">オブジェクト指向</a>のカプセル化です。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214043.gif" alt="f:id:momoyama1192:20200802214043g:plain" title="f:id:momoyama1192:20200802214043g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="連絡的強度通信的強度">連絡的強度（通信的強度）</h4>



<p>複数の機能が順番に実行されるモジュールです。</p>



<p>ただし、それぞれの機能の入出力として共通のデータを参照します。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214047.gif" alt="f:id:momoyama1192:20200802214047g:plain" title="f:id:momoyama1192:20200802214047g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="手順的強度">手順的強度</h4>



<p>連絡的強度と同じく、複数の機能が順番に実行されるモジュールです。</p>



<p>ただし、連絡的強度と違う点として<span class="marker-yellow"><b>それぞれの機能の入出力は別々のデータとなっている点</b></span>があります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214053.gif" alt="f:id:momoyama1192:20200802214053g:plain" title="f:id:momoyama1192:20200802214053g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="時間的強度">時間的強度</h4>



<p>初期化処理、終了処理などの特定のタイミングで必要になる処理をまとめたモジュールです。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214059.gif" alt="f:id:momoyama1192:20200802214059g:plain" title="f:id:momoyama1192:20200802214059g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>ここまでくるとだいぶ強度が弱くなってきます。</p>



<h4 class="wp-block-heading" id="論理的強度">論理的強度</h4>



<p>関連のあるいくつかの機能まとめたモジュールです。</p>



<p>どの機能を実行するかは「入力パラメータ」によって決まります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214103.gif" alt="f:id:momoyama1192:20200802214103g:plain" title="f:id:momoyama1192:20200802214103g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h4 class="wp-block-heading" id="暗号的強度">暗号的強度</h4>



<p>関連のないいくつかの機能をまとめたモジュールです。</p>



<p>とりあえず複数のモジュールをまとめてみました、って感じですね。</p>



<h3 class="wp-block-heading" id="2-モジュール結合度">(2) モジュール結合度</h3>



<p>モジュール間の結合（関連）の度合いを表す基準となるのが<span class="marker-green"><b>モジュール結合度</b></span>です。</p>



<p>具体的には、<span class="marker-yellow"><b>モジュール同士がどれだけ独立に or 関連して設計されたかの度合い</b></span>を表します。</p>



<p>モジュール結合度には、以下の6段階があります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200802214034.gif" alt="f:id:momoyama1192:20200802214034g:plain" title="f:id:momoyama1192:20200802214034g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>基本的に、</p>



<ul class="wp-block-list"><li>変数を渡す際に引数で渡すのか、それとも外部宣言されたデータ（グローバル変数、大域変数）を参照するか</li><li>引数として渡したのは単一のデータ(int型, double型)なのか構造体として渡したか</li><li>制御パラメータを用いてモジュールの実行順序を制御するか</li></ul>



<p>の3つを基準に結合度、独立性が決定します。</p>



<p>（結合度はどれくらい依存しているかを表しているため、結合度と独立性は反比例する点に要注意<a href="#f-46b3cefb" name="fn-46b3cefb" title="カップルでも依存すればするほど彼氏彼女単体で独立して行動するのが難しくなるよね～って覚えておけばたぶん忘れないと思います。">*1</a>！）</p>



<p>こちらも基本情報などの情報処理試験に超頻出するので必ず頭に入れておきましょう。</p>



<p>ということで、それぞれの結合度が具体的にどのような状態なのかを強い順にプログラムとセットで見ていきましょう。</p>



<h4 class="wp-block-heading" id="データ結合">データ結合</h4>



<p>モジュールで必要なデータ項目だけを引数として渡します。</p>



<p>[データ結合の例]</p>



<p>「英語の成績」、「国語の成績」、「数学の成績」の3つを引数から3教科の平均点を求める。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
double dataBinding(int eng, int math, int jpn) {
    return (eng + math + jpn) / 3.0;
}
</pre></div>


<p>最も独立度が強く、結合度が弱いモジュールです。</p>



<h4 class="wp-block-heading" id="スタンプ結合">スタンプ結合</h4>



<p>モジュールで必要なデータ構造を引数として渡します。</p>



<p>[スタンプ結合の例]</p>



<p>3教科の点数が入った構造体から3教科の平均点を求める。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
typedef struct score {  
    int id; // 受験番号
    char name&#x5B;50]; // 名前
    int eng;  // 英語のの点数
    int math; // 数学の点数 
    int jpn;  // 国語の点数
} SCORE;

double stampBinding(SCORE my_score) {
    return (my_score.eng + my_score.math + my_score.jpn) / 3.0;
}
</pre></div>


<p>データ結合に比べ、構造体の内容に依存してしまうため、モジュール独立度が弱く（モジュール結合度が強く）なってしまいます</p>



<h4 class="wp-block-heading" id="制御結合">制御結合</h4>



<p>引数として制御パラメータを渡すことでモジュールの実行順序を制御します。</p>



<p>他の引数は単一のデータ項目でもデータ構造でもOKです。</p>



<p>[制御結合の例]</p>



<p>名前や3教科の点数が入った構造体から3教科の合計点を表示する。ただし、男性の場合と男性以外の場合で表示が微妙に変わる。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
typedef struct score {  
    int id; // 受験番号
    char name&#x5B;50]; // 名前
    int eng;  // 英語のの点数
    int math; // 数学の点数 
    int jpn;  // 国語の点数
} SCORE;

void controlBinding(SCORE my_score, int gender) {
    int total = my_score.eng + my_score.math + my_score.jpn;
    // 男性(1)か男性以外で分岐
    if(gender == 1) { 
        printf(&quot;%sくんの合計点は%3d/300です！\n&quot;,my_score.name,total);
    }
    else {
        printf(&quot;%sさんの合計点は%3d/300です！\n&quot;,my_score.name,total);
    }
}
</pre></div>


<h4 class="wp-block-heading" id="外部結合">外部結合</h4>



<p>外部宣言された変数（グローバル変数）を参照するモジュールです。</p>



<p>ただし、参照するグローバル変数は単一の変数です。</p>



<p>[外部結合の例]</p>



<p>引数で与えられた「英語の成績」、「国語の成績」、「数学の成績」のうち、どれか1つでも外部変数で与えられる基準値を下回っていれば0（不合格）、それ以外（全部基準点以上）なら1を出力するプログラム（モジュール）。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
int border = 60;
int externalBinding(int eng, int math, int jpn) {
    if(eng &lt; border || math &lt; border || jpn &lt; border) {
        return 0; // 3教科のうち1つでも基準点に満たなければ不合格
    }
    else {
        return 1; // 合格
    }
}
</pre></div>


<h4 class="wp-block-heading" id="共通結合">共通結合</h4>



<p>外部結合と同じく、外部宣言された変数（グローバル変数）を参照するモジュールです。</p>



<p>ただし、参照するグローバル変数が単一データではない（構造体など）のが外部結合と違うポイントです。</p>



<p>（共通域に定義したデータを参照するモジュールと書かれている参考書も多くあります。）</p>



<p>[共通結合の例]</p>



<p>共通域に定義されている配列の平均値を返すモジュール（プログラム）。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
int data&#x5B;5] = {55,66,22,77,44};
int n = 5;
double commonBinding(void) {
    int sum = 0;
    for(int i = 0; i &lt; n; i += 1) {
        sum += data&#x5B;i];
    }

    return sum * 1.0 / n;
}
</pre></div>


<h4 class="wp-block-heading" id="内容結合">内容結合</h4>



<p>ほかのモジュール内のデータを直接参照するモジュールです。</p>



<p>ほかのモジュールに依存してしまっているため、結合度が大変強く、独立性が大変低いです。</p>



<h2 class="wp-block-heading" id="４練習問題">４．練習問題</h2>



<p>では、4問ほど基本情報、応用情報、高度情報の問題で練習してみましょう。</p>



<h3 class="wp-block-heading" id="練習1">練習1</h3>



<p>モジュール強度が最も高いものはどれか。</p>



<p>[基本情報技術者平成19年春期 午前問43]</p>



<p>ア：あるデータを対象として逐次的に複数の機能を実行するモジュール<br>イ：異なる入力媒体からのデータを処理するモジュール<br>ウ：単一の機能を実行するモジュール<br>エ：特定の時点で必要とされる作業のすべてを含んでいるモジュール</p>



<h3 class="wp-block-heading" id="練習2">練習2</h3>



<p>モジュールの独立性を高めるには、モジュール結合度を低くする必要がある。モジュール間の情報の受渡し方法のうち、モジュール結合度が最も低いものはどれか。</p>



<p>[基本情報技術者平成28年春期 午前問47]</p>



<p>ア：共通域に定義したデータを関係するモジュールが参照する。<br>イ：制御パラメタを引数として渡し、モジュールの実行順序を制御する。<br>ウ：データ項目だけをモジュール間の引数として渡す。<br>エ：必要なデータを外部宣言して共有する。</p>



<h3 class="wp-block-heading" id="練習3">練習3</h3>



<p>プログラムの構造化設計におけるモジュール分割技法の説明のうち、適切なものはどれか。</p>



<p>[システムアーキテクト平成22年度秋期 午前Ⅱ問5]</p>



<p>ア：STS分割は、プログラムをデータの流れに着目して分割する技法であり、入力データの処理、入力から出力への変換及び出力データの処理の三つの部分で構成することで、モジュールの独立性が高まる。<br>イ：TR分割は、プログラムをデータの構造に着目して分割する技法であり、オンラインリアルタイム処理のように、入力トランザクションの種類に応じて処理が異なる場合に有効である。<br>ウ：共通機能分割は、プログラムをデータの構造に着目して分割する技法であり、共通な処理を一つにまとめ、共通モジュールとする。<br>エ：ジャクソン法は、プログラムをデータの流れに着目して分割する技法であり、バッチ処理プログラムの分割に適している。</p>



<h2 class="wp-block-heading" id="５練習問題の答え">５．練習問題の答え</h2>



<h3 class="wp-block-heading" id="解答1">解答1</h3>



<p>解答：ウ</p>



<p>モジュール強度を高くするには</p>



<ul class="wp-block-list"><li>なるべく単一の機能を実行するようにする</li><li>複数の機能を実行するのであれば機能を順番ごとに対応づける</li><li>入出力データを共通にする</li></ul>



<p>などがありましたね。</p>



<p>選択肢を見ていくと、圧倒的に結合度が強い「単一の機能を実行するモジュール」があるので、答えはウとなります。</p>



<p>[他の選択肢]</p>



<p>ア：あるデータを対象として逐次的に複数の機能を実行するモジュール <br>→ 手順的強度 or 連絡的強度（2番目に強い）</p>



<p>イ：異なる入力媒体からのデータを処理するモジュール<br>→ 論理的強度（4番目に強い）</p>



<p>ウ：単一の機能を実行するモジュール<br>→ 機能的強度。最強。選択肢の中だと1番強い。</p>



<p>エ：特定の時点で必要とされる作業のすべてを含んでいるモジュール<br>→ 時間的強度（3番目に強い）</p>



<h3 class="wp-block-heading" id="解答2">解答2</h3>



<p>解答：ウ</p>



<p>モジュール結合度を弱くする方法には、</p>



<ul class="wp-block-list"><li>データ項目を外部宣言された変数（グローバル変数）を使うのではなく、引数として渡す</li><li>引数にデータ構造ではなく、単一のデータ項目を使う</li><li>制御パラメータで実行順序を制御しない</li></ul>



<p>の3つがあります。</p>



<p>ア：共通域に定義したデータを関係するモジュールが参照する。<br>→ 共通域に定義したデータを使ってしまうと大域変数に依存することになるため、モジュール結合度は強くなってしまいます。（共通結合）</p>



<p>イ：制御パラメタを引数として渡し、モジュールの実行順序を制御する。<br>→ 制御パラメータに依存することになるため、モジュール結合度は強くなってしまいます。（制御結合）</p>



<p>ウ：データ項目だけをモジュール間の引数として渡す。<br>→ データ項目を引数として渡すため、独立したモジュールとなり、モジュール結合度が弱くなります。（答え）</p>



<p>エ：必要なデータを外部宣言して共有する。<br>→ 外部宣言したデータを使っているため、モジュール結合度は強くなってしまいます。（外部結合）</p>



<h3 class="wp-block-heading" id="解答3">解答3</h3>



<p>解答：ア</p>



<p>データの流れに着目する分割技法は、</p>



<ul class="wp-block-list"><li>STS分割法</li><li>トランザクション(TR)分割</li><li>共通機能分割法</li></ul>



<p>の3つ、データ構造に着目する分割技法は、</p>



<ul class="wp-block-list"><li>ジャクソン法</li><li>ワーニエ法</li></ul>



<p>の2つでしたね。</p>



<p>選択肢を見ると、</p>



<p>イ：TR分割は、プログラムをデータの構造に着目して分割する技法であり、オンラインリアルタイム処理のように、入力トランザクションの種類に応じて処理が異なる場合に有効である。 <br>→ TR分割はデータの流れに着目して分割する技法なのでNG。</p>



<p>ウ：共通機能分割は、プログラムをデータの構造に着目して分割する技法であり、共通な処理を一つにまとめ、共通モジュールとする。<br>→ 共通機能分割はデータの流れに着目して分割する技法なのでNG。</p>



<p>エ：ジャクソン法は、プログラムをデータの流れに着目して分割する技法であり、バッチ処理プログラムの分割に適している。<br>→ ジャクソン法はデータの構造に着目して分割する技法なのでNG。</p>



<p>と「データの流れに着目」するか「データ構造に着目」するかで残りの3つの選択肢が消せてしまう。</p>



<p>よって残ったアが答え。</p>



<h2 class="wp-block-heading" id="６さいごに">６．さいごに</h2>



<p>今回は、ソフトウェア工学の分野の中でも</p>



<ul class="wp-block-list"><li>モジュール分割</li><li>モジュール独立度（モジュール強度・結合度）</li></ul>



<p>の2つについてわかりやすく説明しました。</p>



<p>基本情報では、モジュール独立度についての出題が多いので、モジュール独立度に関するところ（モジュール強度、モジュール結合度）は必ず見直ししておきましょう！</p>



<p>次回はソフトウェア工学の「テスト」に関する部分について見ていきたいと思います！</p>



<div class="footnote">
<p class="footnote"><a href="#fn-46b3cefb" name="f-46b3cefb" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">カップルでも依存すればするほど彼氏彼女単体で独立して行動するのが難しくなるよね～って覚えておけばたぶん忘れないと思います。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-software09/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるソフトウェア工学　Part08　UML後編（シーケンス図・ユースケース図・アクティビティ図）</title>
		<link>https://www.momoyama-usagi.com/entry/info-software08</link>
					<comments>https://www.momoyama-usagi.com/entry/info-software08#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Fri, 31 Jul 2020 04:30:21 +0000</pubDate>
				<category><![CDATA[ソフトウェア工学]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-software08</guid>

					<description><![CDATA[今回は、UMLの振る舞いを表す図の中でも特に重要なシーケンス図、ユースケース図、アクティビティ図の3つについてわかりやすく説明しています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回は、前回に引き続きオブジェクト指向の設計で使われ、基本情報にもよく出てくるUMLの読み方、書き方について説明します。</p>
<p>UMLには全部で13種類の図があります。</p>
<p>13種類の図は大きく分けると、<strong><span class="marker-lightskyblue">構造を表す図6種類</span></strong>と、<strong><span class="marker-lime">振る舞いを表す図7種類</span></strong>に分けることができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160611.jpg" alt="f:id:momoyama1192:20200725160611j:plain" title="f:id:momoyama1192:20200725160611j:plain" class="hatena-fotolife" itemprop="image"></p>
<p>後編部分となるこの記事では、振る舞いを表す図、特にシーケンス図、ユースケース図、アクティビティ図の3つの読み方、書き方を中心に説明をしていきます。</p>
<p>前編では設計の構造を表すクラス図、オブジェクト図について説明しているので、クラス図やオブジェクト図の説明を見たい方は、下の記事をご覧ください。</p>
<p><cite class="hatena-citation"><a href="https://www.momoyama-usagi.com/entry/info/software07">www.momoyama-usagi.com</a></cite></p>
<h2 class="wp-block-heading">０．振る舞いを表す図</h2>
<p>まず、振る舞いを表す7種類の図にはどんなものがあるかを見ていきましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160620.jpg" alt="f:id:momoyama1192:20200725160620j:plain" title="f:id:momoyama1192:20200725160620j:plain" class="hatena-fotolife" itemprop="image"></p>
<p>基本情報の午前では、上の表の赤色で示しているシーケンス図、ユースケース図、アクティビティ図がどんな図なのかを聞かれることが特に多いので、最低でもこの3つの図はどんなことができるのかを頭に入れておきましょう。</p>
<p>（たまにコミュニケーション図とかも出てきますが…）</p>
<p>また、午後の選択問題「ソフトウェア設計」では、「シーケンス図」に関する問題が出題される可能性が比較的高いです。（UMLを使う問題の場合）</p>
<p>そのため、シーケンス図については少し詳しめに説明します。</p>
<h2 class="wp-block-heading">１．シーケンス図</h2>
<h3 class="wp-block-heading">(1) シーケンス図とは</h3>
<p>シーケンス図は、<strong><span class="marker-yellow">アクター（システム利用者）やシステム内部の間でのオブジェクトのやり取り（相互作用）を時系列で表す</span></strong>図です。</p>
<p>例えば、</p>
<ul class="wp-block-list dbp-list"><li>利用者は券売機で切符を買う</li><li>利用者が券売機で買った切符を改札に入れると、ゲートを開き、切符に時刻を打刻する</li></ul>
<p>の切符を買ってから改札を通るまでの処理をシーケンス図で表すと、下のように書くことができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033546.gif" alt="f:id:momoyama1192:20200731033546g:plain" title="f:id:momoyama1192:20200731033546g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>では、上の図をどう読むのかを見ていきましょう。</p>
<h3 class="wp-block-heading">(2) シーケンス図の用語説明</h3>
<p>シーケンス図は、</p>
<ul class="wp-block-list dbp-list"><li>それぞれのオブジェクトの時系列を表すライフライン（下方向に伸びる破線）</li><li>オブジェクトのやり取りを表すメッセージ（3つの矢印で表現）</li></ul>
<p>に分けることができます。</p>
<h4 class="wp-block-heading">(i) ライフライン(各オブジェクト)</h4>
<p>それぞれのオブジェクトのライフライン（生存期間）を破線で表します。</p>
<p>生存期間（破線）の中で、オブジェクトが実行中である区間のことを<strong><span class="marker-green">活性区間</span></strong>と呼び、□で表します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033534.gif" alt="f:id:momoyama1192:20200731033534g:plain" title="f:id:momoyama1192:20200731033534g:plain" class="hatena-fotolife" itemprop="image" width="400"></p>
<p>※ なお、オブジェクトの停止を表す×は「オブジェクトの消滅」を強調する際にのみ使われるので、あまり使われません。（そこまで重要ではないので概念だけ覚えておきましょう）</p>
<h4 class="wp-block-heading">(ii) メッセージ（3つの矢印）</h4>
<p>オブジェクト間のやり取りは以下の3つの矢印で表します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731105755.gif" alt="f:id:momoyama1192:20200731105755g:plain" title="f:id:momoyama1192:20200731105755g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>また、<strong><span class="marker-yellow">時系列が早いものは上に、遅いものは下に</span></strong>書かれます。</p>
<p>例えば上の図であれば、</p>
<ul class="wp-block-list dbp-list"><li>青色矢印</li><li>オレンジ色矢印</li><li>黄緑色矢印</li></ul>
<p>の順で実行されます。</p>
<p>また、矢印の上には<strong><span class="marker-green">メッセージの内容（処理の内容）</span></strong>や<strong><span class="marker-green">応答メッセージ（返り値）</span></strong>を書きます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731105800.gif" alt="f:id:momoyama1192:20200731105800g:plain" title="f:id:momoyama1192:20200731105800g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>省略されることが多いですが、メッセージの内容を書く際に<strong><span class="marker-yellow">括弧 () で引数を示す</span></strong>こともあります。</p>
<p>先程例にだしたこちらのシーケンス図の</p>
<ul class="wp-block-list dbp-list"><li>各オブジェクトのライフライン</li><li>メッセージ間のやり取りの時系列</li></ul>
<p>を確認してみましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033546.gif" alt="f:id:momoyama1192:20200731033546g:plain" title="f:id:momoyama1192:20200731033546g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>この場合、矢印が上にある順、つまり</p>
<ul class="wp-block-list dbp-list"><li>利用者が券売機で切符を買う</li><li>買った切符を利用者は手に入れる</li><li>利用者が手に入れた切符を改札に入れる</li><li>改札はゲートを開く</li><li>時刻が打刻された切符を利用者は手に入れる</li></ul>
<p>の順番で処理されることを表しています。</p>
<h4 class="wp-block-heading">(iii) メッセージの同期と非同期</h4>
<p>非同期メッセージの矢印は、あまり使いませんが念のため同期との違いを確認しておきましょう。</p>
<p>メッセージの同期と非同期の違いは、<strong><span class="marker-yellow">応答メッセージを待たずにメッセージを送るか送らないかの違い</span></strong>です。</p>
<p>同期と非同期の違いを確認するために、先程の例の同期メッセージの1つを非同期にした下の図を見てみましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033550.gif" alt="f:id:momoyama1192:20200731033550g:plain" title="f:id:momoyama1192:20200731033550g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>この図の場合「切符を入れる」のが非同期なため、1つ前の操作「切符を買う」の<strong><span class="marker-yellow">応答メッセージを待たずに</span></strong>処理が始まります。</p>
<p>つまり、切符を持たずに改札に突破するというちょっと危ない行為が実現されちゃいます。</p>
<p>このように、同期と非同期には少し大きな差があるので、非同期メッセージを使う場合は気を付けましょう。</p>
<h4 class="wp-block-heading">(iv) 条件分岐</h4>
<p>シーケンス図では、ある条件を満たすとき、満たさないときに分けて処理内容を書くことができます<a href="#f-482aa2a6" name="fn-482aa2a6" title="条件満たすときの処理を基本系列、満たさないときの処理（例外処理）を代替系列と呼ぶこともあります。">*1</a>。</p>
<p>例えば、ICカードを用いて改札を通り抜ける処理は、</p>
<ul class="wp-block-list dbp-list"><li>残高があるとき<br>（そのまま改札を通過）</li><li>残高不足のとき<br>（いったん券売機でチャージしてから改札を通過）</li></ul>
<p>の2通りに分けて下のように書くことができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033555.gif" alt="f:id:momoyama1192:20200731033555g:plain" title="f:id:momoyama1192:20200731033555g:plain" class="hatena-fotolife" itemprop="image"></p>
<h2 class="wp-block-heading">２．ユースケース図</h2>
<p>ユースケース図は、<strong><span class="marker-yellow">システムを利用する人から</span></strong>見たときに<strong><span class="marker-yellow">システムで出来ることはどんなことか</span></strong>を列挙した図です。</p>
<p>（利用者とシステムとのやり取りの関係を表した図と言ってもいいでしょう。）</p>
<p>利用者視点で見せるので、専門用語など開発者にしかわからない用語ではなく、エンドユーザー（システム利用者）がわかるような用語を使うのがポイントです。</p>
<p>例えば、下にある（某みどりの）券売機の発券システムで、</p>
<ul class="wp-block-list dbp-list"><li>乗車券を買う</li><li>回数券を買う</li><li>特急券を買う</li><li>指定席を予約する</li><li>おトクなきっぷを予約する</li></ul>
<p>のことができるとします。この場合、ユースケース図は下のようになります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033600.gif" alt="f:id:momoyama1192:20200731033600g:plain" title="f:id:momoyama1192:20200731033600g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>シーケンス図のメッセージ内容（処理内容）をすべて箇条書きにしてまとめたものがユースケース図だと思ってください。</p>
<h2 class="wp-block-heading">３．アクティビティ図</h2>
<h3 class="wp-block-heading">(1) アクティビティ図とは</h3>
<p>アクティビティ図は、<strong><span class="marker-yellow">あるクラスの処理の開始から終了までの一連の流れを表した図</span></strong>です。</p>
<p>基本的な書き方はフローチャートとほぼ同じです。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033605.gif" alt="f:id:momoyama1192:20200731033605g:plain" title="f:id:momoyama1192:20200731033605g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">(2) 並行処理</h3>
<p>下のように、処理を下のように線で書こうことにより、処理が並行して実行されることを表します。</p>
<p>例えば、下の図の場合、</p>
<ul class="wp-block-list dbp-list"><li>ご飯を炊く</li><li>肉を焼く</li></ul>
<p>の2つの処理を並行して処理することを表しています。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033616.gif" alt="f:id:momoyama1192:20200731033616g:plain" title="f:id:momoyama1192:20200731033616g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">(3) 複数クラスに着目した書き方</h3>
<p>アクティビティ図では、下のように2つ以上のクラスに注目した処理内容を書くことができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200731033622.gif" alt="f:id:momoyama1192:20200731033622g:plain" title="f:id:momoyama1192:20200731033622g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>上のアクティビティ図はICカードを用いて改札を通り抜ける処理を「改札」と「券売機」の2つのクラスに着目して書いたものです。</p>
<h2 class="wp-block-heading">４．練習問題</h2>
<p>では、基本情報や応用情報の問題で練習をしていきましょう。</p>
<p>構造を表す図（クラス図・オブジェクト図）とは異なり、それぞれの図がどんな特徴を持っているかについて出題されることが多いです。</p>
<h3 class="wp-block-heading">練習1</h3>
<p>UML(Unified Modeling Language)が定義する図のうち、オブジェクト間の相互作用を表現するためのものはどれか。</p>
<p>[基本情報技術者平成17年秋期 午前問38]</p>
<p>ア: オブジェクト図<br>
イ: クラス図<br>
ウ: コンポーネント図<br>
エ: シーケンス図</p>
<h3 class="wp-block-heading">練習2</h3>
<p>UMLにおける振る舞い図の説明のうち、アクティビティ図のものはどれか。</p>
<p>ア: ある振る舞いから次の振る舞いへの制御の流れを表現する。<br>
イ: オブジェクト間の相互作用を時系列で表現する。<br>
ウ: システムが外部に提供する機能と、それを利用する者や外部システムとの関係を表現する。<br>
エ: 一つのオブジェクトの状態がイベントの発生や時間の経過とともにどのように変化するかを表現する。</p>
<h3 class="wp-block-heading">練習3</h3>
<p>UMLのユースケース図の説明はどれか。</p>
<p>[応用情報技術者平成26年秋期 午前問46]</p>
<p>ア: 外部からのトリガに応じて、オブジェクトの状態がどのように遷移するかを表現している。<br>
イ: クラスと関連から構成され、システムの静的な構造を表現している。<br>
ウ: システムとアクタの相互作用を表現している。<br>
エ: データの流れに注目してシステムの機能を表現している。</p>
<p>余裕がある人は、下のリンクで貼った基本情報の午後問題を解いてみましょう。</p>
<p>シーケンス図だけを使った問題です。</p>
<p><cite class="hatena-citation"><a href="https://www.fe-siken.com/kakomon/28_haru/pm05.html">www.fe-siken.com</a></cite></p>
<h2 class="wp-block-heading">５．練習問題の答え</h2>
<h3 class="wp-block-heading">解答1</h3>
<p>解答：エ</p>
<p>[それぞれの選択肢]</p>
<p>ア: オブジェクト図<br>
→ オブジェクト（インスタンス）の状態、関連を表した図。オブジェクト間の相互作用だからオブジェクト図だろと安易に考えないように。</p>
<p>イ: クラス図<br>
→ クラスの定義、関連づけを表す図。</p>
<p>ウ: コンポーネント図<br>
→ 同じ処理をする複数のクラスを1つのグループにまとめて、それらの関係を表したもの。</p>
<p>エ: シーケンス図<br>
→オブジェクト間の相互作用を表現する図。正解。</p>
<h3 class="wp-block-heading">解答2</h3>
<p>解答：ア</p>
<p>[それぞれの選択肢]</p>
<p>ア: ある振る舞いから次の振る舞いへの制御の流れを表現する。<br>
→ 正解、アクティビティ図の説明。</p>
<p>イ: オブジェクト間の相互作用を時系列で表現する。<br>
→ シーケンス図のこと。</p>
<p>ウ: システムが外部に提供する機能と、それを利用する者や外部システムとの関係を表現する。<br>
→ ユースケース図のこと。</p>
<p>エ: 一つのオブジェクトの状態がイベントの発生や時間の経過とともにどのように変化するかを表現する。<br>
→ 状態遷移図のこと。</p>
<h3 class="wp-block-heading">解答3</h3>
<p>解答：ウ</p>
<p>[それぞれの選択肢]</p>
<p>ア: 外部からのトリガに応じて、オブジェクトの状態がどのように遷移するかを表現している。<br>
→ アクティビティ図のこと。</p>
<p>イ: クラスと関連から構成され、システムの静的な構造を表現している。<br>
→ クラス図のこと。</p>
<p>ウ: システムとアクタの相互作用を表現している。<br>
→ 正解、ユースケース図のこと。</p>
<p>エ: データの流れに注目してシステムの機能を表現している。<br>
→ DFDのこと。UMLですらない。DFDについては<a href="https://www.momoyama-usagi.com/entry/info/software04">こちら</a>の記事をご覧ください。</p>
<h2 class="wp-block-heading">６．さいごに</h2>
<p>今回は、前回に引き続きUMLの中でもシーケンス図、ユースケース図、アクティビティ図の読み方、書き方について説明しました。</p>
<p>基本情報の午後問題で「ソフトウェア設計」を取らないのであれば、それぞれの図が何を中心に表すのかを理解しておけばOKです。</p>
<p>午後で「ソフトウェア設計」を取るのであれば、最低でも</p>
<ul class="wp-block-list dbp-list"><li>クラス図</li><li>オブジェクト図</li><li>シーケンス図</li></ul>
<p>の3つは読めるようにしましょう。（午後で頻出されるのはこの3つなので）</p>
<div class="footnote">
<p class="footnote"><a href="#fn-482aa2a6" name="f-482aa2a6" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">条件満たすときの処理を基本系列、満たさないときの処理（例外処理）を代替系列と呼ぶこともあります。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-software08/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【基本情報対策】うさぎでもわかるソフトウェア工学　Part07　UML前編（クラス図とオブジェクト図）</title>
		<link>https://www.momoyama-usagi.com/entry/info-software07</link>
					<comments>https://www.momoyama-usagi.com/entry/info-software07#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sun, 26 Jul 2020 16:00:00 +0000</pubDate>
				<category><![CDATA[ソフトウェア工学]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-software07</guid>

					<description><![CDATA[オブジェクト指向の設計で使われるUMLの中でも、クラス図やオブジェクト図のように設計の構造を表す図の読み方、書き方について説明しています。
]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ももやまです。</p>
<p>今回から前編と後編の2回に分けてオブジェクト指向の設計で使われるUMLの書き方について説明します。</p>
<p> </p>
<p>この記事では前編部分、具体的には設計の構造を表すクラス図、オブジェクト図の2つの読み方、書き方についての説明をしていきます。</p>
<p>（なお、後編では設計の振る舞い（動き方）を表すアクティビティ図、ユースケース図、シーケンス図について説明する予定です。）</p>
<p> </p>

<p> </p>
<p>UMLではオブジェクト指向に関する用語（クラス、オブジェクト、汎化など）がたくさん出てきます。</p>
<p>オブジェクト指向についてあまり自信がない人は、下の記事で復習することを強くおすすめします。</p>
<p><cite class="hatena-citation"><a href="https://www.momoyama-usagi.com/entry/info/software05">www.momoyama-usagi.com</a></cite></p>
<p> </p>
<h2 class="wp-block-heading">０．UMLとは</h2>
<h3 class="wp-block-heading">(1) UMLとは何か</h3>
<p>オブジェクト指向によるプログラミングは、事前にどのようなプログラムを書くか設計を行う必要があります。</p>
<p> </p>
<p>しかし、自己流で設計方法を書いてしまうと、他の人が解読するのに時間がかかってしまったり、間違った解釈が行われてしまうかもしれません。</p>
<p>そこで、設計で用いられる標準的な記法として<strong><span class="marker-green">UML (Unified Modeling Language)</span></strong>と呼ばれる<strong><span class="marker-yellow">統一の言語</span></strong><a href="#f-f158211d" name="fn-f158211d" title="言語と言われると「あれれ？　言語じゃなくて図だろ」と思う人もいるかもしれません。ですが、日本語や英語の代わりに共通の図を用いて（設計方法の）コミュニケーションをとり、他の人と共有する点は言語と同じですよね。なのでUMLは統一の言語だといえるのです。">*1</a>が用いられるようになりました。</p>
<p> </p>
<p>UMLでは、（オブジェクト指向での）システムの設計を表すために専用の図（言語）を使います。</p>
<p> </p>
<p>当然言語と呼ばれるくらいなので、日本語や英語の単語・文法に相当する書き方（ルール）があります。</p>
<h3 class="wp-block-heading">(2) UMLのダイアグラムと特に重要な5種類の図</h3>
<p>UMLには全部で13種類の図があります。</p>
<p>13種類の図は大きく分けると、<strong><span class="marker-lightskyblue">構造を表す図6種類</span></strong>と、<strong><span class="marker-lime">振る舞いを表す図7種類</span></strong>に分けることができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160611.jpg" alt="f:id:momoyama1192:20200725160611j:plain" title="f:id:momoyama1192:20200725160611j:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<p>今回の記事（前編）ではUMLの中でも構造を表す図について説明します。</p>
<p>以下に、構造を示す6種類の図の概要を示します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160615.jpg" alt="f:id:momoyama1192:20200725160615j:plain" title="f:id:momoyama1192:20200725160615j:plain" class="hatena-fotolife" itemprop="image"></p>
<p>次の章からは、構造を表す図でも特に試験や実務で出てくるクラス図、オブジェクト図の読み方、書き方について説明します。</p>
<p>（構造を表す図に関しては、基本的にクラス図とオブジェクト図が読めれば基本情報では困りません。）</p>
<p> </p>
<h2 class="wp-block-heading">１．クラスとオブジェクトの違い（復習）</h2>
<p>クラス図とオブジェクト図の説明の前に、まずはクラスとオブジェクトを具体例を1つ出すことで確認しましょう。</p>
<h3 class="wp-block-heading">(1) オブジェクトとは</h3>
<p>オブジェクトとは、<strong><span class="marker-yellow">現実世界にある「具体的なもの」を抽象化したもの</span></strong>を表します。</p>
<p>オブジェクトの例としては、</p>
<ul class="wp-block-list dbp-list"><li>ANAの飛行機</li><li>東京行きの飛行機</li><li>500人乗りの飛行機</li><li>ボーイング787（機種の名前です）の飛行機</li></ul>
<p>があります。</p>
<h3 class="wp-block-heading">(2) クラスとは</h3>
<p>クラスは、<strong><span class="marker-yellow">オブジェクト（もの）が持つ性質をひとまとめにしたものに名前を付けて、ひな形にしたもの</span></strong>を表します。</p>
<p> </p>
<p>例えば、先程出てきた</p>
<ul class="wp-block-list dbp-list"><li>ANAの飛行機</li><li>東京行きの飛行機</li><li>500人乗りの飛行機</li><li>ボーイング787（機種の名前です）の飛行機</li></ul>
<p>の4つのオブジェクトをひとまとめにして「飛行機」と名前を付けることでクラスが出来上がります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160458.gif" alt="f:id:momoyama1192:20200725160458g:plain" title="f:id:momoyama1192:20200725160458g:plain" class="hatena-fotolife" itemprop="image"></p>
<h2 class="wp-block-heading">２．クラス図・オブジェクト図の書き方</h2>
<h3 class="wp-block-heading">(1) クラス図の書き方</h3>
<p>クラス図では、クラスのシンボルを書くことでクラスを定義する必要があります。</p>
<p>クラス図では、</p>
<ul class="wp-block-list dbp-list"><li>クラスの名前 [必須]</li><li>クラスが持つ属性 [省略可]</li><li>クラスが行える操作 [省略可]</li></ul>
<p>の3つを下のように書くことで定義を行います。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160454.gif" alt="f:id:momoyama1192:20200725160454g:plain" title="f:id:momoyama1192:20200725160454g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>なお、<strong><span class="marker-yellow">属性と操作は省略することができます</span></strong>。</p>
<h3 class="wp-block-heading">(2) オブジェクト図の書き方</h3>
<p>オブジェクト図の書き方はクラス図とほとんど同じです。</p>
<p>具体的には、</p>
<ul class="wp-block-list dbp-list"><li><span style="text-decoration: underline;">オブジェクト名</span> [必須]<br>（下線はオブジェクトであることをアピールするものなので、<strong><span class="marker-pink">必ず下線を引くこと</span></strong>）</li><li>オブジェクトが持つ具体的な属性 [省略可]<br>（クラスが持つ属性に具体値を入れたもの）</li></ul>
<p>の2つを記載します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160502.gif" alt="f:id:momoyama1192:20200725160502g:plain" title="f:id:momoyama1192:20200725160502g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>なお、「オブジェクト名: クラス名」と書く部分は「オブジェクト名」と書くこともできます。（つまり「: クラス名」の部分は省略可）</p>
<p> </p>
<h2 class="wp-block-heading">３．関連とリンク</h2>
<p>クラス図では、他のクラス同士を線で結ぶことで互いの関係（関連）を表します。</p>
<p>また、オブジェクト図では、他のオブジェクト同士を線で結ぶことで互いの関連（オブジェクト）を表します。</p>
<p> </p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160510.gif" alt="f:id:momoyama1192:20200725160510g:plain" title="f:id:momoyama1192:20200725160510g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>なお、クラス図では関連がどのようなものかを示すために、関連名やロールを付けることができます。</p>
<p>例えば、上の図の例の場合「履修する➤」を付けることで「学生は授業を履修する」関係であることが明らかにできます。</p>
<p>また、「履修者」と「履修可能授業」を関連の両端につけることで、具体的に「履修者」と「履修可能授業」の関係を表していることが明らかにできます。</p>
<p> </p>
<h2 class="wp-block-heading">４．多重度</h2>
<h3 class="wp-block-heading">(1) 多重度とは</h3>
<p>あるクラスに対するオブジェクトが、別のクラスに対するオブジェクトに<strong><span class="marker-yellow">何本リンクを引くことができるか</span></strong>（引かなければならないか）を表したものを<strong><span class="marker-green">多重度</span></strong>と呼びます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160506.gif" alt="f:id:momoyama1192:20200725160506g:plain" title="f:id:momoyama1192:20200725160506g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>例えば上の図の場合、授業の左下に「1..2」と書かれていますね。</p>
<p>この「1..2」は、学生から見たとき、授業のオブジェクトに「1本以上2本以下」のリンクを引けること、つまり学生が授業を「1個以上2個以下」履修できることを表します。</p>
<p>また、「0..3」は、授業から見たとき、学生のオブジェクトに「0本以上3本以下」のリンクを引けること、つまり授業を「0人以上3人以下」の学生まで履修できることを表します。</p>
<h3 class="wp-block-heading">(2) 多重度の書き方</h3>
<p>多重度の書き方には、以下の6種類があります。</p>
<p>上4種類が重要なので、基本的には上の4つを覚えておけばOKです。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160524.gif" alt="f:id:momoyama1192:20200725160524g:plain" title="f:id:momoyama1192:20200725160524g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>なお、多重度に関しては</p>
<ul class="wp-block-list dbp-list"><li>*(多数)なのか具体値なのか</li><li>0が入るのか入らないか</li></ul>
<p>を基本情報などの試験で聞かれることが多いです。</p>
<p> </p>
<p>オブジェクト図の説明はここで終わりです。</p>
<p>これ以降は、クラス図で使うものだけを紹介します。</p>
<h2 class="wp-block-heading">５．ロールの応用（階層的な関係の表記）</h2>
<p>ここで、ロールの応用的な使い方について少し説明します。</p>
<p>例えば、</p>
<ul class="wp-block-list dbp-list"><li>先輩は数人の後輩を受け持つ [指導する]<br>（3年生は2年生の何人かを指導し、2年生は1年生の何人かを指導する）</li><li>後輩は、ある1人の先輩に見てもらう [指導される]<br>（1年生は2年生の誰か1人に指導され、2年生は3年生の誰か1人に指導される）</li></ul>
<p>をロールを使って表すと、下のように書くことができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160515.gif" alt="f:id:momoyama1192:20200725160515g:plain" title="f:id:momoyama1192:20200725160515g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>このようにロールを使うことで、<strong><span class="marker-yellow">階層的な関係（先輩と公開、上司と部下）を簡単に表すことができます</span></strong>。</p>
<p> </p>
<p>さらに、上のロールを下のように再帰的に表す方法もあります。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160520.gif" alt="f:id:momoyama1192:20200725160520g:plain" title="f:id:momoyama1192:20200725160520g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<h2 class="wp-block-heading">６．汎化</h2>
<h3 class="wp-block-heading">(1) 汎化とは</h3>
<p>サブクラスが持つ<strong><span class="marker-yellow">共通な性質を抽出し、1つにまとめたスーパークラスとして定義</span></strong>することを<strong><span class="marker-green">汎化</span></strong>と呼び、以下のような矢印で表現します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160535.gif" alt="f:id:momoyama1192:20200725160535g:plain" title="f:id:momoyama1192:20200725160535g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>※ is-a はわかりやすくするために書いたものなので、実際には書かれません</p>
<h3 class="wp-block-heading">(2) 汎化を用いたクラス図の例</h3>
<p>汎化を使うことで、下のようなクラス図を作ることができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160529.gif" alt="f:id:momoyama1192:20200725160529g:plain" title="f:id:momoyama1192:20200725160529g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<h2 class="wp-block-heading">７．集約と合成集約</h2>
<h3 class="wp-block-heading">(1) 集約</h3>
<h4 class="wp-block-heading">(a) 集約とは</h4>
<p><strong><span class="marker-yellow">あるクラス（部品）をいくつか集めて大きなクラスを定義</span></strong>することを<strong><span class="marker-green">集約</span></strong>と呼び、以下のようなひし形で表現します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160543.gif" alt="f:id:momoyama1192:20200725160543g:plain" title="f:id:momoyama1192:20200725160543g:plain" class="hatena-fotolife" itemprop="image"></p>
<h4 class="wp-block-heading">(b) 集約を用いたクラス図の例</h4>
<p>集約を使うことで、下のようなクラス図を作ることができます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160539.gif" alt="f:id:momoyama1192:20200725160539g:plain" title="f:id:momoyama1192:20200725160539g:plain" class="hatena-fotolife" itemprop="image"></p>
<h4 class="wp-block-heading">(c) 集約と汎化の併用</h4>
<p>集約と汎化を併用し、下のようなクラス図を書くこともできます。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160548.gif" alt="f:id:momoyama1192:20200725160548g:plain" title="f:id:momoyama1192:20200725160548g:plain" class="hatena-fotolife" itemprop="image"></p>
<h3 class="wp-block-heading">(2) 合成集約(コンポジション)</h3>
<p>集約を書く際に、<strong><span class="marker-yellow">集約先（大きなクラス）が削除されると同時に部品も削除されることを強調</span></strong>したい場合は、ひし形(♢)の部分を黒く(♦)塗りつぶします。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160552.gif" alt="f:id:momoyama1192:20200725160552g:plain" title="f:id:momoyama1192:20200725160552g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>集約と合成集約（コンポジション）を使い分ける際にはサブクラスが本当に消えるかをよく確認してから使いましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160556.gif" alt="f:id:momoyama1192:20200725160556g:plain" title="f:id:momoyama1192:20200725160556g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>例えば、親（父さん、母さん）と子の関係にコンポジション(♦)を使ってしまうと、親が病気などで亡くなると、自動的に子も亡くなるという悲しいクラス図が完成してしまいます。</p>
<p> </p>
<p>ここからは、クラス図の応用に入るので時間がある人はぜひご覧ください。</p>
<p>基本情報ではあまり出てこないので試験対策したいだけであれば最悪スキップしてもOKです。</p>
<h2 class="wp-block-heading">８．実現</h2>
<p>インターフェース（必要な共通操作のみ定義し、具体的な操作は定義しない特別なクラス）とサブクラスの関係を実現と呼び、下のように矢印と破線で表します。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160601.gif" alt="f:id:momoyama1192:20200725160601g:plain" title="f:id:momoyama1192:20200725160601g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>汎化の一種<a href="#f-e93162a3" name="fn-e93162a3" title="スーパークラスがインターフェースになっただけ。">*2</a>だと思っていただけたらOKです。</p>
<p>（実際、図も汎化に似ていますよね。）</p>
<p> </p>
<h2 class="wp-block-heading">９．依存</h2>
<p>一方のクラスのオブジェクトが、もう一方のクラスの操作に利用されたり、影響する際に用います。</p>
<p>例えば、下の図の場合「人」クラスの操作により「スマホ」クラスが影響を受けることを表しています。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200725160606.gif" alt="f:id:momoyama1192:20200725160606g:plain" title="f:id:momoyama1192:20200725160606g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>依存は、2つのオブジェクト間にそこまで強い関係はないものの、一方のクラスを変更した際にもう一方のクラスが変更されることを明示する際に使います。</p>
<p> </p>
<h2 class="wp-block-heading">10．クラス図の表記法のまとめ</h2>
<p>今まで出てきたクラス図の表記を復習しましょう。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726032232.gif" alt="f:id:momoyama1192:20200726032232g:plain" title="f:id:momoyama1192:20200726032232g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<h2 class="wp-block-heading">11．練習問題</h2>
<p>では、クラス図、オブジェクト図に関する練習問題を午前問題で3問、午後問題で1問確認していきましょう。</p>
<h3 class="wp-block-heading">午前問題</h3>
<h4 class="wp-block-heading">練習1</h4>
<p>UMLのクラス図において、集約の関係にあるクラスはどれか。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031850.gif" alt="f:id:momoyama1192:20200726031850g:plain" title="f:id:momoyama1192:20200726031850g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>[基本情報技術者平成18年春期 午前問39]</p>
<p>ア：クラスAとクラスB<br>イ：クラスAとクラスC<br>ウ：クラスBとクラスD<br>エ：クラスCとクラスD</p>
<h4 class="wp-block-heading">練習2</h4>
<p>UMLのクラス図のうち、汎化の関係を示したものはどれか。</p>
<p>[基本情報技術者平成25年秋期 午前問46]</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031845.gif" alt="f:id:momoyama1192:20200726031845g:plain" title="f:id:momoyama1192:20200726031845g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<h4 class="wp-block-heading">練習3</h4>
<p>UMLを用いて表した図のデータモデルのa, bに入れる多重度はどれか。</p>
<p>[基本情報技術者平成30年秋期 午前問26]</p>
<p> </p>
<p>〔条件〕</p>
<ul class="wp-block-list dbp-list"><li>部門には1人以上の社員が所属する。</li><li>社員はいずれか一つの部門に所属する。</li><li>社員が部門に所属した履歴を所属履歴として記録する。</li></ul>
<p> </p>
<h3 class="wp-block-heading">午後問題</h3>
<p>書籍の卸売業者の受注システムに関する次の記述を読んで、設問1, 2に答えよ。</p>
<p> </p>
<p>書籍の卸売業者の受注システム開発のために、オブジェクトを抽出し、その関係を示すオブジェクト図を作成し、それを基にクラス図を作成することにした。</p>
<p>〔受注業務の説明〕</p>
<ul class="wp-block-list dbp-list"><li>得意先から注文を受けると、受注伝票に受注日、得意先と注文された商品の商品名などを記入する。受注伝票の例を図1に示す。<span align="center"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031858.gif" alt="f:id:momoyama1192:20200726031858g:plain" title="f:id:momoyama1192:20200726031858g:plain" class="hatena-fotolife" itemprop="image"></span></li><li>商品には、単独商品とセット商品がある。セット商品は、2種類以上の単独商品を組み合わせたものであり、セット商品としての商品名をもつ。セット商品の価格は、そのセットを構成する単独商品の価格の合計から1％ 割り引かれる。一度の注文では、10種類を超える商品は注文できない。<span>受注業務のシステム化に当たり、システム化対象となる主なオブジェクトとその主な属性を抽出し、複数のオブジェクト図を作成した。その一つを図2に示す。</span></li><li>次に、クラス抽出と多重度を検討して、図3に示す分析のためのクラス図を作成した。多重度とは、一方のクラスの一つのオブジェクトに対して接続されている、他方のクラスのオブジェクトの個数を示すものである。<span align="center"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031906.gif" alt="f:id:momoyama1192:20200726031906g:plain" title="f:id:momoyama1192:20200726031906g:plain" class="hatena-fotolife" itemprop="image"></span></li></ul>
<h4 class="wp-block-heading">設問1. </h4>
<p>図3の  [              ] に入れる正しい答えを、解答群の中から選べ。</p>
<p> </p>
<p>☆a～cに関する解答群☆</p>
<p>ア：商品　　　イ：商品番号　　ウ：受注者<br>エ：受付伝票　オ：セット商品　カ：単独商品</p>
<p>☆dに関する解答群☆</p>
<p>ア：0　　イ：0..*　　ウ：1<br>エ：1..10　オ：1..*　　カ：2<br>キ：2..*</p>
<h4 class="wp-block-heading">設問2.</h4>
<p>図3に基づいて、各クラスに必要な属性と操作を検討した。受注には年月日、合計などを保持し、受注明細にはNo、数量などを保持することにした。また、受注の合計は、受注明細ごとの金額を求めてから算出することにした。</p>
<p>全てのクラスの属性と操作を検討した結果から、図4に示す設計のためのクラス図を作成した。図4中の [              ] に入れる正しい答えを、解答群の中から選べ。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031911.gif" alt="f:id:momoyama1192:20200726031911g:plain" title="f:id:momoyama1192:20200726031911g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>☆eに関する解答群☆</p>
<p>ア：商品番号 : 文字列<br>イ：商品名 : 文字列<br>ウ：セット商品名 : 文字列<br>エ：番号 : 数値</p>
<p>☆fに関する解答群☆</p>
<p>ア：／小計 : 数値<br>イ：商品名 : 文字列<br>ウ：年月日 : 文字列<br>エ：文字列 : 数値</p>
<p>☆gに関する解答群☆</p>
<p>ア：受注日取得() : 文字列 <br>イ：小計取得() : 数値<br>ウ：数量取得() : 数値<br>エ：単価取得() : 数値<br>オ：名称取得() : 文字列</p>
<p> </p>
<h2 class="wp-block-heading">12．練習問題の答え</h2>
<h3 class="wp-block-heading">午前問題</h3>
<h4 class="wp-block-heading">解答1</h4>
<p>解答：イ</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031850.gif" alt="f:id:momoyama1192:20200726031850g:plain" title="f:id:momoyama1192:20200726031850g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>それぞれの選択肢が何の関係を表しているか復習しましょう。</p>
<p>ア：クラスAとクラスB（関連）<br>イ：クラスAとクラスC（集約）<br>ウ：クラスBとクラスD（依存）<br>エ：クラスCとクラスD（汎化）</p>
<h4 class="wp-block-heading">解答2</h4>
<p>解答：イ</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031845.gif" alt="f:id:momoyama1192:20200726031845g:plain" title="f:id:momoyama1192:20200726031845g:plain" class="hatena-fotolife" itemprop="image" width="389"></p>
<p>それぞれの選択肢が何の関係を表しているか復習しましょう。</p>
<p>ア：関連<br>イ：汎化<br>ウ：コンポジション（合成集約）<br>エ：依存</p>
<h4 class="wp-block-heading">解答3</h4>
<p>解答：エ</p>
<p>3つの条件を見ていきましょう。</p>
<ul class="wp-block-list dbp-list"><li>部門には1人以上の社員が所属する。<br>（→ この条件で、aの選択肢に0が入ることがなくなる。よって、答えはウかエのどちらか。）</li><li>社員はいずれか一つの部門に所属する。</li><li>社員が部門に所属した履歴を所属履歴として記録する。<br>（2,3の条件でbに0が入ることがなくなる。よって答えはエ。）</li></ul>
<h3 class="wp-block-heading">午後問題</h3>
<h4 class="wp-block-heading">解答1</h4>
<p>[解答]</p>
<p>a：ア（商品）<br>b：カ（単独商品）<br>c：オ（セット商品）<br>d：キ（2..*）</p>
<p>オブジェクト図に注目すると、受注明細にリンクしているのは「受注」と「単独商品とセット商品」の2つであることがわかる。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031902.gif" alt="f:id:momoyama1192:20200726031902g:plain" title="f:id:momoyama1192:20200726031902g:plain" class="hatena-fotolife" itemprop="image"></p>
<p> </p>
<p>クラス図の関連を見てみると、穴埋めされていない方は「受注」となっているため、(a)～(c)に入る選択肢は「商品」に関するものだとわかる。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031906.gif" alt="f:id:momoyama1192:20200726031906g:plain" title="f:id:momoyama1192:20200726031906g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>ここで、クラス(a)は(b),(c)を汎化したものなので、クラス(a)には商品すべてを表す「商品」が入ることがわかる。（よって(a)の答えはア）</p>
<p> </p>
<p>(b), (c) は商品のサブクラスに相当する「セット商品」と「単独商品」のどちらかが入る。</p>
<p>ここで文章を読むと「セット商品は2種類以上の単独商品を組み合わせたもの」と書かれている。</p>
<p>(c)は(b)の部品からできていることがクラス図から読み取れるため、(c)はセット商品、(b)は単独商品が入る。</p>
<p>（(b)の答えはカ、(c)の答えはオ）</p>
<p> </p>
<p>次に多重度を埋める(d)だが、この(d)は「セット商品」は何個の「単独商品」からなるかを表す。</p>
<p>先程読んだ文章には「セット商品は2種類以上の単独商品を組み合わせたもの」とあるため、(d)には2以上を表す「2..*」を埋めればよい。（(d)の答えはキ。）</p>
<h4 class="wp-block-heading">解答2</h4>
<p>[解答]</p>
<p>e：エ（番号: 数値）<br>f：ア（／小計：数値）<br>g：イ（小計修得()：数値）</p>
<p>図2のオブジェクト図と図4を見比べて解答をしてくのが基本。</p>
<p><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200726031911.gif" alt="f:id:momoyama1192:20200726031911g:plain" title="f:id:momoyama1192:20200726031911g:plain" class="hatena-fotolife" itemprop="image"></p>
<p>(e)</p>
<p>図2のオブジェクト図に注目すると受注に記載されているデータは、番号と年月日の2つであることがわかる。</p>
<p>だが、図4の受注クラスを見ると年月日はあるが番号はない。</p>
<p>よって、(e)には番号に相当するものが入る。（答えはエ）</p>
<p> </p>
<p>(f), (g)</p>
<p>問題文より、受注明細にはNoと数量を保存していることがわかる。しかし、図4の受注明細クラス図にはすでにNo、数量が記載されている。</p>
<p>ここで、もう少し問題文を読むと「受注の合計は受注明細ごとの金額を求めてから算出することにした。」とある。</p>
<p>よって、受注明細ごとの金額を求める属性と、金額を取得する操作が必要なことがわかる。</p>
<p>よって、(f)には金額の小計を求める属性、(g)は小計を取得するような操作が入る。</p>
<p>（(f)の答えはア、(g)の答えはエ）</p>
<p> </p>
<h2 class="wp-block-heading">13．さいごに</h2>
<p>今回は、UMLの中でもクラス図とオブジェクト図の読み方、書き方について説明しました。</p>
<p>英単語や英文法を知っていても文章を書くためには練習が必要なのと同じように、UMLを使いこなすためには図の書き方を頭に入れるだけでなく、実際に読んだり書いたりする必要があります。</p>
<p> </p>
<p>なので、使い方を覚えるだけでなく、実際に基本情報の問題を解くなどして読み書きをする練習をしましょう。</p>
<p>（少なくとも読めるようにしましょう。）</p>
<div class="footnote">
<p class="footnote"><a href="#fn-f158211d" name="f-f158211d" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">言語と言われると「あれれ？　言語じゃなくて図だろ」と思う人もいるかもしれません。ですが、日本語や英語の代わりに<span style="color: #202122; font-family: sans-serif;"><span style="font-size: 15.104px;">共通の図を用いて（<span style="color: #202122; font-family: sans-serif;">設計方法の）コミュニケーションを</span></span></span><span style="color: #202122; font-family: sans-serif;"><span style="font-size: 15.104px;">とり、他の人と共有する点は言語と同じですよね。なのでUMLは統一の言語だといえるのです。</span></span></span></p>
<p class="footnote"><a href="#fn-e93162a3" name="f-e93162a3" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">スーパークラスがインターフェースになっただけ。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-software07/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>うさぎでもわかるソフトウェア工学　Part06　オブジェクト指向とPython</title>
		<link>https://www.momoyama-usagi.com/entry/info-software06</link>
					<comments>https://www.momoyama-usagi.com/entry/info-software06#respond</comments>
		
		<dc:creator><![CDATA[ももうさ]]></dc:creator>
		<pubDate>Sun, 26 Jul 2020 03:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[ソフトウェア工学]]></category>
		<category><![CDATA[テクノロジ系]]></category>
		<category><![CDATA[まとめシリーズ]]></category>
		<category><![CDATA[基本情報]]></category>
		<category><![CDATA[情報]]></category>
		<guid isPermaLink="false">https://www.momoyama-usagi.com/entry/info-software06</guid>

					<description><![CDATA[今回は、基本情報に出てくる重要な概念の1つであるオブジェクト指向、具体的には、クラスとインスタンスの違い、汎化と特化、継承、集約と分散、オーバーライド、ポリモフィズムなどについてPythonを使いながら説明していきたいと思います。
]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、ももやまです。</p>



<p>今回は、基本情報でも出てくる「オブジェクト指向」の特徴、具体的には、</p>



<ul class="wp-block-list"><li>今までの考え方とオブジェクト指向の違い</li><li>クラスとインスタンスの違い</li><li>汎化と特化</li><li>継承</li><li>集約と分散</li><li>オーバーライド</li><li>ポリモフィズム</li></ul>



<p>についてPythonを使いながらわかりやすく説明していきたいと思います。</p>



<p>Pythonを使ったことがない人でもわかりやすく説明しているので、ぜひご覧ください！</p>



<h2 class="wp-block-heading" id="1-従来の考え方とオブジェクト指向の違い">1. 従来の考え方とオブジェクト指向の違い</h2>



<p>まずは、オブジェクト指向という考え方が従来（手続き型）の考え方とどう違うのかを簡単にですが説明していきたいと思います。</p>



<h3 class="wp-block-heading" id="1-従来手続き型の考え方">(1) 従来（手続き型）の考え方</h3>



<p>手続き型とは、<span class="marker-yellow"><b>処理の流れ、順番に注目して</b></span>プログラムを書いていく方法です。</p>



<p>例えば、「リストの平均を表示する」手続き（処理手順）は、</p>



<ol class="wp-block-list"><li>リスト内にある数値の合計を求める</li><li>リストの要素数を求める</li><li>(合計)/(要素数)を計算</li><li>3の計算結果を出力</li></ol>



<p>の4ステップで書くことができます。</p>



<p>これをPythonで書いてみると…</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
data = &#x5B;78,62,73,62,74,65,68] # この配列の平均を求める

# 1. 合計を求める
total = 0.0
for x in data:
    total += x

count = len(data) # 2. 要素数を求める

ave = total / count # 3. 平均値を計算
print(ave) # 4. 平均値を計算
</pre></div>


<p>このように書くことができます！</p>



<p>上のような単純なプログラムであれば、プログラムを見ただけで「あ、こんな処理するんだ！」ってわかりますよね。</p>



<p>このように、<span class="marker-yellow"><b>人間がプログラムを書いたり読んだりするのが楽</b></span>なのが手続き型のメリットです。</p>



<h3 class="wp-block-heading" id="2-なぜオブジェクト指向が必要なのか">(2) なぜオブジェクト指向が必要なのか</h3>



<p>手続き型は人間にとって考えるのが楽だからオブジェクト指向とかいうよくわからないものなんて覚えなくてもいいじゃんと思うかもしれません。</p>



<p>しかし、もっと大きなプログラムになったらどうでしょうか。例えば電卓プログラムを想像してみましょう。</p>



<p>電卓プログラムを作るためには、少なくとも</p>



<ul class="wp-block-list"><li>数字ボタンで数字を入力</li><li>四則演算ボタンで計算内容を指定</li><li>イコールボタンで実際に計算をする</li><li>小数点ボタンが押されたら小数点入力する</li></ul>



<p>の機能をプログラミングする必要があります。</p>



<p>これらを手続き型、つまり処理の流れに注目して書くのはちょっとめんどくさい気分になりますよね。</p>



<p>たとえ手続き型で書けたとしても<span class="marker-orange"><b>「何かしらのバグが発生したときのデバッグ」や「新しい機能を追加」しようとしたら頭がおかしくなりそう</b></span>です。</p>



<p>このように、手続き型によるプログラミングには人間が記述するのは楽な一方、</p>



<ul class="wp-block-list"><li>複数の要素が絡み合った複雑なプログラムには向いていない</li><li>デバッグやメンテナンスがしにくい</li></ul>



<p>などの欠点があります。</p>



<p>そこで、</p>



<ul class="wp-block-list"><li>複数の要素が絡み合った大規模で複雑なプログラム向け</li><li>デバッグやメンテナンスがより簡単</li></ul>



<p>な<span class="marker-green"><b>オブジェクト指向</b></span>と呼ばれるプログラミング方法が考えられました<a href="#f-ad2096f2" name="fn-ad2096f2" title="現代のソフトウェア、システム開発では「複数の要素が絡み合った大規模で複雑なプログラム」を扱うことがほとんどで、なおかつ「デバッグやメンテナンス」は定期的に行われるので手続き型よりもオブジェクト指向なプログラミング手法が使われることがほとんど（だと思うの）です。">*1</a>。</p>



<h3 class="wp-block-heading" id="3-オブジェクト指向とはなにか">(3) オブジェクト指向とはなにか</h3>



<p>オブジェクト指向のオブジェクトとは、<span class="marker-yellow"><b>現実世界にある「もの」</b></span>のことです。</p>



<p>具体的には<span class="marker-lime"><b>複数の異なる変数を組み合わせてできた新しい箱</b></span>に相当する<span class="marker-lime"><b>データ</b></span>と、<b><span class="marker-orange">データを操作する</span></b>いくつかの<b><span class="marker-orange">メソッド（手続き）</span></b>を1つにまとめて抽象化したものです。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024326.gif" alt="f:id:momoyama1192:20200712024326g:plain" title="f:id:momoyama1192:20200712024326g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>C言語で構造体を習った人であれば、<span class="marker-yellow"><b>構造体に足（操作する手続き）が生えたもの</b></span>という説明のほうがわかりやすいかもしれません。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024331.gif" alt="f:id:momoyama1192:20200712024331g:plain" title="f:id:momoyama1192:20200712024331g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>つまりオブジェクト指向とは、<span class="marker-yellow"><b>現実世界にある「もの」と、ものを操作する方法の2つを意識して</b></span>プログラミングをしていく方法、より詳しく説明すると<span class="marker-yellow"><b>「ある箱（データ）」と「箱を操作する関数（メソッド）」の2つに注目してプログラミングをしていく考え方</b></span>なのです。</p>



<p>次の章からは、オブジェクト指向の特徴（メリット）を実際にPythonを使いながら説明していきます。</p>



<h2 class="wp-block-heading" id="2-クラスとインスタンス">2. クラスとインスタンス</h2>



<h3 class="wp-block-heading" id="1-クラスとは">(1) クラスとは</h3>



<p>クラスとは、オブジェクトが持つ性質、つまり</p>



<ul class="wp-block-list"><li>箱（データ）</li><li>箱を操作する手続き（メソッド）</li></ul>



<p>をまとめて定義したものです。</p>



<p>クラスは<span class="marker-yellow"><b>設計図・ひな型</b></span>だと思っておきましょう。</p>



<h3 class="wp-block-heading" id="2-インスタンスとは">(2) インスタンスとは</h3>



<p>インスタンスとは、<span class="marker-yellow"><b>クラス（設計図・ひな形）に対して具体的な値を与えることで実体化されたもの</b></span>を表します。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024321.gif" alt="f:id:momoyama1192:20200712024321g:plain" title="f:id:momoyama1192:20200712024321g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h3 class="wp-block-heading" id="3-Pythonで確認">(3) Pythonで確認</h3>



<p>では、実際にPythonでクラスとインスタンスを作る体験をしましょう。</p>



<h4 class="wp-block-heading" id="Step1-クラスを定義しよう">Step1. クラスを定義しよう</h4>



<p>まず、冒険者クラス <code>Player</code> を定義してオブジェクトの（データとメソッド）ひな形を作ってみましょう。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class Player(): # クラス「冒険者（プレイヤー）」
    # インスタンスを生成したときに勝手に呼び出される
    def __init__(self,name,level,hp,mp,attack,defence):
        self.name      = name    # 名前
        self.level     = level   # レベル
        self.maxhp     = hp      # 最大HP
        self.hp        = hp      # 現在HP
        self.maxmp     = mp      # 最大MP
        self.mp        = mp      # 現在MP
        self.attack    = attack  # 攻撃力
        self.defence   = defence # 防御力
    def introduction(self,opponent):
        print(&quot;私の名前は&quot; + self.name + &quot;。よろしくね&quot; + opponent + &quot;さん。&quot;)
    # ステータス情報
    def disp_info(self):
        print(&quot;-----ステータス情報-----&quot;)
        print(&quot;名前: %s&quot; % self.name)
        print(&quot;Level: %2d&quot; % self.level)
        print(&quot;HP: %3d/%3d&quot; % (self.hp,self.maxhp))
        print(&quot;MP: %3d/%3d&quot; % (self.mp,self.maxmp))
        print(&quot;攻撃力:%3d&quot; % self.attack)
        print(&quot;防御力:%3d&quot; % self.defence)
    # ダメージを与える (xだけ HP を減らす)
    def damage(self,x):
        if x &gt; self.hp:
            self.hp = 0
            print(&quot;%sに%dのダメージ！&quot; % (self.name,x))
            print(&quot;%sはちからつきた…&quot; % self.name)
        else:
            self.hp -= x
            print(&quot;%sに%dのダメージ！&quot; % (self.name,x))
</pre></div>


<p>クラス（ひな型）を作る際に、<span class="marker-yellow"><b>「オブジェクト（もの）が持つ特徴」を考え、特徴を説明するのに必要なデータ、メソッドを定義していく</b></span>のがコツです。例えば「冒険者」の特徴であれば、</p>



<ul class="wp-block-list"><li>名前が付けられている</li><li>いろんな人と話す</li><li>モンスターと戦う</li><li>各地を旅する</li></ul>



<p>のように列挙していきましょう。</p>



<h4 class="wp-block-heading" id="初期化メソッド-initコンストラクタ">初期化メソッド <strong>init</strong>（コンストラクタ）</h4>



<p>Pythonでは、インスタンス（実体）を生成するとき <code>__init__</code> 関数が勝手に呼び出されるので、箱に入れる変数や初期値は <code>__init__</code> の中に入れちゃいましょう。</p>



<p>なお、この初期化メソッドのことを<span class="marker-yellow"><b>コンストラクタ</b></span>と呼ぶので頭にいれておきましょう。</p>



<p>なお、他のオブジェクト指向言語にもコンストラクタはあります。</p>



<h4 class="wp-block-heading" id="メソッドの引数について">メソッドの引数について</h4>



<p>メソッドの引数は、最初の1つは自身のオブジェクトを示す <code>self</code> で固定されています（つまり必須）。</p>



<p>もし引数が必要であれば、2番目以降に記していきましょう。</p>



<p>例えば、自己紹介をする <code>introduction</code> 関数では相手の名前を入れる変数 <code>opponent</code> を引数とするので、</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
    def introduction(self,opponent):
</pre></div>


<p>と1つ目の引数にオブジェクト自身を示す必須変数 <code>self</code>、2つ目の引数に相手の名前の引数 <code>opponent</code> を指定しています。</p>



<h4 class="wp-block-heading" id="Step2-インスタンスを1つ作ってみよう">Step2. インスタンスを1つ作ってみよう</h4>



<p>クラス（ひな形）が出来たので、実体化させてインスタンス <code>party1</code> を1つ作ってみましょう。</p>



<p>先程作ったクラスの下に、下のようなコードを追加してください。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
party1 = Player(&quot;ももやま&quot;,10,50,20,40,30) # クラスからひな形（インスタンス）を作る処理
# 名前: ももやま, HP: 50   MP: 20, 攻撃力: 40  防御力: 30　の冒険者 party1 が実体化された！
</pre></div>


<p>この1行で冒険者 <code>party1</code> が完成です！</p>



<p>（このインスタンスを作る際にコンストラクタ、つまり初期化関数が動いています）</p>



<h4 class="wp-block-heading" id="Step3-メソッドでインスタンスを操作しよう">Step3. メソッドでインスタンスを操作しよう</h4>



<p>このまま実体化させたインスタンスを作るのももったいないので、実際にメソッドを使ってインスタンスを操作してみましょう。</p>



<p>Step2で作ったコードに、操作内容を追加していきます。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
party1.introduction(&quot;るか&quot;) # るかさんに自己紹介
party1.disp_info() # ステータス表示

party1.damage(10) # 毒沼を踏んで10ダメージ！
party1.disp_info() # HPが減ってるか確認
</pre></div>


<p>追加したコードを実行すると……</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
私の名前はももやま。よろしくねるかさん。
-----ステータス情報-----
名前: ももやま
Level: 10
HP:  50/ 50
MP:  20/ 20
攻撃力: 40
防御力: 30
ももやまに10のダメージ
-----ステータス情報-----
名前: ももやま
Level: 10
HP:  40/ 50
MP:  20/ 20
攻撃力: 40
防御力: 30
</pre></div>


<p>うまくメソッドが動いていることがわかりますね！</p>



<h2 class="wp-block-heading" id="3-カプセル化">3. カプセル化</h2>



<h3 class="wp-block-heading" id="1-カプセル化とは">(1) カプセル化とは</h3>



<p>オブジェクト指向では、データとメソッドをオブジェクトという<span class="marker-yellow"><b>1つのカプセル（のようなもの）にまとめて管理</b></span>されています。</p>



<p>オブジェクトの中身をカプセルで隠すことにより、<span class="marker-yellow"><b>カプセルの外（つまり外部）から勝手にデータの中身を見たり、データの中身を書き換えたりすることができなく</b></span>なります<a href="#f-a92c31b1" name="fn-a92c31b1" title="つまり外部からの不正アクセスを防止することができるってことです。">*2</a>。</p>



<p>このように、<span class="marker-yellow"><b>外部からオブジェクトの中身を隔離する（情報隠蔽する）機能</b></span>のことを<span class="marker-green"><b>カプセル化</b></span>と呼びます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024401.gif" alt="f:id:momoyama1192:20200712024401g:plain" title="f:id:momoyama1192:20200712024401g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>とはいってもわかりにくいかもしれないので、具体例を1つ出しましょう。</p>



<p>例えば「LINE」ってアプリがありますよね。</p>



<p>皆さんは、LINEを使って色んな友達、家族、恋人など様々な人とメッセージを送り合ったり通話していると思います。</p>



<p>でも別に<span class="marker-yellow"><b>LINEがどんなアルゴリズムで動いてるかとか、どうやって通信されているかなんて全く知りません</b></span>よね。</p>



<p>この知るべき情報（操作方法）さえ知っていれば、知るべき情報以外<a href="#f-5b4fc370" name="fn-5b4fc370" title="具体的なデータの中身、処理内容などを">*3</a>は知らなくても操作できるよ、っていうのがまさにカプセル化なのです！</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024407.gif" alt="f:id:momoyama1192:20200712024407g:plain" title="f:id:momoyama1192:20200712024407g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h3 class="wp-block-heading" id="2-カプセル化のメリット">(2) カプセル化のメリット</h3>



<p>カプセル化のメリットは2つあります。</p>



<h4 class="wp-block-heading" id="その1情報隠蔽による不正アクセスの防止">その1　情報隠蔽による不正アクセスの防止</h4>



<p>オブジェクトがカプセルというバリアに包まれているので、<span class="marker-yellow"><b>カプセルの外から勝手にデータを見たり、書き換えたりすることができなくなります</b></span>。</p>



<p>そのため、外部からオブジェクトの中身を隔離し、情報隠蔽を行うことで<span class="marker-yellow"><b>外部からの不正アクセスを防止</b></span>することができます。</p>



<p>これが1つ目のメリットです。</p>



<h4 class="wp-block-heading" id="その2メンテナンスしやすくなる">その2　メンテナンスしやすくなる</h4>



<p>カプセル化されると、オブジェクト内でどんな風にデータが管理されているのかは我々ユーザーにはわかりません。</p>



<p>なので、オブジェクト内でデータの管理方法を少し変えたり、メソッドの処理内容を変えたとしても使い方さえ変わらなければ<a href="#f-71ac6343" name="fn-71ac6343" title="入力と出力が一緒であれば">*4</a>我々ユーザーには影響がありません。</p>



<p>当然「新しい機能を追加しよっかな～」ってメソッド（手続き）を付け加えても問題ありません。</p>



<p>このようなメンテナンスをしやすくなる（つモジュールの独立性が高くなる）点が2つ目のメリットとなります。</p>



<h3 class="wp-block-heading" id="3-Pythonで確認-1">(3) Pythonで確認</h3>



<p>早速Pythonでカプセル化を試してみましょう。</p>



<h4 class="wp-block-heading" id="カプセル化されていない状態">カプセル化されていない状態</h4>



<p>初めにカプセル化をしていない状態を見ていきましょう。</p>



<p>プログラムの内容としては、まずクラス <code>Player</code> からインスタンス <code>party1</code> を生成します。さらに、 <code>party1</code> の値を直接参照したり、勝手に書き換えています。 </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class Player(): # クラス「冒険者（プレイヤー）」
    def __init__(self,name,level,hp,mp,attack,defence):
        self.name      = name    # 名前
        self.level     = level   # レベル
        self.maxhp     = hp      # 最大HP
        self.hp        = hp      # 現在HP
        self.maxmp     = mp      # 最大MP
        self.mp        = mp      # 現在MP
        self.attack    = attack  # 攻撃力
        self.defence   = defence # 防御力
    # ステータス情報
    def disp_info(self):
        print(&quot;-----ステータス情報-----&quot;)
        print(&quot;名前: %s&quot; % self.name)
        print(&quot;Level: %2d&quot; % self.level)
        print(&quot;HP: %3d/%3d&quot; % (self.hp,self.maxhp))
        print(&quot;MP: %3d/%3d&quot; % (self.mp,self.maxmp))
        print(&quot;攻撃力:%3d&quot; % self.attack)
        print(&quot;防御力:%3d&quot; % self.defence)

        
# カプセル化されていない状態
party1 = Player(&quot;ももやま&quot;,10,50,20,40,30) # インスタンス party1 を生成

print(party1.hp) # party1 の残りHPを直接アクセスすることでチェック
party1.level = 99 # party1のレベルを99に
party1.disp_info() # 値が書き換わっているか確認
</pre></div>


<p>このプログラムを実行すると、</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
50
-----ステータス情報-----
名前: ももやま
Level: 99
HP:  50/ 50
MP:  20/ 20
攻撃力: 40
防御力: 30
</pre></div>


<p>となり、直接データを参照したり書き換えたりできてしまっている状態、つまり情報隠蔽が出来ていない状態なことがわかります。</p>



<p>これではカプセル化が出来てるとは言えません。不正し放題です。</p>



<h4 class="wp-block-heading" id="カプセル化をしてみよう">カプセル化をしてみよう</h4>



<p>カプセル化をするためには、外部からデータを勝手に閲覧したり書き換えたりできないようにすればいいのでしたね。</p>



<p>Pythonでは、変数名の前に <code>__</code> （アンダーバー2つ）を加えることで外部からデータを直接参照したり書き換えたりできなくなります<a href="#f-7c99c2ec" name="fn-7c99c2ec" title="Javaでいう privateで宣言する操作に相当します。">*5</a>。</p>



<p>ということで、クラス内の変数（データ）をすべて外部から直接見れないようにしてあげましょう。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class Player(): # クラス「冒険者（プレイヤー）」
    # 外部からデータを見れないように（private宣言）
    def __init__(self,name,level,hp,mp,attack,defence):
        self.__name      = name    # 名前
        self.__level     = level   # レベル
        self.__maxhp     = hp      # 最大HP
        self.__hp        = hp      # 現在HP
        self.__maxmp     = mp      # 最大MP
        self.__mp        = mp      # 現在MP
        self.__attack    = attack  # 攻撃力
        self.__defence   = defence # 防御力
    # ステータス情報
    def disp_info(self):
        print(&quot;-----ステータス情報-----&quot;)
        print(&quot;名前: %s&quot; % self.__name)
        print(&quot;Level: %2d&quot; % self.__level)
        print(&quot;HP: %3d/%3d&quot; % (self.__hp,self.__maxhp))
        print(&quot;MP: %3d/%3d&quot; % (self.__mp,self.__maxmp))
        print(&quot;攻撃力:%3d&quot; % self.__attack)
        print(&quot;防御力:%3d&quot; % self.__defence)
    # メソッドも __（アンダーバー2つ）付けると外部からは見えなくなる
    def __debug(self,hp):
        self.__hp = hp 

        
party1 = Player(&quot;ももやま&quot;,10,50,20,40,30) 
print(party1.__hp) # party1 の残りHPを直接アクセスすることでチェック
party1.__level = 99 # party1のレベルを99に
</pre></div>


<p>このプログラムを実行しようとすると…</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Traceback (most recent call last):
File &quot;object2.py&quot;, line 27, in &amp;lt;module&gt;
print(party1.__hp) # party1 の残りHPを直接アクセスすることでチェック
AttributeError: &#039;Player&#039; object has no attribute &#039;__hp&#039;
</pre></div>


<p>「<code>__hp</code> なんて存在しませんよ～」ってエラーを返します。</p>



<p>つまり、外部からデータを隠している状態、つまり情報隠蔽が出来ていることがわかりますね！</p>



<p>なお、変数名だけでなく、上の <code>__debug</code> のようなメソッド名（関数名）の前に <code>__</code> （アンダーバー2つ）を加えることで、メソッドも隠すことができます<a href="#f-b3539940" name="fn-b3539940" title="外部からアクセスしないメソッドなどに使うことで、外部から勝手にアクセスすることを防げます。">*6</a>。</p>



<p>もちろん、外部からデータを隠している状態であっても、</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class Player(): # クラス「冒険者（プレイヤー）」
    def __init__(self,name,level,hp,mp,attack,defence):
        self.__name      = name    # 名前
        self.__level     = level   # レベル
        self.__maxhp     = hp      # 最大HP
        self.__hp        = hp      # 現在HP
        self.__maxmp     = mp      # 最大MP
        self.__mp        = mp      # 現在MP
        self.__attack    = attack  # 攻撃力
        self.__defence   = defence # 防御力
    # ステータス情報
    def disp_info(self):
        print(&quot;-----ステータス情報-----&quot;)
        print(&quot;名前: %s&quot; % self.__name)
        print(&quot;Level: %2d&quot; % self.__level)
        print(&quot;HP: %3d/%3d&quot; % (self.__hp,self.__maxhp))
        print(&quot;MP: %3d/%3d&quot; % (self.__mp,self.__maxmp))
        print(&quot;攻撃力:%3d&quot; % self.__attack)
        print(&quot;防御力:%3d&quot; % self.__defence)
    # メソッドも __（アンダーバー2つ）付けると外部からは見えなくなる
    def __debug(self,hp):
        self.__hp = hp 


        
# カプセル化された状態
party1 = Player(&quot;ももやま&quot;,10,50,20,40,30) 
party1.disp_info() # メソッドからであれば __ (アンダーバー2つ)付いた変数にアクセスできる
</pre></div>


<p>このように公開されているメソッドからであれば問題なく <code>__</code> が最初についた変数にもアクセスすることができます。</p>



<h2 class="wp-block-heading" id="3-汎化と特化クラスの継承">3. 汎化と特化（クラスの継承）</h2>



<h3 class="wp-block-heading" id="1-スーパークラスとサブクラス">(1) スーパークラスとサブクラス</h3>



<p>クラスは、オブジェクト（現実世界にあるもの）を抽象化して作られたひな形でしたね。</p>



<p>しかし、ひな形とは言ってもいろんな種類がありますよね。</p>



<p>例えば、「冒険者」であれば、「勇者」、「シーフ」、「モンク」、「白魔道士」、「黒魔道士」など様々な「冒険者」がいます。</p>



<p>「車」であれば、「乗用車」、「タクシー」、「バス」、「トラック」ような様々な「車」の種類があります。</p>



<p>このように、<span class="marker-yellow"><b>クラスの具体例をより下位のクラスと考える</b></span>ことで上位クラス - 下位クラスという関係を持たせることができます。</p>



<p>また、このときの上位クラスのことを<b><span class="marker-lightskyblue">スーパークラス</span></b>、もしくは<span class="marker-lightskyblue"><b>基底クラス</b></span>と呼び、下位クラスのことを<span class="marker-pink"><b>サブクラス</b></span>、もしくは<span class="marker-pink"><b>派生クラス</b></span>と呼びます。</p>



<p>サブクラスとスーパークラスでは、「サブクラス is a スーパークラス」のような<span class="marker-yellow"><b> is-a 関係が成立する</b></span>のが特徴です。</p>



<p>例えば、「白魔道士」と「冒険者」であれば「白魔道士 is a 冒険者（白魔道士は冒険者である）」と正しい文になるのでis-a関係、つまりサブクラスとスーパークラスの関係が成り立っていることがわかります。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024341.gif" alt="f:id:momoyama1192:20200712024341g:plain" title="f:id:momoyama1192:20200712024341g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>同じように「バス」と「車」であれば「バス is a 車（バスは車である）」となるのでis-a関係が成立しているといえます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024346.gif" alt="f:id:momoyama1192:20200712024346g:plain" title="f:id:momoyama1192:20200712024346g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h3 class="wp-block-heading" id="2-汎化と特化の関係">(2) 汎化と特化の関係</h3>



<h4 class="wp-block-heading" id="汎化">汎化</h4>



<p>サブクラス（下位のクラス）が持つ性質を抽出し、抽出したものをスーパークラス（上位のクラス）として定義することを<span class="marker-pink"><b>汎化</b></span>と呼びます。</p>



<h4 class="wp-block-heading" id="特化">特化</h4>



<p>スーパークラス（上位のクラス）の具体例をサブクラス（下位のクラス）として定義することを<span class="marker-lightskyblue"><b>特化</b></span>と呼びます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024351.gif" alt="f:id:momoyama1192:20200712024351g:plain" title="f:id:momoyama1192:20200712024351g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>汎化と特化はごちゃまぜになりやすいので頭に入れる際には注意しましょう。</p>



<h3 class="wp-block-heading" id="3-継承インヘリタンス">(3) 継承（インヘリタンス）</h3>



<p>サブクラスは、上位のスーパークラスの具体例の1つとして定義されているので、スーパークラスと同じような特性を持つことも多いです。</p>



<p>例えば、例えば「車」には、</p>



<ul class="wp-block-list"><li>アクセルを踏んだら加速する</li><li>ブレーキを踏んだら減速する</li><li>走るとガソリンを使う</li></ul>



<p>などの特性がありますが、これはサブクラスの「バス」、「タクシー」、「トラック」でも全部成立する特性ですよね。</p>



<p>しかし、サブクラスを定義する際にいちいちこの特性を再定義するのはめんどくさいですよね。</p>



<p>そこで、<span class="marker-yellow"><b>サブクラス（下位のクラス）はスーパークラス（上位のクラス）の特性（データ・メソッド）を引き継いで使う機能</b></span>がオブジェクト指向では導入されました。この機能のことを<b><span class="marker-yellow">継承（インヘリタンス）</span></b>と呼びます。</p>



<p>継承機能を使うと、サブクラスは何もプログラミングしなくても継承元（スーパークラス）のデータやメソッドをすべて利用することができます。</p>



<p>そのため、サブクラスはスーパークラスにない不足するデータ、メソッドを追加するだけでクラス、つまりひな形を作ることができます<a href="#f-f96d9487" name="fn-f96d9487" title="余談ですが、スーパークラスにない不足したデータ、メソッドだけに注目してオブジェクトを定義する方法のことを差分プログラミングと呼ばれます。">*7</a>。</p>



<h3 class="wp-block-heading" id="4-Pythonで継承を試してみよう">(4) Pythonで継承を試してみよう</h3>



<p>早速Pythonで継承機能を試してみましょう。</p>



<p>今回は、最初に定義した冒険者クラス <code>Player</code> を黒魔道士クラス <code>BlackMage</code> に継承しています。</p>



<p>（つまり、<code>Player</code> クラスの機能（データ、メソッド）が <code>BlackMage</code> クラスでそのまま使えるようになっています） </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
# 冒険者クラス（スーパークラス）
class Player(): 
    def __init__(self,name,level,hp,mp,attack,defence):
        self.name      = name    # 名前
        self.level     = level   # レベル
        self.maxhp     = hp      # 最大HP
        self.hp        = hp      # 現在HP
        self.maxmp     = mp      # 最大MP
        self.mp        = mp      # 現在MP
        self.attack    = attack  # 攻撃力
        self.defence   = defence # 防御力
    # ステータス情報
    def disp_info(self):
        print(&quot;-----ステータス情報-----&quot;)
        print(&quot;名前: %s&quot; % self.name)
        print(&quot;Level: %2d&quot; % self.level)
        print(&quot;HP: %3d/%3d&quot; % (self.hp,self.maxhp))
        print(&quot;MP: %3d/%3d&quot; % (self.mp,self.maxmp))
        print(&quot;攻撃力:%3d&quot; % self.attack)
        print(&quot;防御力:%3d&quot; % self.defence)

        
# 黒魔道士クラス（サブクラス）
# スーパークラスである冒険者クラスを継承
class BlackMage(Player): # 継承するクラスは括弧内 () に書く 
    # costだけMPを消費して魔法を唱えて（爆発させる）メソッド
    def use_magic(self,cost):
        if cost &gt; self.mp:
            print(&quot;MPが足りない！&quot;)
        else:
            self.mp -= cost # MP消費
            print(&quot;MPを%d消費して魔法を唱えた！(残りMP:%d)&quot; % (cost,self.mp))
            print(&quot;あたり一面で爆発が起こった！&quot;)
    # ※コンストラクタ（__init__関数）も継承されるので書かなくてOK（そのまま使う場合は）

party2 = BlackMage(&quot;るか&quot;,12,45,30,30,25) # Player(冒険者)クラスを継承しているので、__init__ もPlayerクラスのものを使える（もう1回書かなくてもOK）
party2.disp_info()  # Player(冒険者)クラスを継承しているので、Playerクラスのメソッドを使える
party2.use_magic(3) # Mageクラスで新たに定義したメソッドを利用
</pre></div>


<p>このプログラムを実行すると…</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
-----ステータス情報-----
名前: るか
Level: 12
HP:  45/ 45
MP:  30/ 30
攻撃力: 30
防御力: 25
MPを3消費して魔法を唱えた！(残りMP:27)
あたり一面で爆発が起こった！
</pre></div>


<p>このように、うまく継承ができていることがわかりますね！</p>



<h2 class="wp-block-heading" id="4-集約と分解">4. 集約と分解</h2>



<p>複雑なオブジェクトをそのまま考えると少し頭が混乱することがあります。</p>



<p>そこで、複雑なオブジェクト（上位のクラス）を単純ないくつかのオブジェクト（下位のクラス）に分解する方法が考えられました。</p>



<h3 class="wp-block-heading" id="1-集約とは">(1) 集約とは</h3>



<p>単純なクラス（下位クラス）をいくつか集めてより複雑なクラス（上位クラス）として定義することを<span class="marker-orange"><b>集約</b></span>と呼びます。</p>



<h3 class="wp-block-heading" id="2-分解とは">(2) 分解とは</h3>



<p>複雑なクラス（上位クラス）をいくつかの単純なクラス（下位クラス）にバラバラにして定義することを<span class="marker-green"><b>分解</b></span>と呼びます。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024356.gif" alt="f:id:momoyama1192:20200712024356g:plain" title="f:id:momoyama1192:20200712024356g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<h3 class="wp-block-heading" id="3-集約と分解で成り立つ関係-part-of">(3) 集約と分解で成り立つ関係 part-of</h3>



<p>集約と分解、には part-of の関係が成り立ちます。</p>



<p>例えば、「ハンドル」と「車」であれば「ハンドル (is) part of 車（ハンドルは車の一部である）」のように正しい文になるため、part-of関係が成立していることがわかりますね。</p>



<p>また、「ライス」と「ランチ」であれば「ライス (is) part of ランチ（ライスはランチの一部である）」となり、part-of関係が成り立ちます。</p>



<p>なお、集約と分解では is-a 関係は成り立たないので継承関係もありません。</p>



<p>（例えば「ハンドル is a 車（ハンドルは車である）」は文章的に意味不明になるので is-a 関係は成り立たちませんよね。）</p>



<h2 class="wp-block-heading" id="5-オーバーライド">5. オーバーライド</h2>



<h3 class="wp-block-heading" id="1-オーバーライドとは">(1) オーバーライドとは</h3>



<p>オブジェクト指向では、スーパークラス（上位のクラス）の特性（データ・メソッド）をサブクラスに引き継げる継承という機能があります。</p>



<p>しかし、継承したメソッドの中に、サブクラスで改めて定義したいメソッドがあるとします。</p>



<p>そのときに、<span class="marker-yellow"><b>改めて定義したいメソッドを名前を変えずにサブクラスで定義すること</b></span>を<b><span class="marker-green">オーバーライド</span></b>と呼びます。</p>



<h3 class="wp-block-heading" id="2-オーバーロードとの違い">(2) オーバーロードとの違い</h3>



<p>オーバーライドに似たような言葉にオーバーロードがあります。</p>



<p>オーバーロードとは、引数、返り値が違う同じ名前のメソッドを複数定義するオブジェクト指向で使われる方法の1つです<a href="#f-8c5a9126" name="fn-8c5a9126" title="ちなみにオーバーロードはPythonには実装されていません。">*8</a>。</p>



<p>オーバーライドとは全然関係のない言葉なので、覚え間違えないようにしましょう。</p>



<p>なお、覚える際には、「オーバーライドのライドは上書きって意味だからスーパークラスのメソッドを上書きしてサブクラスで定義することだな…」、「オーバーロードのロードは読み込みって意味だから引数、返り値が違う同じ名前のメソッドを複数読み込んで定義することだな…」と覚えると間違えないと思います。</p>



<h3 class="wp-block-heading" id="3-Pythonで確認-2">(3) Pythonで確認</h3>



<p>では、Pythonでオーバーライドについて確認していきましょう。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
# クラス「冒険者（プレイヤー）」
class Player():
    def __init__(self,name):
        self.name      = name    # 名前
    # 自己紹介関数、引数 opponent には相手の名前を入れる
    def introduction(self,opponent):
        print(&quot;私の名前は&quot; + self.name + &quot;。よろしくね&quot; + opponent + &quot;さん。&quot;)

class Monk(Player):
    def __init__(self,name,power): # 初期化関数をオーバーライド
        self.name      = name    # 名前
        self.power     = power   # 拳の強さ

# クラス「魔道士」（Playerを継承）
class Mage(Player): 
    def introduction(self,opponent): # 自己紹介関数をオーバーライド
        print(&quot;私の名前は&quot; + self.name + &quot;です。&quot; + opponent + &quot;さん、これからよろしくお願いします！&quot;)

# クラス「忍者」（Playerを継承）
class Ninja(Player):
    def introduction(self,opponent): # 自己紹介関数をオーバーライド
        print(&quot;拙者、&quot; + self.name + &quot;と申す。&quot; + opponent + &quot;殿、よろしくでござる。&quot;)



party1 = Player(&quot;アルク&quot;)   # 冒険者クラス
party2 = Monk(&quot;ケン&quot;,5000) # モンククラス（初期化関数をオーバーライド）
party3 = Mage(&quot;レフィア&quot;)   # 魔道士クラス
party4 = Ninja(&quot;イングス&quot;)  # 忍者クラス


party1.introduction(&quot;ルーネス&quot;)
party2.introduction(&quot;ルーネス&quot;) # オーバーライドをしない場合は継承元クラスのメソッドが呼び出される
party3.introduction(&quot;ルーネス&quot;) # オーバーライドしているため、魔導士クラスのメソッドが呼び出される
party4.introduction(&quot;ルーネス&quot;) # オーバーライドしているため、忍者クラスのメソッドが呼び出される
</pre></div>


<p>上のプログラムを実行すると、以下の実行結果が出てきます。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
私の名前はアルク。よろしくねルーネスさん。
私の名前はケン。よろしくねルーネスさん。
私の名前はレフィアです。ルーネスさん、これからよろしくお願いします！
拙者、イングスと申す。ルーネス殿、よろしくでござる。
</pre></div>


<p><code>Monk</code> クラスはオーバーライドをしていないため、継承元の <code>Player</code> クラスのメソッドが呼び出されています。</p>



<p>一方 <code>Mage</code> クラスと <code>Ninja</code> クラス内では <code>introduction</code> メソッドを定義し直しているため、オーバーライドが起こり、自分自身のクラスのメソッドが呼び出されていることがわかりますね。</p>



<h2 class="wp-block-heading" id="6-ポリモフィズム多様性多相性">6. ポリモフィズム（多様性・多相性）</h2>



<h3 class="wp-block-heading" id="1-ポリモフィズムとは">(1) ポリモフィズムとは</h3>



<p>同じメッセージ<a href="#f-6de54411" name="fn-6de54411" title="厳密にいうと違うのですが、同じメッセージを送るというのは「同じ名前のメソッド（関数）」を呼び出すという意味だと思ってください。">*9</a>を（継承を利用して定義された）<span class="marker-yellow"><b>複数のオブジェクトに送っても、それぞれのオブジェクトごとに動作が異なる性質</b></span>のことを<span class="marker-green"><b>ポリモフィズム</b></span>と呼びます。多様性、多相性とも呼ばれます。</p>



<p>とは言ってもわかりにくいので1つ例を用意しましょう。</p>



<p>「うさぎさん」、「あざらしさん」、「ねこさん」の3人(?)がいたとします。</p>



<p>この3人に先生が「勉強せよ！」と命令したとします（メッセージを送る）。</p>



<p>このとき、3人は「勉強せよ！」と同じことを言われていますが、勉強する内容、つまり動作はそれぞれ異なりますよね。ある人は国語を勉強するかもしれませんし、ある人は数学を勉強するかもしれません。</p>



<figure class="wp-block-image"><img src="https://www.momoyama-usagi.com/wp-content/uploads/2021/05/20200712024412.gif" alt="f:id:momoyama1192:20200712024412g:plain" title="f:id:momoyama1192:20200712024412g:plain"/></figure>



<p><span itemscope="" itemtype="http://schema.org/Photograph"></span></p>



<p>このように、同じことを言っても受け取った人（オブジェクト）ごとに異なる動作をするのがポリモフィズムなのです。</p>



<h3 class="wp-block-heading" id="2-Pythonで確認">(2) Pythonで確認</h3>



<p>ポリモフィズムはオーバーライドを行うことで実現できます。</p>



<p>ということで、実際にオーバーライドを行いポリモフィズムがどんなものなのかを体感しましょう。</p>



<p>※プログラムはオーバーライドの確認のときとほとんど同じです</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
# クラス「冒険者（プレイヤー）」
class Player():
    def __init__(self,name):
        self.name      = name    # 名前
    # 自己紹介関数、引数 opponent には相手の名前を入れる
    def introduction(self,opponent):
        print(&quot;私の名前は&quot; + self.name + &quot;。よろしくね&quot; + opponent + &quot;さん。&quot;)

# クラス「魔道士」（Playerを継承）
class Mage(Player): 
    def introduction(self,opponent): # 自己紹介関数をオーバーライド
        print(&quot;私の名前は&quot; + self.name + &quot;です。&quot; + opponent + &quot;さん、これからよろしくお願いします！&quot;)

# クラス「忍者」（Playerを継承）
class Ninja(Player):
    def introduction(self,opponent): # 自己紹介関数をオーバーライド
        print(&quot;拙者、&quot; + self.name + &quot;と申す。&quot; + opponent + &quot;殿、よろしくでござる。&quot;)



party1 = Player(&quot;アルク&quot;)   # 冒険者クラス
party2 = Mage(&quot;レフィア&quot;)   # 魔道士クラス
party3 = Ninja(&quot;イングス&quot;)  # 忍者クラス

# 同じ introduction でも3つの動作が微妙に違う、これがポリモフィズム！
party1.introduction(&quot;ルーネス&quot;)
party2.introduction(&quot;ルーネス&quot;) 
party3.introduction(&quot;ルーネス&quot;) 
</pre></div>


<p>このプログラムを実行すると…</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
私の名前はアルク。よろしくねルーネスさん。
私の名前はレフィアです。ルーネスさん、これからよろしくお願いします！
拙者、イングスと申す。ルーネス殿、よろしくでござる。
</pre></div>


<p>同じ <code>introduction</code> メソッドを使っているのに3つの実行結果が全然違いますよね。</p>



<p>まさにこれがポリモフィズムなのです！</p>



<h2 class="wp-block-heading" id="7-練習問題">7. 練習問題</h2>



<p>では、オブジェクト指向について復習するために基本情報の問題を解いてみましょう。</p>



<h3 class="wp-block-heading" id="練習1">練習1</h3>



<p>オブジェクト指向の基本概念の組合せとして適切なものはどれか。</p>



<p>[基本情報技術者平成19年秋期 午前問44]</p>



<p>ア：仮想化、構造化、投影、クラス<br>イ：具体化、構造化、連続、クラス<br>ウ：正規化、カプセル化、分割、クラス<br>エ：抽象化、カプセル化、継承、クラス</p>



<h3 class="wp-block-heading" id="練習2">練習2</h3>



<p>オブジェクト指向の特徴はどれか。</p>



<p>[基本情報技術者平成23年特別 午前問48]</p>



<p>ア：オブジェクト指向では、抽象化の対象となるオブジェクトに対する操作をあらかじめ指定しなければならない。</p>



<p>イ：カプセル化によって、オブジェクト間の相互依存性を高めることができる。</p>



<p>ウ：クラスの変更を行う場合には、そのクラスの上位にあるすべてのクラスの変更が必要となる。</p>



<p>エ：継承という概念によって、モデルの拡張や変更の際に変更箇所を局所化できる。</p>



<h3 class="wp-block-heading" id="練習3">練習3</h3>



<p>オブジェクト指向の考え方に基づくとき、一般的に“自動車”のサブクラスといえるものはどれか。</p>



<p>[基本情報技術者平成18年秋期 午前問40]</p>



<p>ア：エンジン<br>イ：製造番号<br>ウ：タイヤ<br>エ：トラック</p>



<h3 class="wp-block-heading" id="練習4">練習4</h3>



<p>オブジェクト指向におけるカプセル化を説明したものはどれか。</p>



<p>[基本情報技術者平成19年春期 午前問42]</p>



<p>ア：同じ性質をもつ複数のオブジェクトを抽象化して、整理すること</p>



<p>イ：基底クラスの性質を派生クラスに受け継がせること</p>



<p>ウ：クラス間に共通する性質を抽出し、基底クラスを作ること</p>



<p>エ：データとそれを操作する手続を一つにして、オブジェクトの内部に隠ぺいすること</p>



<h3 class="wp-block-heading" id="練習5">練習5</h3>



<p>オブジェクト指向プログラミングにおける、多相性を実現するためのオーバーライドの説明はどれか。</p>



<p>[基本情報技術者平成29年秋期 午前問7]</p>



<p>ア：オブジェクト内の詳細な仕様や構造を外部から隠蔽すること</p>



<p>イ：スーパークラスで定義されたメソッドをサブクラスで再定義すること</p>



<p>ウ：同一クラス内に、メソッド名が同一で、引数の型、個数、並び順が異なる複数のメソッドを定義すること</p>



<p>エ：複数のクラスの共通する性質をまとめて、抽象化したクラスを作ること</p>



<h2 class="wp-block-heading" id="8-練習問題の答え">8. 練習問題の答え</h2>



<h3 class="wp-block-heading" id="解答1">解答1</h3>



<p>解答：エ</p>



<p>オブジェクト指向に出てくる単語をまとめておいたのでこの際全部頭にいれておきましょう。</p>



<ul class="wp-block-list"><li>抽象化（オブジェクトを抽象化してクラスを定義）</li><li>カプセル化（外部から直接データにアクセスできなくする）</li><li>継承（スーパークラスの特性をサブクラスに引き継ぐ）</li><li>汎化（サブクラスをまとめてスーパークラスを定義）</li><li>特化（スーパークラスの具体例としてサブクラスを定義）</li><li>集約（単純なクラスを集め合わせて1つの複雑なクラスにすること）</li><li>分解（1つの複雑なクラスをいくつかの単純なクラスにバラバラにすること）</li><li>オーバーライド（スーパークラスで継承したメソッドをサブクラスで定義して上書きすること）</li><li>ポリモフィズム（同じメッセージを送ってもオブジェクトごとに動作内容が変わること）</li></ul>



<h3 class="wp-block-heading" id="解答2">解答2</h3>



<p>解答：エ</p>



<p>それぞれの選択肢を見ていきましょう。</p>



<p>ア：オブジェクト指向では、抽象化の対象となるオブジェクトに対する操作をあらかじめ指定しなければならない。<br>→ あらかじめ指定する必要はありません（例えば抽象化したもの（インスタンス）を定義せずに継承のためだけに使うようなクラス（抽象クラス）だとオブジェクトを指定せずに使うことがあります）。</p>



<p>イ：カプセル化によって、オブジェクト間の相互依存性を高めることができる。<br>→ カプセル化はオブジェクト内にデータと手続きをまとめることなので、オブジェクト間の相互依存性は低くなる。</p>



<p>ウ：クラスの変更を行う場合には、そのクラスの上位にあるすべてのクラスの変更が必要となる。<br>→ 下位クラス独自の内容を変更する場合は上位クラスを変更する必要はありません。</p>



<p>エ：継承という概念によって、モデルの拡張や変更の際に変更箇所を局所化できる。<br>→ 正しい</p>



<h3 class="wp-block-heading" id="解答3">解答3</h3>



<p>解答：エ</p>



<p>自動車のサブクラスということは、自動車の具体例になるものを答えればよい。</p>



<p>トラックは自動車の具体例（トラック is a 自転車とis-a関係が成り立つ）ので答えはエ。</p>



<p>ちなみに残りの3つの選択肢（エンジン、製造番号、タイヤ）にはすべてpart-of関係が成り立ちます。</p>



<h3 class="wp-block-heading" id="解答4">解答4</h3>



<p>解答：エ</p>



<p>それぞれの選択肢を見ていきましょう。</p>



<p>ア：同じ性質をもつ複数のオブジェクトを抽象化して、整理すること<br>→ 抽象化のこと。（特化のことかも。）</p>



<p>イ：基底クラスの性質を派生クラスに受け継がせること<br>→ 継承（インヘリタンス）のこと。</p>



<p>ウ：クラス間に共通する性質を抽出し、基底クラスを作ること<br>→ 汎化のこと。</p>



<p>エ：データとそれを操作する手続を一つにして、オブジェクトの内部に隠ぺいすること<br>→ 正解。これがカプセル化。</p>



<h3 class="wp-block-heading" id="解答5">解答5</h3>



<p>解答：イ</p>



<p>それぞれの選択肢を見ていきましょう。</p>



<p>ア：オブジェクト内の詳細な仕様や構造を外部から隠蔽すること<br>→ カプセル化のこと。</p>



<p>イ：スーパークラスで定義されたメソッドをサブクラスで再定義すること<br>→ オーバーライドのこと。正解。</p>



<p>ウ：同一クラス内に、メソッド名が同一で、引数の型、個数、並び順が異なる複数のメソッドを定義すること<br>→ オーバーロードのこと。オーバーロードとオーバーライドはごちゃごちゃになりやすいので要注意！</p>



<p>エ：複数のクラスの共通する性質をまとめて、抽象化したクラスを作ること<br>→ 汎化のこと。</p>



<h2 class="wp-block-heading" id="9-さいごに">9. さいごに</h2>



<p>今回は、オブジェクト指向とはどんなものなのかをPythonを使いながら説明していきました。</p>



<p>次回は、オブジェクト指向言語の設計で使われる標準的な記法であるUMLについて説明していきましょう。</p>



<div class="footnote">
<p class="footnote"><a href="#fn-ad2096f2" name="f-ad2096f2" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">現代のソフトウェア、システム開発では「複数の要素が絡み合った大規模で複雑なプログラム」を扱うことがほとんどで、なおかつ「デバッグやメンテナンス」は定期的に行われるので手続き型よりもオブジェクト指向なプログラミング手法が使われることがほとんど（だと思うの）です。</span></p>
<p class="footnote"><a href="#fn-a92c31b1" name="f-a92c31b1" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">つまり外部からの不正アクセスを防止することができるってことです。</span></p>
<p class="footnote"><a href="#fn-5b4fc370" name="f-5b4fc370" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">具体的なデータの中身、処理内容などを</span></p>
<p class="footnote"><a href="#fn-71ac6343" name="f-71ac6343" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">入力と出力が一緒であれば</span></p>
<p class="footnote"><a href="#fn-7c99c2ec" name="f-7c99c2ec" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">Javaでいう privateで宣言する操作に相当します。</span></p>
<p class="footnote"><a href="#fn-b3539940" name="f-b3539940" class="footnote-number">*6</a><span class="footnote-delimiter">:</span><span class="footnote-text">外部からアクセスしないメソッドなどに使うことで、外部から勝手にアクセスすることを防げます。</span></p>
<p class="footnote"><a href="#fn-f96d9487" name="f-f96d9487" class="footnote-number">*7</a><span class="footnote-delimiter">:</span><span class="footnote-text">余談ですが、スーパークラスにない不足したデータ、メソッドだけに注目してオブジェクトを定義する方法のことを差分プログラミングと呼ばれます。</span></p>
<p class="footnote"><a href="#fn-8c5a9126" name="f-8c5a9126" class="footnote-number">*8</a><span class="footnote-delimiter">:</span><span class="footnote-text">ちなみにオーバーロードはPythonには実装されていません。</span></p>
<p class="footnote"><a href="#fn-6de54411" name="f-6de54411" class="footnote-number">*9</a><span class="footnote-delimiter">:</span><span class="footnote-text">厳密にいうと違うのですが、同じメッセージを送るというのは「同じ名前のメソッド（関数）」を呼び出すという意味だと思ってください。</span></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.momoyama-usagi.com/entry/info-software06/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
