logo

30 OOP 인터뷰 질문 및 답변 (2024)

객체 지향 프로그래밍(OOP)은 다음과 같은 개념을 구현하는 프로그래밍 패러다임입니다. 사물 프로그램에서. 프로그래밍에서 상속, 추상화, 다형성 등과 같은 실제 엔터티를 구현하여 실제 문제에 대한 더 쉬운 솔루션을 제공하는 것을 목표로 합니다. OOP 개념은 Java, Python, C++ 등과 같은 널리 사용되는 언어에서 널리 사용됩니다.

OOP 인터뷰 질문 및 답변

OOP는 프로그래밍 인터뷰에서 가장 중요한 주제 중 하나이기도 합니다. 이 글에는 일부 내용이 포함되어 있습니다. OOP 개념에 대한 주요 인터뷰 질문입니다.



OOP 인터뷰 질문

1. 객체 지향 프로그래밍(OOP)이란 무엇입니까?

영형 대상 영형 지향적인 프로그래밍 (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);>
씨#
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의 4가지 기둥 또는 기본 원칙이라고도 하는 OOP의 주요 특징은 다음과 같습니다.

  1. 캡슐화
  2. 데이터 추상화
  3. 다형성
  4. 계승
이런 기둥

OOP 주요 기능



6. 캡슐화란 무엇입니까?

캡슐화는 민감한 데이터가 사용자에게 숨겨지도록 데이터와 이를 조작하는 방법을 단일 단위로 바인딩하는 것입니다.
이는 아래와 같은 프로세스로 구현됩니다.

  1. 데이터 숨기기: 개체 구성원에 대한 액세스를 제한하는 언어 기능입니다. 예를 들어 C++의 private 및 protected 멤버입니다.
  2. 데이터와 방법을 함께 묶음: 데이터와 해당 데이터에서 작동하는 방법은 함께 번들로 제공됩니다. 예를 들어, 데이터 멤버와 이에 대해 작동하는 멤버 메서드는 클래스라는 단일 단위로 래핑됩니다.
캡슐화

7. 추상화란 무엇입니까?

추상화는 데이터 캡슐화와 유사하며 OOP에서 매우 중요합니다. 이는 필요한 정보만 표시하고 관련 없는 정보는 사용자에게 숨기는 것을 의미합니다. 추상화는 클래스와 인터페이스를 사용하여 구현됩니다.

OOP의 추상화

8. 다형성이란 무엇입니까?

단어 다형성 형태가 다양하다는 뜻이다. 상황에 따라 다르게 동작하는 것은 일부 코드의 속성입니다. 예를 들어, C++ 언어에서는 이름은 같지만 상황에 따라 작동이 다른 여러 함수를 정의할 수 있습니다.

다형성은 객체나 함수에 대한 호출이 해결되는 시점을 기준으로 두 가지 유형으로 분류할 수 있습니다. 그것들은 다음과 같습니다:

  • 컴파일 시간 다형성
  • 런타임 다형성

A) 컴파일 타임 다형성

정적 다형성 또는 초기 바인딩이라고도 하는 컴파일 시간 다형성은 해당 코드에 대한 호출 바인딩이 컴파일 시간에 수행되는 다형성 유형입니다. 메소드 오버로딩 또는 연산자 오버로딩은 컴파일 시간 다형성의 예입니다.

B) 런타임 다형성

동적 다형성 또는 후기 바인딩이라고도 하는 런타임 다형성은 함수의 실제 구현이 런타임 또는 실행 중에 결정되는 다형성 유형입니다. 메서드 재정의가 이 메서드의 예입니다.

9. 상속이란 무엇입니까? 그 목적은 무엇입니까?

상속의 개념은 간단합니다. 클래스는 다른 클래스에서 파생되며 해당 클래스의 데이터와 구현을 사용합니다. 파생된 클래스를 하위 클래스, 파생 클래스 또는 하위 클래스라고 하며 하위 클래스가 파생된 클래스를 상위 클래스, 기본 클래스 또는 슈퍼클래스라고 합니다.

