資格道場 › レッスン一覧 › アルゴリズムとプログラミング
アルゴリズムとプログラミング・13/13・10分

オブジェクト指向とプログラム言語の特徴

ゴール

オブジェクト指向の基本用語(特にカプセル化とオーバーロード)と、Java・Perl・Python・JSPなど主なプログラム言語の特徴を見分けて、科目Aの用語問題を選択肢から即答できるようになる。

オブジェクト指向の中ではカプセル化がいちばんよく出ており、本試験系で4回、免除試験で8回出題されています。Java・Perl・Python・JSP・オーバーロードは、過去問ではそれぞれ1〜2回ほどしか出ていませんが、用語を知っていれば数秒で解ける問題です。

このレッスンで稽古する(用語チェック・過去問)

結論:オブジェクト指向は「データと処理をひとまとめにして中身を隠す」考え方

オブジェクト指向とは、データ(属性)とそれを扱う処理(振る舞い=メソッド)を1つの「オブジェクト」にまとめてプログラムを組み立てる考え方です。オブジェクト同士はメッセージ(「この処理をして」という呼び出し)を送り合って協調し、プログラム全体の機能を実現します。

API設計に置き換えると分かりやすいです。利用者は公開されたエンドポイントだけを呼び、サーバ内部のDB構造は知りません。内部を作り替えても、APIが同じなら利用者は困りません。この「中を隠して窓口だけ見せる」考え方が、次に説明するカプセル化です。

カプセル化(最頻出)

カプセル化とは、属性と振る舞いを1つにまとめ、内部の構造を外から隠すことです。隠すことを情報隠蔽(じょうほういんぺい)といいます。外部の利用者は決められたメソッドを通じてしか内部のデータを扱えません。

効果は次の2つで、試験はほぼこの言い回しで問われます。

  • 内部構造を変更しても、利用者が影響を受けない
  • 利用者は内部構造を知らなくてもオブジェクトを使える

たとえるなら自動販売機です。お金を入れてボタンを押せば飲み物が出てきます。中の冷却装置や在庫の並べ方が変わっても、利用者の操作は変わりません。

逆に「外部から内部データを直接変更できるので自由度が高い」という選択肢は、カプセル化に反するので誤りです。

利用者オブジェクトメソッドメソッド属性(データ)内部構造外から見えない窓口(メソッド)だけを呼ぶ中を変えても利用者は影響を受けない
利用者はメソッドという窓口だけを呼び、中の属性(データ)は外から隠されている。

オブジェクト指向の用語を区別する

カプセル化の問題では、ほかのオブジェクト指向用語が誤りの選択肢として並びます。意味の違いを表で押さえておきましょう。

用語 意味 見分けるキーワード
カプセル化 属性と振る舞いをまとめ、内部を隠す 内部構造を知らなくてよい/変更の影響を受けない
クラス オブジェクトの設計図(共通の属性・メソッドの定義) ひな形・型
インスタンス クラスから実際に作られた個々のオブジェクト 実体
継承(インヘリタンス) 上位クラスの性質を下位クラスが引き継ぐ 引き継ぐ・スーパクラス/サブクラス
汎化 複数のクラスの共通部分をまとめて上位クラスを作る関係 is-a(〜は…の一種)
集約 全体と部分の関係 part-of(〜は…の一部)
多相性(ポリモーフィズム) 同じメッセージでも受け取ったオブジェクトごとに違う動きをする 同じ呼び出しで異なる振る舞い

継承についての注意点:下位クラスは上位クラスの性質を引き継いだうえで、独自の性質を追加できます。そのため「下位クラスに必要な性質は全て上位クラスに含まれる」という説明は誤りです。

上位クラス:動物名前・食べる()継承(引き継ぐ)下位クラス:犬名前・食べる()上位から引き継いだ吠える()独自に追加できる上位に無い性質も下位で持てる
継承では下位クラスが上位クラスの性質を引き継ぎ、さらに独自の性質を追加できる。

オーバーロードとオーバーライド

オーバーロードとは、同じ名前で引数の数や型が違うメソッドを複数定義することです。呼び出したときの引数に合うものが自動で選ばれます。コンストラクタ(インスタンスを作るときに動く初期化用のメソッド)もオーバーロードできます。

用語 何をするか 引数(シグネチャ) 場所
オーバーロード 同名メソッドを複数定義する 異なる(数・型・並び) 同じクラス内でもよい
オーバーライド 上位クラスのメソッドを下位クラスで再定義する 同じ 継承関係(上位と下位)

シグネチャとは、メソッド名と引数の並び(数・型・順序)の組合せのことです。オーバーロードはシグネチャが異なるから共存できます。そのため「同じシグネチャのメソッドを複数定義できる」は誤りです。

