質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

5回答

31135閲覧

「手続き型プログラミング」と「オブジェクト(指向)型プログラミング」の違いについて

mr0237

総合スコア164

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

5クリップ

投稿2017/04/15 08:11

JAVAのオブジェクト指向を勉強・練習している者です。

説明が下手ですいませんが、「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P281)「手続き型プログラミングとの違い」のところを復習を兼ねて読み直しているのですが、「手続き型プログラミング」とは

コンピュータがどのように動けばよいかという手順を考え、プログラムの先頭から順番に命令として記述していく方法です。

と書かれているのですが、JAVAも、同じようにプログラムの先頭から順番に命令として記述していき、実行していくと私は思うんですが、(違っていたらすいません)オブジェクト型プログラミング手続き型プログラミング厳密には何がどう違うのでしょうか?

又、オブジェクト型手続き型ではコンピュータ上ではどう動くのですか?

例えばオブジェクト型コンピュータ上ではクラスのソースコードをコンピュータのメモリ上に展開するのですが、手続き型コンピュータ上ではどう動くのでしょうか?

わかりやすく教えてくれませんか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

「オブジェクト指向型言語」と「手続き型言語」の区分は、論者によっても違ってきます。

  1. 言語として「メソッド」が登場しない、C言語のような言語だけが手続き型言語
  2. メソッド以外の関数・コードが書ける、PHPやC++のような言語も手続き型言語に含まれる
  3. Javaのような、「メソッドの中身を手続き型で書いていく」言語も手続き型言語に区分する

Javaの場合、すべてのコードは何かしらのメソッドとしてオブジェクトに属させるしかありませんが、メソッド内部では実行することを順に書いていくという、手続き型の概念で成立しています。

一方で、「手続き型でない」プログラミングパラダイムとしては、以下のようなものがあります。

  • 副作用のない関数を組み合わせてプログラムを構築する「関数型言語」
  • 解が満たすべき条件だけを与えて、実際の算出はエンジンに任せる、「制約型言語」(SQLもこの部類です)

(たまに特殊なCPUがありますが)ふつうのコンピュータは「オブジェクトは何か」ということを認識できません。実際に実行する命令は「このアドレスに何を書き込む」とか「このメモリに入っているコードに飛ぶ」といった、ごく簡単な機能のものばかりです(C++のコンパイラは、オブジェクト指向で書かれたコードを、このような形に変換します)。アセンブラといって、実際の機械語を人間が読み書きしやすい形にもできますが、大きなプログラムをアセンブラで直接書くのは現実的ではありません。

一方、Javaのコードは直接マシンで実行するのではなく、Java仮想マシンの上で動きます。この仮想マシンはオブジェクトの概念を理解して動作します。

投稿2017/04/15 08:33

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

Javaのクラスはメソッド(関数の一種)を持っています。
そして、関数は「その関数がどのように動けばよいかという手順を考え、関数の先頭から順番に命令として記述していく方法です。」
つまり、関数=手続き型プログラミングと言っても良いです。

一般に関数は何らかのデータを取り扱います。そして、複数の関数が1つのデータの塊を操作することにより、何らかの機能を実現することは多いです。(良く出てくる例では、線形リストやソートなどなど)
それらをひとかたまりとしてプログラミングすることが「オブジェクト指向型プログラミング」の本質と思います。関数=手続きだけでなくデータ構造もセットにするという考え方です。(人によって捉え方は異なります。もう少し様々な機能を使わないとオフジェクト指向とは言えないと言う人もいるかも知れません。)

そして、C言語のような手続き型言語でも、データ領域の獲得と初期化、その領域の解放、それぞれのデータを使って駆動する関数群を定義することはできますし、やっている人は多いです。メジャーなものではlinuxのカーネルなど。
しかし、それらをまとめるための統一的な方法がなく、プリフィックス等の付け方を決めてプログラマが個別に用意します。その実現方法も様々な方法があるので、様々な仕組みが存在しメンテナンスする人はたいへんです。

これに対して、データ構造と関数をまとめてクラスとして定義し、一貫した方法で記述できるような支援のある言語がオブジェクト指向型言語です。そして、現代の多くのオブジェクト指向型言語の考え方はかなり似通っているので、1つのオブジェクト指向型言語を学べば、その知識を他の同様な言語に活かしやすいです。