상속의 주요 목적은 코드 재사용성을 높이는 것입니다. 또한 런타임 다형성을 달성하는 데에도 사용됩니다.

10. 접근 지정자란 무엇입니까? OOP에서 그것들의 중요성은 무엇입니까?

액세스 지정자는 클래스, 메서드 등과 같은 엔터티의 액세스 가능성을 지정하거나 제어하는 ​​데 사용되는 특별한 유형의 키워드입니다. 사적인 , 공공의 , 그리고 보호됨 액세스 지정자 또는 액세스 수정자의 예입니다.
OOP의 주요 구성 요소인 캡슐화 및 데이터 숨기기는 주로 이러한 액세스 지정자 때문에 달성됩니다.

bash는 구분 기호로 문자열을 분할합니다.

11. OOP의 장점과 단점은 무엇입니까?

OOP의 장점

OOP의 단점

OOP는 향상된 코드 재사용성을 제공합니다.OOP에서는 모든 것이 객체로 다루어지기 때문에 프로그래머는 능숙해야 하며 객체에 대한 뛰어난 사고력을 가지고 있어야 합니다.
코드는 유지 관리 및 업데이트가 더 쉽습니다.OOP는 약간 까다롭기 때문에 적절한 계획이 필요합니다.
데이터 액세스를 제한하고 불필요한 노출을 방지하여 더 나은 데이터 보안을 제공합니다.OOP 개념은 모든 종류의 문제에 적합하지 않습니다.
구현이 빠르고 재설계가 용이하여 전체 프로그램의 복잡성이 최소화됩니다.절차적 접근법에 비해 프로그램의 길이가 훨씬 길다.

12. OOP 외에 어떤 프로그래밍 패러다임이 존재합니까?

프로그래밍 패러다임은 프로그램을 작성하는 기술이나 접근 방식을 말합니다. 프로그래밍 패러다임은 다음과 같은 유형으로 분류될 수 있습니다.

프로그래밍 패러다임의 종류

1. 명령형 프로그래밍 패러다임

할당문을 통해 프로그램 상태를 변경하여 작동하는 프로그래밍 패러다임입니다. 이 패러다임의 주요 초점은 목표를 달성하는 방법에 있습니다. 다음 프로그래밍 패러다임이 이 범주에 속합니다.

  1. 절차적 프로그래밍 패러다임 : 이 프로그래밍 패러다임은 프로시저 호출 개념을 기반으로 합니다. 루틴 또는 함수라고도 알려진 프로시저는 이 패러다임에서 프로그램의 기본 구성 요소입니다.
  2. 객체 지향 프로그래밍 또는 OOP : 이 패러다임에서는 모든 엔터티를 객체로 시각화하고 해당 객체의 상태와 동작을 기반으로 프로그램을 구성하려고 합니다.
  3. 병렬 프로그래밍 : 병렬 프로그래밍 패러다임은 명령을 여러 개의 작은 부분으로 나누고 동시에 실행하여 명령을 처리하는 것입니다.

2. 선언적 프로그래밍 패러다임

선언적 프로그래밍은 어떻게 실행되어야 하는지보다는 무엇을 실행해야 하는지에 중점을 둡니다. 이 패러다임에서는 제어 흐름을 고려하지 않고 계산 논리를 표현합니다. 선언적 패러다임은 다음과 같이 더 분류될 수 있습니다.

  1. 논리 프로그래밍 패러다임 : 프로그램 명령문이 문제에 대한 사실과 규칙을 논리적인 형태로 표현하는 형식논리를 기반으로 합니다.
  2. 함수형 프로그래밍 패러다임 : 이러한 패러다임의 기능을 적용하고 구성하여 프로그램을 생성합니다.
  3. 데이터베이스 프로그래밍 패러다임 : 필드, 기록, 파일로 구성된 데이터와 정보를 관리하기 위해 데이터베이스 프로그래밍 모델을 활용합니다.

13. 구조적 프로그래밍과 객체 지향 프로그래밍의 차이점은 무엇입니까?

