logo

30 の OOP インタビューの質問と回答 (2024)

オブジェクト指向プログラミング (OOP) は、次の概念を実装するプログラミング パラダイムです。 オブジェクト プログラム内で。プログラミングで継承、抽象化、ポリモーフィズムなどの実世界のエンティティを実装することで、実世界の問題に対するより簡単な解決策を提供することを目的としています。 OOP の概念は、Java、Python、C++ などの多くの一般的な言語で広く使用されています。

Javaの比較可能な文字列
OOP インタビューの質問と回答

OOP は、プログラミング面接で最も重要なトピックの 1 つでもあります。この記事にはいくつかの内容が含まれています OOPs の概念に関するインタビューでよく聞かれる質問。



OOP の面接での質問

1. オブジェクト指向プログラミング (OOP) とは何ですか?

オブジェクト 方向性のある P プログラミング (OOP とも呼ばれる) は、完全なソフトウェアが相互に通信する多数のオブジェクトとして動作するプログラミング パラダイムです。オブジェクトは、データとそのデータを操作するメソッドのコレクションです。

2. なぜ OOP なのか?

OOP の主な利点は、以下をカバーするコードがより管理しやすいことです。

  1. 開発者が話す言語とユーザーが話す言語との距離が離れるほど、ソフトウェアに対する全体的な理解が深まります。
  2. オブジェクト指向では、カプセル化を使用することでメンテナンスが容易になります。メソッドを同じにしておけば、基礎となる表現を簡単に変更できます。
  3. OOP パラダイムは主に、比較的大きなソフトウェアに役立ちます。

3. クラスとは何ですか?

クラス はオブジェクト指向プログラムの構成要素です。これは、データ メンバーと、データ メンバー上で動作するメンバー関数を含むユーザー定義のデータ型です。これは、共通のプロパティとメソッドを持つオブジェクトの青写真またはテンプレートのようなものです。



4. オブジェクトとは何ですか?

アン 物体 クラスのインスタンスです。クラスのデータ メンバーとメソッドを直接使用することはできません。これらを使用するには、クラスのオブジェクト (またはインスタンス) を作成する必要があります。簡単に言うと、状態と動作を持つ現実世界の存在です。

C++
#include  using namespace std; // defining class class Student { public:  string name; }; int main() {  // creating object  Student student1;  // assigning member some value  student1.name = 'Rahul';  cout << 'student1.name: ' << student1.name;  return 0; }>
ジャワ
// class definition class Student {  String name; } class GfG {  public static void main(String args[])  {  // creating an object  Student student1 = new Student();  // assigning member some value  student1.name = 'Rahul';  System.out.println('student1.name: ' + student1.name);  } }>
パイソン
# class definition class Student: name = '' # creating object student1 = Student() student1.name = 'Rahul'; print('student1.name: ' + student1.name);>
C#
using System; // defining class public class Student {  public string name; } public class GFG {  static public void Main()  {  // creating object  Student student1 = new Student();  student1.name = 'Rahul';  Console.WriteLine('student1.name: ' + student1.name);  } }>

出力
student1.name: Rahul>

5. OOP の主な機能は何ですか?

OOP の主な特徴は、OOP の 4 つの柱または基本原則とも呼ばれ、次のとおりです。

  1. カプセル化
  2. データの抽象化
  3. ポリモーフィズム
  4. 継承
おっとの柱

OOP の主な機能



6. カプセル化とは何ですか?

カプセル化とは、機密データがユーザーから隠されるように、データとそれらを操作するメソッドを 1 つのユニットに結合することです。
以下のようなプロセスで実装されます。

  1. データの隠蔽: オブジェクトのメンバーへのアクセスを制限する言語機能。たとえば、C++ のプライベート メンバーと保護されたメンバーです。
  2. データとメソッドのバンドル: データとそのデータを操作するメソッドがバンドルされています。たとえば、データ メンバーとそれらを操作するメンバー メソッドは、クラスと呼ばれる単一のユニットにラップされます。
カプセル化

7. 抽象化とは何ですか?

抽象化はデータのカプセル化に似ており、OOP では非常に重要です。これは、必要な情報のみを表示し、その他の無関係な情報をユーザーから隠すことを意味します。抽象化はクラスとインターフェイスを使用して実装されます。

OOP の抽象化

8. ポリモーフィズムとは何ですか?