投稿2017/04/15 08:43

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mr0237

2017/04/16 01:53

すいません「関数」は「命令文みたいなもの」の感じでいいのでしょうか?
Chironian

2017/04/16 04:34

「命令文みたいなもの」の意味が良く分かりませんが、関数は式の中に出てくるものです。int a=foo(b)+123;と言う文が有る時、「foo(b)+123」が式で、foo(b)が関数foo()の呼び出しです。そして、関数foo()は別途定義します。
mr0237

2017/04/16 07:59

すいません。つまり関数は,「処理をひとまとめに定義する」みたいな感じでしょうか?
Chironian

2017/04/16 08:06

その通りです。
guest

0

ベストアンサー

オブジェクト指向と手続き型は相反するものではありません。大雑把に述べれば、オブジェクト指向プログラミングはマクロな考え方、手続き型はミクロな考え方のプログラミングです。

javaでもすべての処理をMainメソッド内に記述しても文法上の誤りはないです。ただし、こうなるともうオブジェクト志向と呼ぶより手続き型に近いものになってしまします。そもそも、オブジェクト指向言語であっても、ソースを書き下す過程は手続き型の考え方が必要です。

逆にC言語(C++やObjective Cは含まない)の中でも、構造体とポインタを駆使し、独自ルールをチーム内で作っていけばオブジェクト指向に相当するプログラミングもできるはずです。

投稿2017/04/15 11:23

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mr0237

2017/04/16 01:33

すいません。「オブジェクト指向プログラミングはマクロな考え方、手続き型はミクロな考え方」とはどういうことでしょうか?
swordone

2017/04/16 03:39

横から失礼します。 マクロ:巨視的、ミクロ:微視的というのはわかりますでしょうか。 砕いていうなら、マクロ:全体的に見た感じ、ミクロ:細部を見た感じ です。 オブジェクト指向は全体で見たときにオブジェクトというデータと処理をまとめた大きな括りを使って、その関わり合いでプログラミングするという、全体視点からの考え方です。 その細部を見ていくと、質問者様の言う通り、上から下に順に処理する手続き型となっています。
HogeAnimalLover

2017/04/16 04:19

はい。大体そんな感じです。 オブジェクト指向プログラミングでは「処理の単位をオブジェクトと呼ばれる単位レベルで考える」ことをベースとしています。ただし、これも突き詰めればjavaVM上での処理レベルの集まりですので、ソースを書き下す段階では手続き型でもあるということになります。
guest

0

他の方も述べられているように別物って訳じゃないですね。

ある時、手続型hogehoge があらわれた。
いま、オブジェクト指向hogehoge に進化した。
って感じでしょか。

要するにできることが増えたってことスな。
個人的には間に 構造化hogehoge を入れたいところ。
こういう連綿と連なっている変化をながめると
なぜそのような形で現在に至るかが分かりやすいと思ってます。

投稿2017/04/15 14:46

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

オブジェクト指向型プログラミングと、手続き型プログラミングの厳密な違いについては、「オブジェクト指向プログラミングとは~」といった結論の出ない問いを土台にしており、回答することは難しいです。

せいぜい、Javaはオブジェクト指向型、Cは手続き型、のようにプログラミング言語で「やんわり」理解するのがよいでしょう。

オブジェクト型と手続き型ではコンピュータ上ではどう動くのですか?

この問いに対しての直接的な回答は「コンピュータ上での動きに違いはない」です。
現行のコンピュータはすべてノイマン型コンピュータであり、その動作はプログラム言語の違いによってなんら影響を受けません。

オブジェクト型はコンピュータ上ではクラスのソースコードをコンピュータのメモリ上に展開する

コンピュータのメモリ上にどのようにプログラムを展開するかは各言語のコンパイラなりに依存しており、オブジェクト指向型だから~といった決まりはありません。

オブジェクト指向型とか手続き型とは、プログラムを作る上での方法論のことです。
なので、最初のステップとしては Java 言語でプログラミングをしているのであれば(とりあえず)オブジェクト指向型でプログラムを組んでいると考えて先に進めばよいでしょう。

投稿2017/04/15 09:59

koko_u

総合スコア936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問