구조적 프로그래밍은 OOP의 선구자로 간주되는 기술이며 일반적으로 잘 구조화되고 분리된 모듈로 구성됩니다. 절차적 프로그래밍의 하위 집합입니다. OOP와 구조적 프로그래밍의 차이점은 다음과 같습니다.

객체 지향 프로그래밍

숫자의 알파벳

구조적 프로그래밍

객체 지향 프로그래밍은 상태와 동작을 갖는 객체를 기반으로 구축됩니다.프로그램의 논리적 구조는 프로그램을 해당 기능으로 나누는 구조적 프로그래밍에 의해 제공됩니다.
이는 아래에서 위로 접근하는 방식을 따릅니다.이는 하향식 접근 방식을 따릅니다.
더 나은 데이터 보안을 제공하기 위해 승인된 부분으로만 데이터의 공개 흐름을 제한합니다.데이터 흐름에 제한이 없습니다. 누구나 데이터에 접근할 수 있습니다.
다형성 및 상속 개념으로 인해 코드 재사용성이 향상되었습니다.코드 재사용성은 함수와 루프를 사용하여 달성됩니다.
여기서는 메소드가 전역적으로 작성되고 코드 라인이 하나씩 처리됩니다. 즉, 순차적으로 실행됩니다.여기서 메서드는 동적으로 작동하여 특정 시간 동안 코드 필요에 따라 호출을 수행합니다.
코드를 수정하고 업데이트하는 것이 더 쉽습니다.OOP에 비해 코드 수정이 어렵습니다.
OOP에서는 데이터의 중요성이 더 커집니다.코드가 더 중요해졌습니다.

14. 일반적으로 사용되는 객체 지향 프로그래밍 언어에는 어떤 것이 있습니까?

OOP 패러다임은 가장 널리 사용되는 프로그래밍 패러다임 중 하나입니다. 다음과 같은 널리 사용되는 프로그래밍 언어에서 널리 사용됩니다.

15. 다형성에는 어떤 유형이 있나요?

다형성은 객체나 함수에 대한 호출이 해결되는 시점을 기준으로 두 가지 유형으로 분류할 수 있습니다. 그것들은 다음과 같습니다:

  1. 컴파일 시간 다형성
  2. 런타임 다형성
다형성의 종류

다형성의 유형

A) 컴파일 타임 다형성

정적 다형성 또는 초기 바인딩이라고도 하는 컴파일 시간 다형성은 해당 코드에 대한 호출 바인딩이 컴파일 시간에 수행되는 다형성 유형입니다. 메소드 오버로딩 또는 연산자 오버로딩 컴파일 타임 다형성의 예입니다.

B) 런타임 다형성

또한 ~으로 알려진 동적 다형성 또는 런타임 다형성은 런타임 또는 실행 중에 함수의 실제 구현이 결정되는 다형성 유형입니다. 메소드 재정의 이 방법의 예입니다.

16. 오버로딩과 오버라이딩의 차이점은 무엇입니까?

컴파일 타임 다형성 기능은 다음과 같습니다. 과부하 엔터티가 동일한 이름의 수많은 구현을 가질 수 있습니다. 메소드 오버로딩과 연산자 오버로딩이 두 가지 예입니다.

재정의 이름은 같지만 구현이 다른 엔터티가 실행되는 런타임 다형성의 한 형태입니다. 가상 함수를 사용하여 구현됩니다.

17. 상속에 제한이 있나요?

예, 더 많은 권한을 가지면 더 많은 어려움이 있습니다. 상속은 매우 강력한 OOP 기능이지만 심각한 단점도 있습니다.

  • 구현하려면 여러 클래스를 거쳐야 하기 때문에 상속을 처리하는 데 시간이 더 오래 걸립니다.
  • 상속에 관여하는 기본 클래스와 자식 클래스도 서로 밀접하게 관련되어 있습니다(밀접 결합이라고 함). 따라서 변경이 필요한 경우 두 클래스 모두에서 동시에 변경해야 할 수도 있습니다.
  • 상속을 구현하는 것도 어려울 수 있습니다. 따라서 올바르게 구현되지 않으면 예상치 못한 실수나 부정확한 출력이 발생할 수 있습니다.