言葉 ポリモーフィズム 形がたくさんあるという意味です。一部のコードは、コンテキストごとに動作が異なるという特性があります。たとえば、C++ 言語では、同じ名前を持つ複数の関数を定義できますが、コンテキストに応じて動作が異なります。

ポリモーフィズムは、オブジェクトまたは関数の呼び出しが解決される時間に基づいて 2 つのタイプに分類できます。それらは次のとおりです。

  • コンパイル時のポリモーフィズム
  • ランタイムポリモーフィズム

A) コンパイル時のポリモーフィズム

コンパイル時多態性 (静的多態性または早期バインディングとも呼ばれます) は、コードへの呼び出しのバインドがコンパイル時に行われる多態性のタイプです。メソッドのオーバーロードや演算子のオーバーロードは、コンパイル時のポリモーフィズムの例です。

B) 実行時ポリモーフィズム

動的ポリモーフィズムまたは遅延バインディングとも呼ばれるランタイム ポリモーフィズムは、関数の実際の実装がランタイムまたは実行中に決定されるタイプのポリモーフィズムです。メソッドのオーバーライドは、このメソッドの例です。

9. 継承とは何ですか?その目的は何ですか?

継承の考え方は単純で、クラスは別のクラスから派生し、その別のクラスのデータと実装を使用します。派生されたクラスは子クラス、派生クラス、またはサブクラスと呼ばれ、子クラスの派生元のクラスは親クラス、基本クラス、またはスーパークラスと呼ばれます。

継承の主な目的は、コードの再利用性を高めることです。ランタイムポリモーフィズムを実現するためにも使用されます。

10. アクセス指定子とは何ですか? OOP におけるそれらの重要性は何ですか?

アクセス指定子は、クラスやメソッドなどのエンティティのアクセシビリティを指定または制御するために使用される特殊なタイプのキーワードです。 プライベート 公共 、 そして 保護されています は、アクセス指定子またはアクセス修飾子の例です。
OOP の主要なコンポーネントであるカプセル化とデータ隠蔽は、主にこれらのアクセス指定子によって実現されます。

11. OOP の長所と短所は何ですか?

OOP の利点

OOP の欠点

OOP はコードの再利用性を強化します。OOP ではすべてがオブジェクトとして扱われるため、プログラマーは十分なスキルを持ち、オブジェクトに関して優れた思考力を持っている必要があります。
コードの保守と更新が容易になります。OOP は少し難しいため、適切な計画が必要です。
データ アクセスを制限し、不必要な公開を回避することで、データ セキュリティが向上します。OOP の概念は、あらゆる種類の問題に適しているわけではありません。
実装が速く、再設計が容易なため、プログラム全体の複雑さが最小限に抑えられます。プログラムの長さは、手続き型アプローチに比べてはるかに長くなります。

12. OOP 以外にどのようなプログラミング パラダイムが存在しますか?

プログラミング パラダイムは、プログラムを作成する技術またはアプローチを指します。プログラミング パラダイムは次のタイプに分類できます。

プログラミングパラダイムの種類

1. 命令型プログラミングパラダイム

これは、代入ステートメントを通じてプログラムの状態を変更することで動作するプログラミング パラダイムです。このパラダイムの主な焦点は、目標を達成する方法にあります。次のプログラミング パラダイムがこのカテゴリに分類されます。

  1. 手続き型プログラミングのパラダイム : このプログラミング パラダイムは、プロシージャ コールの概念に基づいています。ルーチンまたは関数としても知られるプロシージャは、このパラダイムにおけるプログラムの基本的な構成要素です。
  2. オブジェクト指向プログラミングまたは OOP : このパラダイムでは、すべてのエンティティをオブジェクトとして視覚化し、そのオブジェクトの状態と動作に基づいてプログラムを構築しようとします。
  3. 並列プログラミング : 並列プログラミング パラダイムは、命令を複数の小さな部分に分割し、同時に実行することによって命令を処理することです。

2. 宣言型プログラミングのパラダイム

宣言型プログラミングでは、どのように実行するかではなく、何を実行するかに焦点を当てます。このパラダイムでは、制御フローを考慮せずに計算のロジックを表現します。宣言的パラダイムはさらに次のように分類できます。

  1. 論理プログラミングパラダイム : これは、プログラム ステートメントが問題に関する事実とルールを論理形式で表現する形式論理に基づいています。
  2. 関数型プログラミングのパラダイム : このパラダイムの関数を応用して合成することでプログラムが作成されます。
  3. データベースプログラミングパラダイム : フィールド、レコード、ファイルとして編成されたデータと情報を管理するには、データベース プログラミング モデルが利用されます。

