다형성 대 상속: 다형성과 상속의 차이점 [2022]

게시 됨: 2021-01-05

다형성과 상속은 모두 객체 지향 프로그래밍의 매우 기본적인 개념입니다. 현대 프로그래밍 언어에 객체를 추가함으로써 우리가 언어를 사용하는 방식과 그 객체로 할 수 있는 일에 상당한 차이가 생겼습니다. 간단히 말해서, 객체 지향 프로그래밍은 프로그래머가 클래스를 사용하여 이러한 클래스를 기반으로 객체를 파생할 수 있도록 하는 일련의 메서드입니다.

실제 엔티티와 유사하고 프로그래머가 코드를 작성하는 패러다임을 포함하는 코드를 쉽게 만들 수 있도록 하는 것을 목표로 합니다. 본질적으로 네 가지 객체 지향 프로그래밍 개념, 즉 상속, 추상화, 다형성 및 캡슐화가 있습니다. 이제 앞에서 언급한 각 아이디어는 모든 현대 언어가 서 있는 기둥으로 생각할 수 있습니다.

다형성 대 상속 및 박쥐의 권리에 대한 주제로 돌아가서 두 개념 사이에 눈에 띄는 차이가 있음을 알 수 있습니다. 상속은 코드가 같거나 다른 프로그램에서 다시 재사용될 수 있도록 하는 개념입니다. 우리가 좋아하는 것은 유지하고 달성하려는 작업에 유용하지 않은 것은 버려서 코드가 작동하는 방식을 변경할 수도 있습니다. 상속은 오늘날 우리가 디지털 디스플레이에서 보는 거의 모든 것을 개발하는 데 많은 시간을 절약합니다.

반면에 다형성은 이미 작성된 코드를 지시하고 특정 매개변수를 기반으로 실시간으로 어떤 종류의 코드를 실행해야 하는지 결정하는 역할을 합니다. 다형성과 상속의 차이점에 대한 논의로 넘어가기 전에 먼저 이러한 각 개념을 자세히 살펴보는 것이 누구에게나 도움이 될 것입니다. 상속과 다형성이 정확히 무엇을 의미하는지 알게 되면 차이점이 더욱 분명해집니다.

세계 최고의 대학에서 소프트웨어 공학 학위취득하십시오 . 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.

목차

계승

상속을 매우 중요한 OOP 개념으로 간주하지 않는 것은 프로그래밍 패러다임에서 범죄가 될 것입니다. 상속의 목적은 '재사용성'이기 때문에 상속의 중요성을 결코 가볍게 여겨서는 안 됩니다. 상속은 이름에서 알 수 있듯이 클래스에서 작성된 코드를 다른 클래스로 확장할 수 있도록 합니다. 따라서 상속에는 기본 클래스가 있습니다. 코드가 작성된 클래스는 재사용됩니다.

우리가 만들 다음 클래스는 이 기본 클래스에서 상속되어 기본 클래스와 연결된 모든 함수와 변수를 사용해야 합니다. 클래스가 다른 클래스의 속성을 가져갈 때마다(또는 다른 클래스에서 상속) 기본 클래스에 있는 모든 멤버가 이 새 파생 클래스의 멤버가 됩니다.

아래에 제공된 샘플 코드는 일반적인 형태의 상속이 어떤 것인지 보여줍니다. 여기서 주목해야 할 한 가지 중요한 점은 코드의 상속을 활성화하기 위해 작성해야 하는 정확한 구문은 선택한 프로그래밍 언어에만 의존한다는 것입니다.

  1. 클래스 파생 클래스 이름: 액세스 지정자 기본 클래스 이름{
  2. // 파생 클래스의 본문
  3. }

위에 표시된 예에서 특정 사항은 약간의 설명이 필요합니다. "접근 지정자"라는 단어는 파생 클래스가 기본 클래스의 속성 및 메서드에 액세스하는 방식을 의미합니다. 일반적으로 각각 고유한 의미(즉, private, public 및 protected)와 속성을 갖는 세 가지 액세스 지정자가 있습니다.

