みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Javaにおけるオブジェクト指向とは?

現在Javaを勉強しております。
以前はC言語を勉強しておたのですが、
JavaとCの違いにおいてJavaの特徴としてオブジェクト指向と習いました。

しかしいまいちこのオブジェクト指向を理解できません。
プログラムを一つのまとまりとして考えるというのはどういうことなのでしょうか?
確かにJavaはC言語とは違いいくつかのプログラムからできている
(はず?見当違いだったらすみません)
C言語が一つの大きなプログラムでできているとすると、
Javaは細かいプログラムの集合体であると私は考えていました。

この細かいプログラムの集合体というのがオブジェクト指向なのでしょうか?
全くの見当違いだったらすみません。
よろしくお願いします。 

投稿日時 - 2013-03-31 10:46:22

QNo.8020101

すぐに回答ほしいです

質問者が選んだベストアンサー

>確かにJavaはC言語とは違いいくつかのプログラムからできている
はい、見当違いです。
JavaやC言語に限らず、ある程度規模の大きいソフトウエアは多数のプログラムの集合体で出来ています。

オブジェクト指向には、“指向”という言葉が付いていて“オブジェクトプログラム”では有りません。
オブジェクト指向とは、“オブジェクト”というものを中心に考えて行こうと言う考え方の事を言います。
「オブジェクト指向 = オブジェクト中心の考え方」 です。
異存の有る人もいるでしょうが、C言語を用いてオブジェクト指向のプログラムを作る事も出来ます。
もちろん、JAVAやC++を使ったほうがスマートに記述できますが。

多数のプログラミング言語がオブジェクト指向をサポートするようになっています。

それではオブジェクトとは何かというと、一言では説明が難しいものです。
オブジェクトは外部とデータのやり取りが出来ます。C言語の関数と同じですね。
オブジェクトは内部にデータを持つ事が出来ます。C言語の関数と同じですね。
オブジェクトは内部で色々な処理をする事が出来ます。C言語の関数と同じですね。

JAVAのオブジェクトとC言語との違いには、次のようなものが有ります。
・オブジェクトの中にC言語の関数の関数に相当するもの(メソッドと言います)を複数持つ事が出来ます。
 c言語の関数では入口は一つです。オブジェクトは色んな入口から内部を操作できます。
・オブジェクトの中にオブジェクト内のメソッドで共通に使えるデータを持つ事が出来ます。
 C言語の場合、関数間で共通のデータを持とうとするとグローバル変数にするしか有りません。
・既存のオブジェクトで機能が足りない時には、足りない機能を追加したオブジェクトを作る事が出来ます。
 C言語でもコールバック関数を使えば似たような事は出来ますが、その場合、あらかじめコールバック関数を用意しておく必要が有ります。
 大抵の場合、ソースコードをコピーして足りない機能を追加した別の名前の関数を作る事になります。
一度に全部の説明は出来ないのでこれぐらいにしておいて

オブジェクトは複数の関連した関数(関連していなくてもかまいませんが)やデータを一まとめにしたうえで、外からどの様に見えるか(メソッドの事)を定義したものと言えるでしょう。


オブジェクトの内容を定義したものをクラスと呼びます。
クラスはオブジェクトの定義を書いただけなので、それ自身が動作するわけでは有りません。
(C言語の関数や変数のプロトタイプ宣言みたいなもの)
クラスを元にして実際に動作するもの(インスタンス)を作ります。
一つのクラスから複数のインスタンスを作る事が出来ます。

オブジェクトを使用したプログラムの利点としては次のようなものが有ります。
・オブジェクトの中でどんな処理をしているのかを知らなくてもオブジェクトを利用できます。
・大抵のプログラム言語では色々なクラスが定義されているので、既存のクラスだけでもかなりの事が出来ます。
・機能が足りない時でも足りない部分だけの追加で済みます。
・バグなどで、プログラムを修正する場合でも元のクラスを修正するだけで済みます。
 C言語で元の関数をコピーした関数が有る場合、全部を修正する必要が有ります。
 大規模なプログラムの場合、どれだけコピーされている関数が有るのか調べるのが大変な場合が有ります。
 
以下のサイトが参考になるでしょう。
http://www.rsch.tuis.ac.jp/~ohmi/software-intro/index.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20060921/248617/

投稿日時 - 2013-03-31 14:15:19

補足

他の回答を見たうえで自分なりの解釈です。
C言語は関数の集まったものがいわゆる私たちが作るプログラムで、
作ったプログラムはそれ単体で機能する。

それに比べてオブジェクト指向を用いたプログラムでは、
オブジェクトからクラスが生成、このクラスが一つのプログラムとなる。
クラスのプログラムをいくつも集めたものが最終的なソフトとなる。

Cだとミスを一か所直すと他のところを直す羽目になるかもしれませんが、
オブジェクト指向においてはミスをオブジェクト単位で修正するので、
他のオブジェクトへの影響度は少ない。
よってオブジェクト指向の方が拡張・修正などでも優れている。