13. 構造化プログラミングとオブジェクト指向プログラミングの違いは何ですか?

構造化プログラミングは OOP の前身と考えられている技術で、通常は適切に構造化された分離されたモジュールで構成されます。これは手続き型プログラミングのサブセットです。 OOP と構造化プログラミングの違いは次のとおりです。

Javaで文字列をintに変換する方法

オブジェクト指向プログラミング

構造プログラミング

オブジェクト指向のプログラミングは、状態と動作を持つオブジェクトに基づいて構築されます。プログラムの論理構造は、プログラムを対応する機能に分割する構造プログラミングによって提供されます。
これは下から上へのアプローチに従います。これはトップツーダウンのアプローチに従います。
データのオープン フローを許可された部分のみに制限し、データ セキュリティを強化します。データの流れに制限はありません。誰でもデータにアクセスできます。
ポリモーフィズムと継承の概念によりコードの再利用性が強化されました。コードの再利用性は、関数とループを使用することで実現されます。
この場合、メソッドはグローバルに記述され、コード行は 1 つずつ処理されます。つまり、順次実行されます。この場合、メソッドは動的に動作し、一定期間のコードの必要に応じて呼び出しを行います。
コードの変更と更新が簡単になります。OOP に比べてコードの変更は困難です。
OOP ではデータがより重要視されます。コードがより重要視されます。

14. 一般的に使用されるオブジェクト指向プログラミング言語にはどのようなものがありますか?

OOP パラダイムは、最も人気のあるプログラミング パラダイムの 1 つです。これは、次のような多くの人気のあるプログラミング言語で広く使用されています。

  • C++
  • ジャワ
  • パイソン
  • JavaScript
  • C#
  • ルビー

15. ポリモーフィズムにはどのような種類がありますか?

ポリモーフィズムは、オブジェクトまたは関数の呼び出しが解決される時間に基づいて 2 つのタイプに分類できます。それらは次のとおりです。

  1. コンパイル時のポリモーフィズム
  2. ランタイムポリモーフィズム
ポリモーフィズムの種類

ポリモーフィズムの種類

A) コンパイル時のポリモーフィズム

コンパイル時多態性 (静的多態性または早期バインディングとも呼ばれます) は、コードへの呼び出しのバインドがコンパイル時に行われる多態性のタイプです。 メソッドのオーバーロード または 演算子のオーバーロード はコンパイル時のポリモーフィズムの例です。

B) 実行時ポリモーフィズム

としても知られている 動的多態性 実行時ポリモーフィズムは、実行時または実行中に関数の実際の実装が決定されるタイプのポリモーフィズムです。 メソッドのオーバーライド はこの方法の一例です。

16. オーバーロードとオーバーライドの違いは何ですか?

と呼ばれるコンパイル時のポリモーフィズム機能 過負荷 エンティティが同じ名前の多数の実装を持つことができます。メソッドのオーバーロードと演算子のオーバーロードが 2 つの例です。

オーバーライド これは、名前は同じだが実装が異なるエンティティが実行されるランタイムポリモーフィズムの一種です。これは仮想関数を使用して実装されます。

17. 継承に制限はありますか?

はい、 より多くの権限を持っていると、より多くの課題が発生します。継承は非常に強力な OOP 機能ですが、重大な欠点もあります。

  • 実装するには複数のクラスを通過する必要があるため、継承の処理には時間がかかります。
  • 継承を行う基本クラスと子クラスも互いに密接に関連しています (密結合と呼ばれます)。したがって、変更を行う必要がある場合は、両方のクラスで同時に変更を行う必要がある場合があります。
  • 継承の実装も難しいかもしれません。したがって、正しく実装されていない場合、予期しない間違いや不正確な出力が発生する可能性があります。

18. 継承にはどのような種類がありますか?

相続は以下の5種類に分類できます。

Javaでのリストの例
継承の種類
  1. 単一の継承: 基本クラスから直接派生した子クラス
  2. 多重継承: 複数の基本クラスから派生した子クラス。
  3. 多レベルの継承: 別の基本クラスから派生したクラスから派生した子クラス。
  4. 階層的な継承: 単一の基本クラスから派生した複数の子クラス。
  5. ハイブリッド継承: 上記で指定された複数の継承タイプで構成される継承。