다시 한 번, 선택한 언어에 따라 이러한 액세스 지정자를 사용해야 할 수도 있고 사용하지 않을 수도 있습니다. 따라서 C++의 세계에서는 기본적으로 아무 것도 지정하지 않고 상속하면 비공개가 됩니다. 그러나 구조에서 상속하는 경우(struct 키워드로 이동) 기본 액세스 지정자는 private 대신 public이 됩니다.

읽기: R 프로그래밍 언어의 취업 기회

C++는 또한 상속을 수행할 때 선택할 수 있는 많은 옵션을 제공합니다. 아래에 그 중 일부가 나열되어 있습니다.

ㅏ. 계층적 상속: 이 유형의 상속은 상위 클래스가 하나만 있어야 하고 해당 상위 클래스에서 파생된 하위 클래스가 많이 있어야 한다는 규칙을 따릅니다. 아래에서 그 예를 찾을 수 있습니다.

  1. //기본 클래스
  2. 클래스 A
  3. {
  4. 공개 무효 funA()
  5. {
  6. //
  7. }
  8. }
  9. //파생 클래스
  10. 클래스 B: A
  11. {
  12. 공개 무효 funB()
  13. {
  14. //
  15. }
  16. }
  17. //파생 클래스
  18. 클래스 C: A
  19. {
  20. 공개 무효 funC()
  21. {
  22. //
  23. }
  24. }
  25. //파생 클래스
  26. 클래스 D: C
  27. {
  28. 공개 무효 funD()
  29. {
  30. //
  31. }
  32. }
  33. //파생 클래스
  34. 클래스 E: C
  35. {
  36. 공개 무효 funE()
  37. {
  38. //
  39. }
  40. }
  41. //파생 클래스
  42. 클래스 F: B
  43. {
  44. 공개 무효 funF()
  45. {
  46. //
  47. }
  48. }
  49. //파생 클래스
  50. 클래스 G: B
  51. {
  52. 공개 무효 funG()
  53. {
  54. //
  55. }
  56. }

비. 다중 상속: 다중 상속 을 수행하는 경우 다중 수퍼 클래스에서 상속되는 파생된 하위 클래스가 하나만 있음을 의미합니다. 아래에서 다중 상속의 간단한 예를 찾을 수 있습니다.

  1. //기본 클래스
  2. 클래스 A
  3. {
  4. 공개 무효 funA()
  5. {
  6. //
  7. }
  8. }
  9. //기본 클래스
  10. 클래스 B
  11. {
  12. 공개 무효 funB()
  13. {
  14. //
  15. }
  16. }
  17. //파생 클래스
  18. 클래스 C: A, B
  19. {
  20. 공개 무효 funC()
  21. {
  22. //
  23. }
  24. }

씨. 단일 상속: 이것은 아마도 가장 단순한 형태의 상속일 것입니다. 하나의 기본 클래스와 하나의 파생 클래스만 있습니다. 아래에서 예를 찾을 수 있습니다.

  1. //기본 클래스
  2. 클래스 A
  3. {
  4. 공개 무효 funA()
  5. {
  6. //할 것:
  7. }
  8. }
  9. //파생 클래스
  10. 클래스 B: A
  11. {
  12. 공개 무효 funB()
  13. {
  14. //할 것:
  15. }
  16. }

다형성

다형성이라는 단어의 기본 정의는 많은 형태를 갖는다는 의미입니다. 이 정의는 프로그래밍의 맥락에서 다형성을 설명하는 데 매우 정확하게 적용됩니다. 이 패러다임에서 다형성은 하나의 기능을 의미하지만 여러 형태를 취합니다. 다형성은 실제로 컴파일 시간에 발생합니다. 컴파일 타임의 다형성은 오버로딩의 개념으로 인해서만 가능하며 런타임에 재정의하는 기능은 다형성을 현실로 만듭니다. 하나씩 오버로딩과 오버라이드의 정의를 살펴보겠습니다.