18. 상속에는 어떤 유형이 있습니까?

상속은 다음과 같이 5가지 유형으로 분류할 수 있습니다.

상속의 종류
  1. 단일 상속: 기본 클래스에서 직접 파생된 하위 클래스
  2. 다중 상속: 여러 기본 클래스에서 파생된 하위 클래스입니다.
  3. 다단계 상속: 다른 기본 클래스에서도 파생되는 클래스에서 파생된 하위 클래스입니다.
  4. 계층적 상속: 단일 기본 클래스에서 파생된 여러 하위 클래스입니다.
  5. 하이브리드 상속: 위에서 지정한 여러 상속 유형으로 구성된 상속입니다.

메모: 지원되는 상속 유형은 언어에 따라 다릅니다. 예를 들어 Java는 다중 상속을 지원하지 않습니다.

19. 인터페이스란 무엇입니까?

인터페이스라고 알려진 고유한 클래스 유형에는 메소드가 포함되어 있지만 해당 정의는 포함되어 있지 않습니다. 인터페이스 내에서는 메서드 선언만 허용됩니다. 인터페이스를 사용하여 객체를 만들 수는 없습니다. 대신 해당 인터페이스를 사용하고 이를 위한 절차를 지정해야 합니다.

20. 추상 클래스는 인터페이스와 어떻게 다릅니까?

추상 클래스와 인터페이스는 모두 메서드 구현이 아닌 메서드 선언만 포함하는 특수한 유형의 클래스입니다. 그러나 추상 클래스는 인터페이스와 완전히 다릅니다. 다음은 추상 클래스와 인터페이스 간의 몇 가지 주요 차이점입니다.

추상 클래스

상호 작용

그러나 추상 클래스가 상속되면 서브클래스가 실제로 추상 메소드를 사용하지 않는 한 서브클래스는 추상 메소드의 정의를 제공할 필요가 없습니다.인터페이스가 구현될 때 서브클래스는 인터페이스의 모든 메소드와 구현을 지정해야 합니다.
추상 클래스에는 추상 메서드와 비추상 메서드가 모두 있을 수 있습니다.인터페이스에는 추상 메서드만 있을 수 있습니다.
추상 클래스에는 최종, 비최종, 정적 및 비정적 변수가 있을 수 있습니다.인터페이스에는 정적 변수와 최종 변수만 있습니다.
추상 클래스는 다중 상속을 지원하지 않습니다.인터페이스는 다중 상속을 지원합니다.

21. 클래스는 얼마나 많은 메모리를 차지합니까?

클래스는 메모리를 사용하지 않습니다. 이는 단지 항목이 만들어지는 템플릿 역할을 할 뿐입니다. 이제 객체는 생성될 때 프로세스에서 메모리를 사용하여 클래스 멤버와 메서드를 실제로 초기화합니다.

22. 항상 클래스에서 객체를 생성해야 합니까?

아니요. 기본 클래스에 비정적 메서드가 포함된 경우 개체를 생성해야 합니다. 그러나 클래스에 정적 메서드가 포함되어 있으면 개체를 생성할 필요가 없습니다. 이 경우 클래스 이름을 사용하여 해당 정적 메서드를 직접 호출할 수 있습니다.

23. C++에서 구조와 클래스의 차이점은 무엇입니까?

구조는 다음과 같은 차이점을 제외하고 클래스와 유사한 C++의 사용자 정의 데이터 유형이기도 합니다.

  • 구조와 클래스의 주요 차이점은 구조에서는 멤버가 기본적으로 공개로 설정되는 반면 클래스에서는 멤버는 기본적으로 비공개로 설정된다는 것입니다.
  • 또 다른 차이점은 우리가 사용한다는 것입니다 구조체 구조 선언을 위한 수업 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. 클래스에서 소멸자를 오버로드할 수 있나요?

아니요. 소멸자는 클래스에 오버로드될 수 없습니다. 클래스에는 하나의 소멸자만 있을 수 있습니다.

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++에서 추상 클래스는 하나 이상의 순수 가상 함수를 포함하는 클래스입니다.

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++ 인터뷰 질문