注記: サポートされる継承のタイプは言語によって異なります。たとえば、Java は多重継承をサポートしていません。

19. インターフェースとは何ですか?

インターフェイスと呼ばれる固有のクラス タイプにはメソッドが含まれますが、その定義は含まれません。インターフェイス内では、メソッド宣言のみが許可されます。インターフェイスを使用してオブジェクトを作成することはできません。代わりに、そのインターフェイスを使用し、そのための手順を指定する必要があります。

20. 抽象クラスはインターフェイスとどう違うのですか?

抽象クラスと抽象インターフェイスは両方とも、メソッドの実装ではなく、メソッドの宣言のみを含む特殊なタイプのクラスです。ただし、抽象クラスはインターフェイスとは完全に異なります。以下に、抽象クラスとインターフェイスの主な違いをいくつか示します。

抽象クラス

インターフェース

ただし、抽象クラスが継承される場合、サブクラスが実際に使用するまでは、抽象メソッドの定義を提供する必要はありません。インターフェイスが実装される場合、サブクラスはインターフェイスのすべてのメソッドとその実装を指定する必要があります。
抽象クラスは、抽象メソッドと非抽象メソッドの両方を持つことができます。インターフェイスには抽象メソッドのみを含めることができます。
抽象クラスには、最終変数、非最終変数、静的変数、および非静的変数を含めることができます。インターフェイスには静的変数と最終変数のみがあります。
抽象クラスは多重継承をサポートしていません。インターフェイスは多重継承をサポートします。

21. クラスはどのくらいのメモリを占有しますか?

クラスはメモリを使用しません。これらは単にアイテムを作成するためのテンプレートとして機能します。現在、オブジェクトは作成時に、プロセス内でメモリを使用してクラス メンバーとメソッドを実際に初期化します。

22. 常にクラスからオブジェクトを作成する必要がありますか?

いいえ。 基本クラスに非静的メソッドが含まれている場合は、オブジェクトを構築する必要があります。ただし、クラスに静的メソッドが含まれている場合は、オブジェクトを生成する必要はありません。この場合、クラス名を使用してこれらの静的メソッドを直接呼び出すことができます。

23. C++ における構造体とクラスの違いは何ですか?

この構造体もクラスと同様の C++ のユーザー定義データ型ですが、次の点が異なります。

  • 構造体とクラスの主な違いは、構造体ではメンバーがデフォルトでパブリックに設定されるのに対し、クラスではメンバーがデフォルトでプライベートであることです。
  • もう 1 つの違いは、次のことを使用することです。 構造体 構造を宣言するためと、 クラス C++ でクラスを宣言するためのものです。

24. コンストラクターとは何ですか?

コンストラクターは、新しく作成されたオブジェクトを初期化するコードのブロックです。コンストラクターはインスタンス メソッドに似ていますが、戻り値の型がないためメソッドではありません。通常、これはクラスと同じ名前のメソッドですが、言語によっては異なる場合があります。例えば:

Python では、コンストラクターには次のような名前が付けられます。 __熱い__。

C++ および Java では、コンストラクターの名前はクラス名と同じです。

例:

C++
class base {  public:  base() { cout << 'This is a constructor'; } }>
ジャワ
class base {  base() { System.out.printIn('This is a constructor'); } }>
パイソン
class base: def __init__(self): print('This is a constructor')>

25. C++ のさまざまなタイプのコンストラクターとは何ですか?

コンストラクターの最も一般的な分類には次のものがあります。

  1. デフォルトのコンストラクター
  2. パラメータ化されていないコンストラクター
  3. パラメータ化されたコンストラクタ
  4. コピーコンストラクター

1. デフォルトのコンストラクター

デフォルトのコンストラクターは、引数をとらないコンストラクターです。これは、明示的なコンストラクター定義が指定されていない場合にコンパイラーによって自動的に定義される、パラメーター化されていないコンストラクターです。

データ メンバーをデフォルト値に初期化します。

2. パラメータ化されていないコンストラクター

これは、引数やパラメータを持たないユーザー定義のコンストラクターです。

例:

C++
class base {  base()  {  cout << 'This is a non-parameterized contructor';  } }>
ジャワ
class base {  base()  {  System.out.printIn(  'This is a non-parameterized constructor.');  } }>
パイソン
class base: def __init__(self): print('This is a non-parameterized constructor')>