오버로딩은 사용자가 작성하는 코드 또는 클래스의 함수가 다른 매개변수로 두 번 이상 작성되지만 리턴 유형은 동일해야 합니다. 즉, 함수에 전달하는 인수가 다를 수 있으며 런타임에 함수에 전달되는 최종 값을 보는 것만으로 함수의 어떤 형태를 호출할지 결정됩니다. 일반적으로 클래스 생성자가 가장 오버로드된 함수임을 알 수 있습니다. 이 모든 이론은 훨씬 더 분명해질 것이며, 예를 통해 그것을 마음에 새기기가 더 쉬울 것입니다.

  1. 클래스 과부하{
  2. 정수 a, b;
  3. 공공의:
  4. int 오버로드 (int x){ // 첫 번째 오버로드() 생성자
  5. a=x;
  6. 반환;
  7. }
  8. int 오버로드 (int x, int y){ //두 번째 오버로드() 생성자
  9. a=x;
  10. b=y;
  11. 반환 * b;
  12. }
  13. };
  14. 정수 메인 (){
  15. 과부하 O1;
  16. O1. 과부하 (20); //첫 번째 오버로드() 생성자 호출
  17. O1. 과부하 (20,40); // 두 번째 override() 생성자 호출

여기 이 예에서 오버로딩이 작동하는 것을 볼 수 있습니다. 개체의 괄호의 최종 값이 하나의 정수인지 아니면 두 개의 정수인지에 따라 어떻게 다른 생성자가 호출되는지 살펴보십시오.

다음으로 재정의의 정의를 살펴보겠습니다. 상속된 특정 기능에 대해서만 재정의를 수행할 수 있습니다. 예, 상속은 기능 재정의를 가능하게 하는 핵심 포인트입니다. 함수를 작성하고 재정의하려는 경우 C++에서는 함수 정의 전에 virtual 키워드를 사용해야 하고 함수에 대해 동일한 이름을 사용하는 파생 클래스에서는 virtual 키워드를 제거하기만 하면 됩니다. 이해를 돕기 위해 다음과 같은 예가 있습니다.

  1. 클래스 기반{
  2. 공공의:
  3. virtual void funct (){ //기본 클래스의 가상 함수
  4. cout<<“기본 클래스의 funct()”;
  5. }
  6. };
  7. 클래스 파생1 : 공개 기반{
  8. 공공의:
  9. void funct (){ //파생1 클래스에서 재정의된 기본 클래스의 가상 함수
  10. cout<<“이것은 파생1 클래스의 funct()”;
  11. }
  12. };
  13. 정수 메인 ()
  14. {
  15. 기본 *p, b;
  16. 파생1 d1;
  17. *p=&b;
  18. p-> 함수 (); // 기본 클래스 funct()를 호출합니다.
  19. *p=&d1;
  20. 반환 0;
  21. }

기본 클래스에서 virtual 키워드가 어떻게 사용되는지 살펴보고 파생 클래스에서 동일한 함수 정의는 virtual 키워드가 없다는 것뿐입니다.

다형성과 상속 간의 몇 가지 확실한 차이점:

  1. 상속은 본질적으로 클래스를 만든 다음 프로그램의 다른 클래스가 이미 존재하는 기본 클래스에서 기능을 가져오도록 하는 것입니다. 그러나 다형성은 인터페이스이며 인터페이스이기 때문에 다양한 모양과 형태를 취할 수 있습니다.
  2. 상속은 클래스에만 관련된 속성인 반면, 다형성은 모든 메서드 및/또는 함수로 확장됩니다.
  3. 상속을 통해 파생 클래스는 다시 명시적으로 정의하지 않고도 기본 클래스에 선언된 모든 함수와 변수를 사용할 수 있습니다. 이것이 상속이 코드 재사용성을 높이고 상속이 없는 경우 작성해야 하는 코드의 길이를 줄여준다고 말하는 이유입니다. 반면에 다형성은 동일한 함수 이름이 두 개의 매우 다른 코드를 가질 수 있도록 합니다. 따라서 어떤 의미에서 다형성은 우리가 작성해야 하는 코드의 길이를 줄이는 대신 코드를 더 확장합니다.
  4. 상속에는 여러 가지 형태가 있습니다. 상속을 통해 정말 창의적일 수 있습니다. 그러나 다형성은 두 가지 수단, 즉 오버로딩과 재정의를 통해서만 달성할 수 있습니다. 다형성을 사용하는 동안 여전히 매우 미쳐버릴 수 있지만 코드 작성에 구현하는 두 가지 방법으로만 제한됩니다.

반드시 읽어야 함: 신입 및 경험자를 위한 47 OOPS 인터뷰 질문 및 답변을 읽어야 합니다.

다형성 대 상속: 표 미분

아래 표에서 다형성과 상속의 명확한 차이점을 찾을 수 있습니다.

비교 조치 계승 다형성
둘의 근본적인 차이점 상속의 의미는 속성(기존 클래스의 함수 및 변수)을 가진 새 클래스를 만드는 것입니다. 본질적으로 코드를 다양한 형식으로 작성할 수 있는 플랫폼입니다.
둘 다 코드에 통합되는 방식의 차이점 클래스만 코드에서 실제 상속을 즐길 수 있습니다. 전체 코드에서 모든 기능 및/또는 메서드에서 구현 및 사용할 수 있습니다.
둘 다 사용할 수 있는 방식의 차이. 작성된 코드를 동일하거나 다른 프로그램 내에서 재사용할 수 있습니다. 그것이 없다면 객체 지향 프로그래밍은 중요한 기능을 놓치게 될 것입니다. 선언된 객체가 어떤 형식의 함수를 호출할지 결정할 수 있도록 합니다. 이것이 결정될 수 있는 경우는 두 번 있다. 런타임에는 재정의라고 합니다. 컴파일 타임에 이를 오버로딩이라고 합니다.
둘 다 취할 수 있는 다른 형태 상속이 취할 수 있는 형태는 매우 많습니다. 다형성에는 두 가지 형태만 있을 수 있습니다. 프로그램의 시간에 따라 오버로딩에서 오버라이드로 바뀝니다.
각각의 구현 방법을 보여주는 기본 예입니다. 클래스 바이크는 2륜 차량의 클래스에서 상속할 수 있으며, 이는 차례로 차량의 하위 클래스가 될 수 있습니다. 클래스 바이크는 set_color()라는 메서드를 가질 수 있습니다. 이 메서드는 입력한 색상의 이름을 기반으로 바이크의 색상을 변경합니다.

확인: Java에서 유형 캐스팅이란 무엇입니까 | 초심자로서 타입 캐스팅 이해하기

결론

다형성과 상속은 모든 프로그램을 현실로 만드는 데 중요한 개념이라고 해도 과언이 아닙니다. 둘 다 객체 지향 프로그래밍의 아이디어가 놓인 토대입니다. 다형성과 상속은 매우 다른 두 가지 목적을 수행하기 때문에 많은 차이점이 있습니다.

다형성을 통해 프로그래머는 함수의 여러 정의를 작성할 수 있습니다. 동시에 상속을 통해 사용자는 이미 작성된 코드를 재사용할 수 있습니다. 두 개념을 완전히 이해하고 이해하려면 두 주제에 대해 자세히 읽어보는 것이 좋습니다.

코드를 작성할 때마다 항상 염두에 두어야 할 한 가지는 이미 작성한 코드를 리팩토링하려는 경우(기본적으로 한 클래스의 정의를 사용하여 유사하거나 다른 서비스를 제공하기 위해 코드에서 다시 사용한다는 것입니다. 목적), 상속을 사용해야 합니다. 코드의 전반적인 혼란을 줄이고 유사한 작업을 수행하기 위해 동일한 이름의 함수를 사용하려는 경우 다형성을 사용해야 합니다.

전체 스택 소프트웨어 개발에 대해 자세히 알아보려면 upGrad & IIIT-B의 전체 스택 소프트웨어 개발 PG 디플로마를 확인하세요. 이 PG 디플로마는 일하는 전문가를 위해 설계되었으며 500시간 이상의 엄격한 교육, 9개 이상의 프로젝트 및 과제, IIIT-B 동문 자격, 실질적인 실습 캡스톤 프로젝트 및 최고의 기업과의 취업 지원.

지금 소프트웨어 개발 경력을 계획하십시오.

upGrad 소프트웨어 공학 직무연계PG 자격증 신청