1.オブジェクト指向に関する用語
①クラス
・過去問(H21秋AP午前問44)では、「同一のデータ構造と同一の手続をもつオブジェクトをまとめて表現する」という選択肢がありますが、こうやってできたものがクラスと言えます。・過去問(H28秋AP午前問47)ではオブジェクト指向言語のクラスに関して、「オブジェクトに共通する性質を定義したものがクラスであり,クラスを集めたものがクラスライブラリである。」とあります。
②インスタンス
インスタンス(instance)は実例という意味です。過去問(H22秋FE午前問47)では、「オブジェクト指向におけるクラスとインスタンスとの関係」に関して、「クラスの定義に基づいてインスタンスが生成される」とあります。また、「一つのクラスに対して,複数のインスタンスが対応(選択肢ウを改編)」します。
小さなプログラムの場合は、クラスとインスタンスが同じこともあります。しかし、一般的には分けて考えましょう。たとえば、自動車というクラスの中に、その具体的な例(インスタンス)である、日産マーチやトヨタのクラウンがあります。
◆クラスとインスタンスに関してもう少し
・クラスはひな形と思ってもいいでしょう。
・クラスとインスタンスの例ですが、(一例でしかありませんが)
たとえば、整数型(INT)、文字型(String)もクラスと考えられる。
概念なので、いろいろな例を見ながら深めるといいでしょう。
クラス インスタンス
--------------------------------
INT 1、2、10
String abc、こんちくは
Pythonで以下を実行してみる。これを見ると、INTという型に、9というインスタンス、Stringという型に、abcが入っていることがわかる。
>>> type(9)
<class 'int'> #INTのクラス
>>> type('abc')
<class 'str'> #Stringのクラス
簡単に実行するなら、以下のWebサイトで。
https://paiza.io/ja
print(type(9))
print(type('abc'))
print(type(1.25))
x=[1,2,3]
print(type(x))
y={'English': 70, 'Math': 40, 'Science': 80}
print(type(y))
結果は以下のように表示されます。
<class 'int'>
<class 'str'>
<class 'float'>
<class 'list'>
<class 'dict'>
◆インスタンスとオブジェクト
厳密にいうとややこしいが、オブジェクトには、データと手続き(メソッド)が入っている。
クラスは概念なので、実体はない。
インスタンスには、実際のデータや手続きがある。乱暴ではあるが、最初のうちは、オブジェクト=インスタンスと考えておくと、気持ちが楽になるかと思う。(理解する方法としては、そう間違っていない)
③メソッド
過去問(H25秋FE午前問48)では、メソッドに関して、「オブジェクト指向開発において,オブジェクトのもつ振る舞いを記述したもの」とあります。■具体例をみてみよう。
(例)Pythonで実行
LIST型のクラス(あらかじめ定義されている)から、インスタンスとして、dataとして数字を入れてみる。
具体的には、[1,2,3,4,5]。これが、オブジェクトとしてのデータ
でもある。
メソッドは、LIST型クラスには、あらかじめいくつか用意されている。たとえば、popというメソッドはLISTの最後の数字を取り出す。
以下、実行例
data = [1,2,3,4,5] # インスタンスとして実体を作る
print(type(data)) # 型は何かを聞くコマンド
print(data.pop())
→結果
<class 'list'> #LISTの型(クラス)であることがわかる
5 #popの手続きによって、5が取り出される。
④カプセル化
・過去問(H28秋FE午前問47)では、「オブジェクト指向におけるカプセル化」に関して、「データとそれを操作する手続を一つのオブジェクトにして,データと手続の詳細をオブジェクトの外部から隠蔽すること」と述べています。
・過去問(H22秋FE午前問46)ではカプセル化に関して「オブジェクト指向において,属性と振る舞いを一つにまとめた構造にすること」と述べています。
なぜカプセル化するのですか?
なにかメリットでもありますか?
過去問をベースに利点および効果を紹介します。
・過去問(H21秋FE午前問46)では、「オブジェクト指向でシステムを開発する場合のカプセル化の効果」として、「オブジェクトの内部データ構造やメソッドの実装を変更しても、ほかのオブジェクトがその影響を受けにくい。」とあります。
・過去問(H26春FE午前問47)では、カプセル化に関して、「オブジェクト指向に基づく開発では,オブジェクトの内部構造が変更されても利用者がその影響を受けないようにすることができ,それによってオブジェクトの利用者がオブジェクトの内部構造を知らなくてもよいようにすることができる。これを実現するための概念を表す用語」とあります。
つまり、保守性が高まることが効果の一つです。
⑤インヘリタンス(継承)
過去問(H28秋FE午前問47)では、インヘリタンス(継承)に関して、「基底クラスの性質を派生クラスに受け継がせること」と述べています。「オブジェクト指向の概念で,上位のクラスのデータやメソッドを下位のクラスで利用できる性質(H22秋SA午前2問6)」
「基底クラスで定義したデータ構造と手続をサブクラスで引き継いで使用する(H21秋AP午前問44)。」とあります。
その利点として、過去問(H19秋FE午前問44)では、「継承という概念によって,モデルの拡張や変更の際に変更部分を局所化できる」とあります。
⑥ポリモーフィズム(多様性、多相性)
ポリモーフィズム、ポリモルフィズムと読むこともあるが、情報処理技術者試験の言葉に合わせます。ポリモーフィズムの例(H18共通 午前18)
オブジェクト指向では、スーパークラスのメソッドはサブクラスでも継承されます。継承せずにメソッドを再定義することをオーバーライドと言います。
過去問では、「多相性を実現するためのオーバーライドの説明」として、「スーパークラスで定義されたメソッドをサブクラスで再定義すること(H29秋FE午前問7)」とあります。参考ですが、他相性はポリモルフィズムのことです。
また、似たような言葉にオーバーロードがあります。こちらは、「同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること(H29秋FE午前問7不正解選択肢)」です。
過去問(H29秋FE午前)
問7 オブジェクト指向プログラミングにおける,多相性を実現するためのオーバーライドの説明はどれか。
ア オブジェクト内の詳細な仕様や構造を外部から隠蔽すること
イ スーパークラスで定義されたメソッドをサブクラスで再定義すること
ウ 同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること
エ 複数のクラスの共通する性質をまとめて,抽象化したクラスを作ること
↓
↓
↓
正解は、イです。
⑦汎化(is-a)、集約(is-part-of)
こちらを参照してください。http://sm.seeeko.com/archives/15876917.html
2.オブジェクト指向に関する用語の過去問を解いてみよう
(1)H27秋SA午前Ⅱ
問4 オブジェクト指向設計における設計原則のうち,開放・閉鎖原則はどれか。 ア クラスにもたせる役割は一つだけにするべきであり,複数の役割が存在する場合にはクラスを分割する。 イ クラスを利用するクライアントごとに異なるメソッドが必要な場合は,インタフェースを分ける。 ウ 上位のモジュールは,下位のモジュールに依存してはならない。 エ モジュールの機能には,追加や変更が可能であり,その影響が他のモジュールに及ばないようにする。 |
↓
↓
↓
↓
【正解】エ
(2)H28秋AP午前問47
問47 オブジェクト指向言語のクラスに関する記述のうち,適切なものはどれか。 ア インスタンス変数には共有データが保存されているので,クラス全体で使用できる。 イ オブジェクトに共通する性質を定義したものがクラスであり,クラスを集めたものがクラスライブラリである。 ウ オブジェクトはクラスによって定義され,クラスにはメソッドと呼ばれる共有データが保存されている。 エ スーパクラスはサブクラスから独立して定義し,サブクラスの性質を継承する。 |
↓
↓
↓
↓
【正解】イ
コメント