呼び出し表示(5)表示("abc")表示(5, 2)同じクラス内表示(整数)表示(文字列)表示(整数, 整数)名前は同じ・引数の数や型で自動で選ばれる
オーバーロードでは同じ名前のメソッドが並び、呼び出しの引数の数や型に合うものが自動で選ばれる。

Javaの特徴

Javaはオブジェクト指向言語で、試験では次の点を押さえておけば足ります。

正しい特徴 よく出る誤り
ガーベジコレクションがある(不要になったメモリを自動で回収する) 多重継承ができる → できない(クラスの継承元は1つだけ)
ブラウザで動くアプレットを作れた(現在は廃止された技術だが、過去問ではJavaの特徴として正解) ポインタ型でアドレスを直接参照できる → できない
実行環境(JVM)があればOSを問わず動く 整数や文字は常にクラス → int などの基本データ型がある

ガーベジコレクションは、レストランで食べ終わった皿を店員が自動で下げてくれるようなものです。プログラマが「この皿はもう使わない」と自分で片付ける必要がありません。

Java関連技術:JSPを他の略語と区別する

JSP(JavaServer Pages)は、HTMLの中にJavaのプログラムを埋め込み、サーバ側でHTMLを動的に生成してブラウザに返す技術です。同じJ〜で始まる略語が誤りの選択肢として並びます。

略語 正式名称 役割
JSP JavaServer Pages HTMLにJavaを埋め込み、サーバ側で動的にHTMLを生成
サーブレット Java Servlet サーバ側で動くJavaプログラム(JSPは内部でこれに変換される)
EJB Enterprise JavaBeans サーバ側の業務処理を部品(コンポーネント)にする仕組み
JDBC Java Database Connectivity JavaからDBに接続するためのAPI
JMF Java Media Framework 音声・動画を扱うためのAPI
アプレット Java Applet クライアント(ブラウザ)側で動くJavaプログラム

「HTML」「埋め込み」「サーバ側」の3語がそろったらJSPです。

サーバ側ブラウザ側JSPHTML+JavaHTMLを動的に生成HTMLを表示JavaプログラムアプレットJavaがここで動くJSPはサーバ、アプレットはブラウザで動く
JSPはサーバ側でHTMLを動的に生成してブラウザに返し、アプレットはブラウザ側で動く。

Perl・Pythonなどの言語の特徴

Perlはスクリプト言語です。スクリプト言語とは、手軽に書いて、そのまま実行できる言語のことです。インタプリタ(ソースを1行ずつ解釈しながら実行する仕組み)で動くため、事前にコンパイルしたファイルを用意する必要がありません。Windows版もあり、Webサーバがなくても実行できます。

実行方式 動き方 事前の変換
コンパイラ方式 ソース全体を先に機械語へ翻訳してから実行 必要
インタプリタ方式 ソースを解釈しながら逐次実行 不要

言語ごとの見分けポイントは次のとおりです。

言語 見分けるポイント
Python ブロックの範囲をインデント(字下げ)の深さで表す
Ruby オブジェクト指向のスクリプト言語。ブロックを end などで閉じる
Perl テキスト処理が得意なスクリプト言語。ブロックは波括弧 { }
JavaScript ブラウザ上で動くスクリプト言語。ブロックは波括弧 { }(Javaとは別の言語)
Java オブジェクト指向。ガーベジコレクション・アプレット
C++ Cにクラスや継承を加えた言語。Cとの上位互換性がある
Smalltalk 1970年代に開発された初期のオブジェクト指向言語。開発環境と一体になっている
HTML プログラム言語ではなく、タグで文書構造を書くマークアップ言語

試験での問われ方

  • カプセル化:「内部構造を知らなくてよい」「変更の影響を受けない」「属性と振る舞いを一つにまとめる」のどれかが問題文にあれば、カプセル化を選びます。誤りの選択肢はクラス化・構造化・モジュール化・集約化・汎化です。
  • オブジェクト指向の特徴:「メッセージを送り合って協調する」が正解です。「内部データを直接変更できる」は誤りです。
  • 言語の説明問題:Smalltalk・C++・HTMLの説明を並べて、Javaを選ばせます。言語ごとの見分けポイントで1つずつ消していきます。
  • Java:多重継承・ポインタ・整数も常にクラス、の3つは誤りの定番です。

