オブジェクト指向とプログラム言語の特徴
オブジェクト指向の基本用語(特にカプセル化とオーバーロード)と、Java・Perl・Python・JSPなど主なプログラム言語の特徴を見分けて、科目Aの用語問題を選択肢から即答できるようになる。
オブジェクト指向の中ではカプセル化がいちばんよく出ており、本試験系で4回、免除試験で8回出題されています。Java・Perl・Python・JSP・オーバーロードは、過去問ではそれぞれ1〜2回ほどしか出ていませんが、用語を知っていれば数秒で解ける問題です。
このレッスンで稽古する(用語チェック・過去問)結論:オブジェクト指向は「データと処理をひとまとめにして中身を隠す」考え方
オブジェクト指向とは、データ(属性)とそれを扱う処理(振る舞い=メソッド)を1つの「オブジェクト」にまとめてプログラムを組み立てる考え方です。オブジェクト同士はメッセージ(「この処理をして」という呼び出し)を送り合って協調し、プログラム全体の機能を実現します。
API設計に置き換えると分かりやすいです。利用者は公開されたエンドポイントだけを呼び、サーバ内部のDB構造は知りません。内部を作り替えても、APIが同じなら利用者は困りません。この「中を隠して窓口だけ見せる」考え方が、次に説明するカプセル化です。
カプセル化(最頻出)
カプセル化とは、属性と振る舞いを1つにまとめ、内部の構造を外から隠すことです。隠すことを情報隠蔽(じょうほういんぺい)といいます。外部の利用者は決められたメソッドを通じてしか内部のデータを扱えません。
効果は次の2つで、試験はほぼこの言い回しで問われます。
- 内部構造を変更しても、利用者が影響を受けない
- 利用者は内部構造を知らなくてもオブジェクトを使える
たとえるなら自動販売機です。お金を入れてボタンを押せば飲み物が出てきます。中の冷却装置や在庫の並べ方が変わっても、利用者の操作は変わりません。
逆に「外部から内部データを直接変更できるので自由度が高い」という選択肢は、カプセル化に反するので誤りです。
オブジェクト指向の用語を区別する
カプセル化の問題では、ほかのオブジェクト指向用語が誤りの選択肢として並びます。意味の違いを表で押さえておきましょう。
| 用語 | 意味 | 見分けるキーワード |
|---|---|---|
| カプセル化 | 属性と振る舞いをまとめ、内部を隠す | 内部構造を知らなくてよい/変更の影響を受けない |
| クラス | オブジェクトの設計図(共通の属性・メソッドの定義) | ひな形・型 |
| インスタンス | クラスから実際に作られた個々のオブジェクト | 実体 |
| 継承(インヘリタンス) | 上位クラスの性質を下位クラスが引き継ぐ | 引き継ぐ・スーパクラス/サブクラス |
| 汎化 | 複数のクラスの共通部分をまとめて上位クラスを作る関係 | is-a(〜は…の一種) |
| 集約 | 全体と部分の関係 | part-of(〜は…の一部) |
| 多相性(ポリモーフィズム) | 同じメッセージでも受け取ったオブジェクトごとに違う動きをする | 同じ呼び出しで異なる振る舞い |
継承についての注意点:下位クラスは上位クラスの性質を引き継いだうえで、独自の性質を追加できます。そのため「下位クラスに必要な性質は全て上位クラスに含まれる」という説明は誤りです。
オーバーロードとオーバーライド
オーバーロードとは、同じ名前で引数の数や型が違うメソッドを複数定義することです。呼び出したときの引数に合うものが自動で選ばれます。コンストラクタ(インスタンスを作るときに動く初期化用のメソッド)もオーバーロードできます。
| 用語 | 何をするか | 引数(シグネチャ) | 場所 |
|---|---|---|---|
| オーバーロード | 同名メソッドを複数定義する | 異なる(数・型・並び) | 同じクラス内でもよい |
| オーバーライド | 上位クラスのメソッドを下位クラスで再定義する | 同じ | 継承関係(上位と下位) |
シグネチャとは、メソッド名と引数の並び(数・型・順序)の組合せのことです。オーバーロードはシグネチャが異なるから共存できます。そのため「同じシグネチャのメソッドを複数定義できる」は誤りです。
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です。
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)。
あるオブジェクトが別のオブジェクトを部品として持つ、全体と部分の関係。
⚠ 汎化(〜の一種)と区別する。
同じ名前で引数の数や型が違うメソッドを複数定義し、呼び出し時の引数で使い分けること。
⚠ オーバーライドは同じシグネチャのメソッドを下位クラスで再定義すること。引数が違う方がオーバーロード。
上位クラスのメソッドを、下位クラスで同じシグネチャのまま中身だけ書き換えること。
⚠ オーバーロードと混同しやすい。継承関係が前提ならオーバーライド。
メソッド名と引数の並び(数・型・順序)の組合せ。
プログラムが使わなくなったメモリ領域を自動で見つけて回収する機能。
HTMLにJavaのプログラムを埋め込み、サーバ側で動的にHTMLを生成する技術。
⚠ アプレットはクライアント側で動く。EJBは業務部品、JDBCはDB接続。
サーバ側の業務処理を再利用できる部品にするJavaの仕組み。
⚠ JSPと混同しやすい。HTML生成ならJSP。
Javaプログラムからデータベースに接続して操作するためのAPI。
ブラウザ上で動くJavaの小さなプログラム(現在は廃止された技術)。
⚠ JSPはサーバ側、アプレットはクライアント側で動く。
ソースプログラムを1行ずつ解釈しながら実行する方式。事前のコンパイルが要らない。
⚠ コンパイラは先に全体を機械語へ翻訳してから実行する。
手軽に書いて、事前にコンパイルせずそのまま実行できる言語(Perl・Python・Ruby・JavaScriptなど)。
このレッスンの過去問
- カプセル化の効果平成26年度 春期 基本情報技術者試験 午前 問47
- メソッドのオーバーロードの定義基本情報技術者試験 科目A免除 修了試験 20260614 実施分 問7
- Javaのガベージコレクション平成30年度 秋期 基本情報技術者試験 午前 問8
- Java言語の特徴基本情報技術者試験 科目A免除 修了試験 20141221 実施分 問8
- JSPの定義(サーバ側での動的HTML生成)基本情報技術者試験 科目A免除 修了試験 20260726 実施分 問7
- スクリプト言語Perlの実行形態(インタプリタ)平成29年度 秋期 基本情報技術者試験 午前 問8
- プログラム言語の特徴(Pythonのインデントによるブロック表現)基本情報技術者試験 科目A免除 修了試験 20211212 実施分 問9