こんな感じに解釈したのですがどうでしょうか?
オブジェクト指向では最終的なプログラムソフトはオブジェクトの集合体によって構成されているため、オブジェクト指向=オブジェクト中心の考えと言えるのでしょうか。

投稿日時 - 2013-04-12 01:39:35

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

かなり外してます。

プログラミングに限らず、規模の大きなものを作るには
設計を分割して個々に検討する「分割統治」という手法が
使われます。

「分割統治」を行うには、「分割」をどのように行うか
を考えなければなりませんが、様々な手法が存在します。

オブジェクト指向もその一つで、データの塊とその振る舞い
に着目して設計を行うのが特徴です。

オブジェクト指向は様々な技術、手法、哲学の集合体で、
その定義は人によって様々です。

私のお勧めの書籍は「オブジェクト指向入門 第2版」
1900ページの大著で、ぜんぜん入門ではないのですが、
よい本だと思います。

投稿日時 - 2013-04-02 18:20:48

ANo.4

オブジェクト指向プログラミングは「データに振る舞いを持たせてプログラム上をうろうろさせる様なプログラミングスタイル」というイメージでしょうか。
(あくまでイメージ的な表現で実際にメモリ上を移動する訳では有りません)
「データ」はCの構造体と言い換えても良いでしょう。

後述しますが、オブジェクト指向の概念とメリットはすぐに理解出来るものでは有りませんので、腰をすえて勉強されると良いと思います。
下記の書籍・サイトなども参考になるかと。

■ デザインパターンとともに学ぶオブジェクト指向のこころ
http://www.amazon.co.jp/dp/4894716844/

■ オブジェクト指向でなぜつくるのか 第2版
http://www.amazon.co.jp/dp/4822284654/

■ オブジェクト指向を正しく理解する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060921/248617/

■ 5分で絶対に分かるオブジェクト指向
http://www.atmarkit.co.jp/im/carc/special/fiveoo/00.html

■ オブジェクト指向は難しい - Matzにっき
http://www.rubyist.net/~matz/?date=20030729


> C言語が一つの大きなプログラムでできているとすると、
> Javaは細かいプログラムの集合体であると私は考えていました。

どちらかといえば、Javaも最終的には一つのプログラムとしてにまとめられるタイプですかね。(そうで無い場合も有りますが)
C言語でも部品としての関数を作り、階層的に関数から別の関数を呼出し、最終的にmain関数でまとめる感じですよね?それと同じ様に部品としてのクラスを作っていく感じです。もちろん、クラスの方がデータを保持できて複数のメソッドも持てるので、関数と比べればより独立性の高い部品を作ることが出来ますが。
ちなみに、COBOLなどは細かいプログラムの集合体としてシステムを構成する感じですね。


確か、荒井玲子さんがどこかで書かれていたと思いますが、オブジェクト指向の学習曲線の初めのほうは地を這うようで、最初の数ヶ月~数年ぐらい、分かった様な分からない様な期間が続いて、或る時スッと理解できる瞬間が来てから伸び始める様です。
確かに自分もそんな感じだったのを覚えています。
習うより慣れろとよく言いますが、悩むより、色々なプログラムを読んだり書いたりしていくうちに分かってくると思いますよ。

投稿日時 - 2013-03-31 13:19:50

ANo.3

ちょっと前にJavaを勉強してなんとなーく分かってきたかなーと思っている者です。

No.1、No.2 の方が仰っているのは今ならなんとなく分かるのですが、
半年前の私だったら意味がわからなかったと思います。

私は「オブジェクト脳のつくり方」という本を繰り返し読んでみた結果すこしイメージできてきたので、
よろしければ読んでみてください。

お互い頑張りましょう。


回答でなくてすみません。

投稿日時 - 2013-03-31 11:45:34

ANo.2

ハードウェアの世界には革命的な技術が沢山ありますが、ソフトウェアの世界ではオブジェクト指向が唯一の革命的技術かもしれません。

オブジェクト指向を取り入れた言語は沢山あります。
Cではオブジェクト指向は取り入れられていませんが、C++で取り入れられています。
今ではオブジェクト指向が無いものは考え難いくらいです。

オブジェクト指向は結構高度な理解力を必要とします。
すごく単純に書きますので、数年勉強して肉付けをして下さい。

まず、関数、サブルーチン、モジュール、色々な呼び方がありますが、プログラムを幾つかの部品に分けるわけですが、この分け方が難しいのです。
エラーが発生し難い、メインテナンスの容易性、生産性の高さ、が求められます。
その為には、機能的な独立性が望ましい訳です。
ところが機能的独立性だけを求めると、同じグループの機能に共通のデータが外部に流出して、情報の独立性が失われます。
そこで、オブジェクト指向では、共通の情報を使う機能群をクラス単位でまとめ、各独立した機能をメソッドで実現し、クラス外から見たら情報も機能も独立しているように見える訳です。
この独立性が眼目です。

投稿日時 - 2013-03-31 11:13:12

ANo.1

http://okwave.jp/qa/q6660148.html の私の回答No.4

投稿日時 - 2013-03-31 11:01:36

あなたにオススメの質問