要点(試験直前に読む)

  • カプセル化=属性と振る舞いをまとめて内部を隠す。効果は「内部を変えても利用者が影響を受けない」「内部を知らなくても使える」。
  • オブジェクト同士はメッセージを送り合って協調動作する。外から内部データを直接いじれるのはオブジェクト指向に反する。
  • オーバーロード=同名で引数が違うメソッドを複数定義(引数で選ばれる)。オーバーライド=上位クラスのメソッドを同じシグネチャで再定義。
  • Java:ガーベジコレクションあり・アプレットあり。多重継承なし・ポインタなし。
  • JSP=HTMLにJavaを埋め込み、サーバ側でHTMLを生成。EJB=業務部品、JDBC=DB接続。
  • Perlはインタプリタで動き、事前コンパイル不要。Pythonはインデントでブロックを表す。

ひっかけ

  • 「クラス化」「モジュール化」「構造化」が並んでも、内部の隠蔽を言っているならカプセル化を選ぶ。
  • 「同じシグネチャのメソッドを複数定義できる」はオーバーロードではない(シグネチャが違うから共存できる)。「コンストラクタはオーバーロードできない」も誤り。
  • Javaの説明問題では、Smalltalk(1970年代・開発環境と一体)、C++(Cと上位互換)、HTML(タグ・マークアップ)の説明が誤りとして並ぶ。
  • Javaに多重継承・ポインタ型があるという選択肢は誤り。
  • Perlについて「UNIX専用」「Webサーバ必須」は誤り。インタプリタで動くので事前コンパイルは要らない。

用語(18)

オブジェクト指向 おぶじぇくとしこう
データと処理をまとめたオブジェクトを組み合わせ、メッセージのやり取りでプログラムを組み立てる考え方。
⚠ 構造化(処理の手順を階層に分ける考え方)と混同しやすい。オブジェクト指向はデータと処理をセットにする点が違う。
カプセル化 かぷせるか
属性と振る舞いを1つにまとめて内部を隠し、決められた窓口からしか使えないようにすること。
⚠ クラス化・モジュール化と取り違えやすい。「内部を隠す」「利用者が影響を受けない」とあればカプセル化。
情報隠蔽 じょうほういんぺい
オブジェクト内部のデータや作り方を外部から見えないようにすること。
メッセージ めっせーじ
あるオブジェクトが別のオブジェクトに処理を頼む呼び出しのこと。
クラス くらす
オブジェクトに共通する属性とメソッドを定義した設計図。
⚠ インスタンスはクラスから作った実体。設計図なのか実物なのかで見分ける。
継承 けいしょう(インヘリタンス)
上位クラスの属性やメソッドを下位クラスが引き継ぐ仕組み。
⚠ 下位クラスは独自の性質を追加できるので、「下位に必要な性質は全て上位にある」は誤り。
汎化 はんか
複数のクラスの共通部分を取り出して上位クラスにまとめる関係(is-a)。
⚠ 集約は全体と部分の関係(part-of)。
集約 しゅうやく
あるオブジェクトが別のオブジェクトを部品として持つ、全体と部分の関係。
⚠ 汎化(〜の一種)と区別する。
オーバーロード おーばーろーど
同じ名前で引数の数や型が違うメソッドを複数定義し、呼び出し時の引数で使い分けること。
⚠ オーバーライドは同じシグネチャのメソッドを下位クラスで再定義すること。引数が違う方がオーバーロード。
オーバーライド おーばーらいど
上位クラスのメソッドを、下位クラスで同じシグネチャのまま中身だけ書き換えること。
⚠ オーバーロードと混同しやすい。継承関係が前提ならオーバーライド。
シグネチャ しぐねちゃ
メソッド名と引数の並び(数・型・順序)の組合せ。
ガーベジコレクション がーべじこれくしょん
プログラムが使わなくなったメモリ領域を自動で見つけて回収する機能。
JSP JavaServer Pages
HTMLにJavaのプログラムを埋め込み、サーバ側で動的にHTMLを生成する技術。
⚠ アプレットはクライアント側で動く。EJBは業務部品、JDBCはDB接続。
EJB Enterprise JavaBeans
サーバ側の業務処理を再利用できる部品にするJavaの仕組み。
⚠ JSPと混同しやすい。HTML生成ならJSP。
JDBC Java Database Connectivity
Javaプログラムからデータベースに接続して操作するためのAPI。
アプレット Java Applet
ブラウザ上で動くJavaの小さなプログラム(現在は廃止された技術)。
⚠ JSPはサーバ側、アプレットはクライアント側で動く。
インタプリタ いんたぷりた
ソースプログラムを1行ずつ解釈しながら実行する方式。事前のコンパイルが要らない。
⚠ コンパイラは先に全体を機械語へ翻訳してから実行する。
スクリプト言語 すくりぷとげんご
手軽に書いて、事前にコンパイルせずそのまま実行できる言語(Perl・Python・Ruby・JavaScriptなど)。

このレッスンの過去問

このレッスンで稽古する