3. パラメータ化されたコンストラクタ

いくつかの引数を取るコンストラクターは、パラメーター化されたコンストラクターと呼ばれます。

工場設計パターン

例:


C++
class base { public:  int base;  base(int var)  {  cout << 'Constructor with argument: ' << var;  } };>
ジャワ
class base {  int base;  base(int a)  {  System.out.println('Constructor with argument: '  + a);  } }>
パイソン
class base: def __init__(self, a): print('Constructor with argument: {}'.format(a))>

4. コンストラクターのコピー

コピー コンストラクターは、同じクラスの別のオブジェクトを使用してオブジェクトを初期化するメンバー関数です。

例:

C++
class base {  int a, b;  base(base& obj) // copy constructor  {  a = obj.a;  b = obj.b;  } }>
ジャワ
class base {  int a, b;  base(base obj) // copy constructor  {  a = obj.a;  b = obj.b;  } }>


Python には、Java や C++ のような組み込みのコピー コンストラクターはありませんが、別の方法を使用して回避策を作成できます。

26. デストラクターとは何ですか?

デストラクターは、オブジェクトがスコープで作成されたり破棄されたりするときに自動的に呼び出されるメソッドです。

C++ では、デストラクター名もクラス名と同じですが、( ) チルダ記号 接頭語として。

Python では、デストラクターの名前は次のとおりです。 __のうち__

例:

C++
class base { public:  ~base() { cout << 'This is a destructor'; } }>
パイソン
class base: def __del__(self): print('This is destructor')>


Java では、ガベージ コレクターが不要なオブジェクトを自動的に削除するため、Java にはデストラクターの概念がありません。 Java デストラクターの回避策として Finalize() メソッドを使用することもできましたが、これも Java 9 以降は非推奨になりました。

27. クラス内でコンストラクターをオーバーロードできますか?

はい、Java のクラスでコンストラクターをオーバーロードできます。コンストラクターのオーバーロードは、異なるパラメーター (数値と型) を持つ別のコンストラクターを使用するコンストラクターが必要な場合に行われます。

28. クラス内でデストラクターをオーバーロードできますか?

いいえ。クラス内でデストラクターをオーバーロードすることはできません。クラス内に存在できるデストラクターは 1 つだけです。

29. 仮想関数とは何ですか?

仮想関数は、派生クラスで親クラスのメソッドをオーバーライドするために使用される関数です。クラスに抽象化を提供するために使用されます。

C++ では、仮想関数は virtual キーワードを使用して宣言されます。

Java では、すべてのパブリック、非静的、非最終メソッドは仮想関数です。

Python メソッドは常に仮想です。

例:

C++
class base {  virtual void print()  {  cout << 'This is a virtual function';  } }>
ジャワ
class base {  void func()  {  System.out.printIn('This is a virtual function')  } }>
パイソン
class base: def func(self): print('This is a virtual function')>

30. 純粋仮想関数とは何ですか?

抽象関数とも呼ばれる純粋仮想関数は、ステートメントを含まないメンバー関数です。この関数は、必要に応じて派生クラスで定義されます。

例:

C++
class base {  virtual void pureVirFunc() = 0; }>
ジャワ
abstract class base {  abstract void prVirFunc(); }>


Python では、ABC (Abstract Base Class) モジュールの @abstractmethod を使用してこれを実現します。

一般保護違反

ボーナスの質問

抽象クラスとは何ですか?

一般的に、抽象クラスとは、継承に使用することを目的としたクラスです。インスタンス化することはできません。抽象クラスは、抽象メソッドと非抽象メソッドの両方で構成できます。

C++ では、抽象クラスは、少なくとも 1 つの純粋仮想関数を含むクラスです。

Java では、抽象クラスは次のように宣言されます。 抽象的な キーワード。

例:

C++
class absClass { public:  virtual void pvFunc() = 0; }>
ジャワ
abstract class absClass {  // body }>


Python では、ABC (Abstract Base Class) モジュールを使用して抽象クラスを作成します。

必ず参照してください:

  1. C++ の OOP
  2. Java の OOP
  3. Python の OOP
  4. C++ のクラスとオブジェクト
  5. Java のクラスとオブジェクト
  6. Python のクラスとオブジェクト
  7. プログラミングパラダイムの概要
  8. Javaのインターフェース
  9. Javaの抽象クラス
  10. C++ の面接での質問