1. ホーム
  2. java

[解決済み] オブジェクト指向言語と非オブジェクト指向言語の違いは何ですか?

2022-02-18 10:13:46

質問内容

Cは非オブジェクト指向言語、javaはオブジェクト指向言語という話を聞いたことがあります。どう違うのでしょうか?

どのように解決するのですか?

うわー、この人には大きなOOP用語がたくさん飛び交ってる。手続き型プログラミングから始めて、今はほとんどOOPをやっている者としては、この違いを概念的にどう考えるかです(大きな用語は抜きにして)。

C言語では、状態を保持することができる構造体というものがあります。例えば、Carという構造体を用意して、Carsのインスタンスを作成し、make、model、colorのフィールドを設定することができます。しかし、Car構造体のインスタンスに何かをするように指示することはできません。その代わり、洗車をしたければ、このように外部関数にCarインスタンスを渡す必要があります。

WashMyCar(myCar);

OOP言語では、構造体とは異なるクラスという概念が使われており、オブジェクトはそのクラスのインスタンスです。継承とかポリモーフィズムとかいう大げさな言葉は今は忘れてください(これらはクラスがなんとなくわかるようになると、もっと高度な話になります)。車の例で考えてみましょう。例えばJavaでは、Carというクラスをこのように定義することができます。

public class Car {
  String make;
  String model;
  String color;
}

そして、こんな風に車のインスタンスを作ります。

Car myCar = new Car();
myCar.make = "Honda";
myCar.model = "Accord";
myCar.color = "Black";

これは構造体と同じようなものです。さて、OOPが異なるのは、クラスの定義を拡張してクラスメソッドを定義できることです。クラスメソッドは、常にオブジェクトに対して操作することを除けば、手続き型の関数に似ています。では、washメソッドを追加してみましょう。

public class Car {
  String make;
  String model;
  String color;
  String condition;
  void washMe() {
    this.condition = "clean";
  }
  void goOffroad() {
    this.condition = "dirty";
  }
}

これで、こんなことができるようになりました。

Car myCar = new Car();
myCar.make = "Honda";
myCar.model = "Accord";
myCar.color = "Black";

myCar.goOffroad();
System.out.println(myCar.condition); // dirty
myCar.washMe();
System.out.println(myCar.condition); // clean

この例がお役に立てば幸いです。もちろん、OOP(および手続き型)には、この単純な例よりもはるかに多くのことがあります。しかし、核となる違いは、自分自身のメソッドを持つオブジェクトのクラスを持つことです。