상속과 다형성의 주요 차이점은 무엇입니까?


172

나는 오늘 모듈 오픈 북 시험의 끝 에서이 질문을 받았으며 자신을 잃어 버렸습니다. 나는 읽고 Head first Java있었고 두 정의는 정확히 같은 것처럼 보였다. 나는 내 자신의 마음에 대한 주요 차이점이 무엇인지 궁금해하고있었습니다. 나는 이것과 비슷한 질문이 많이 있다는 것을 알고 있지만 결정적인 대답을 제공하는 것은 없습니다.


2
어떻게 든이 질문과 관련이 있습니다 : 상속없이 다형성이 가능
합니까

답변:


289

상속은 '클래스'가 기존 '클래스'에서 파생 될 때입니다. 당신은이 그렇다면 Person클래스를, 당신은이 Student확장 클래스는 Person, Student 상속 모든 것을 Person가지고있다. 직접 필드 / 메소드에 입력 한 액세스 수정 자에 대한 세부 사항이 있지만 이것이 기본 아이디어입니다. 예를 들어, 당신이 개인 필드가있는 경우 Person, Student그 개인 있기 때문에 그것을 볼, 민간 분야는 서브 클래스에 표시되지 않습니다.

다형성은 어떤 유형의 물건에 따라 프로그램이 어떤 방법을 사용해야하는지 결정합니다. 당신이있는 경우 Person이있는, read방법을, 당신은이 Student확장되는 Person고유의 구현이있는, read당신이있는 경우에 따라 런타임에 의해 당신을 위해 결정 호출되는 방법, Person또는를 Student. 조금 까다로워 지지만 다음과 같은 일을하면

Person p = new Student();
p.read();

Student 의 read 메소드 가 호출됩니다. 그것이 다형성의 실천입니다. a Student 는 a 이므로 해당 할당을 수행 할 수 Person있지만 런타임은 실제 유형 pStudent 인 것을 알기에 충분히 영리 합니다.

세부 사항은 언어마다 다릅니다. 예를 들어 자바 스크립트에서 상속을 수행 할 수 있지만 Java에서 작동하는 방식과 완전히 다릅니다.


9
간단히 말해, 슈퍼 클래스-서브 클래스 관계는 상위 클래스와 서브 클래스간에 서로 다른 방식으로 상속 및 동일한 메소드의 구현 개념이며 상황에 따라이를 다형성이라고 부릅니다. 나 맞아?
Muhammad Raihan Muhaimin 2016 년

1
@ hvgotcodes하지만 Personread메소드가 공개 액세스 수정자를 사용하고 있다면 Student객체가 액세스 할 수 없습니까? 그러면 Student s = new Student();쉽지 않을까요? 나는 여전히 실제로 Polymporphism의 이점을 얻지 못합니다.
Scorpiorian83

1
@hvgotcodes Student s = new Student ()가 작동합니다. 그러나이 아이디어를 사용하여 많은 코드를 작성한 후에 나중에 실수를했다는 것을 알고 있다고 가정 해 봅시다. 그 사람은 실제로 학생이 아니며 교사입니다. 따라서 Person p = new Student ()에서 Person p = new Teacher ()로 간단히 변경하면 인생이 훨씬 간단 해집니다.
munmunbb

내 질문은 왜 Person p = new Student();대신에 사용하고 싶 Student p = new Student();습니까?
PerfectContrast

@PerfectContrast 학생, 운전사, 교사 등을 사람으로하고 목록 또는 무언가로 그룹화 할 때 유용하다고 생각합니다. 따라서 모두에 대해 '읽기'를 호출하면 모든 사람이 자신의 '읽기'메소드를 호출합니다.
savante

205

상속 은 서브 클래스에서 수퍼 클래스 의 구조와 동작사용하는 것을 말합니다 .

다형성 은 서브 클래스에서 수퍼 클래스 의 동작변경하는 것을 말합니다 .


5
이 답변은 다형성에 상속이 필요하다는 것을 의미합니까?
jaco0646

6
@ jaco0646-Java와 관련하여 그렇게 생각합니다. 다른 언어에서는 그다지 많지 않을 것입니다. 여기서 "super class"와 "subclass"는 느슨하게 사용됩니다. 다형성은 또한 인터페이스에 지정된 (구현되지는 않은) 동작의 상속을 의미 할 수 있습니다.
Ted Hopp

1
@AlirezaRahmani-귀하의 의견을 이해하지 못합니다. 상속이 속성과 동작을 모두 상속하지 않는 것을 의미합니까? 이는 Java (및 대부분의 클래스 기반 객체 지향 언어)가 상속을 정의하는 방식과 상반됩니다. 로부터 Java 언어 사양, §8.4.8 : "A 클래스 C의 상속 의 직접 슈퍼 클래스의 모든 구체적인 방법 m(모두 staticinstance의 슈퍼 ...의)는"(상속에 관한 자세한 사항은 다음에). 나에게 "코드 재사용"처럼 들린다.
테드 pp

@TedHopp Inheritance는 기본적으로 다형성 도구이지만 나중에 위험에 처한 사람들은 코드를 재사용 / 공유하는 방법으로 사용하려고합니다. 이론적 근거는 "내가 상속하면 모든 방법을 무료로 얻는다"는 것이지만이 두 클래스에는 잠재적으로 다형성 관계가 없다는 사실을 무시합니다.
Alireza Rahmani Khalili

1
@AlirezaRahmani-Java (태그에 따라 OP가 특별히 요구 한 것)에서 클래스 상속에는 상속 동작과 가장 관련이 있습니다. 그것은 언어 정의의 일부입니다. 설명 할 때 이것이 잘못 사용될 수 있다는 사실은 Java의 약점 중 하나입니다. (관련된 약점은 인터페이스에 정의 된 상수를 가져 오기 위해 인터페이스를 구현하기 위해 클래스를 선언하는 것과 관련이 있습니다. 결국 Java 디자이너는 import static이러한 인터페이스의 오용을 제거하기 위해 도입 했습니다.) Java의 순수한 다형성을 위해 사용할 도구는 클래스 상속이 아닌 인터페이스입니다.
Ted Hopp

63

다형성 (Polymorphism) : 다른 유형의 물체를 비슷한 방식으로 처리하는 능력. 예 : 기린과 악어는 모두 동물이며 동물은 할 수 있습니다 Move. 의 인스턴스가 있다면 어떤 종류의 동물인지 알거나 돌보지 않고 Animal전화 할 수 있습니다 Move.

상속 : 이것은 다형성과 코드 재사용을 동시에 달성하는 한 가지 방법입니다.

다형성의 다른 형태 : 다형성을 달성하는 다른 방법이 있습니다, 같은 단지 다형성하지만 코드 재사용을 제공하는 인터페이스로는 (때로는 코드는 다음과 같은 매우 다른 Move뱀은 상당히 다른 것위한 Move, 개가있는 경우 이 경우 인터페이스가 더 나은 다형성 선택이 될 것입니다.

다른 동적 인 언어에서, 다형은 Duck Typing으로 달성 할 수 있습니다.이 클래스는 동일한 기본 클래스 또는 인터페이스를 공유 할 필요가 없으며 동일한 이름의 메소드 만 있으면됩니다. 또는 Javascript와 같이 훨씬 역동적이므로 클래스가 전혀 필요하지 않으며 동일한 메소드 이름을 가진 객체 만 다형성으로 사용할 수 있습니다.


17

주요 차이점은 다형성이 상속의 특정 결과라는 것입니다. 다형성은 호출 할 메소드가 런타임에 오브젝트 유형에 따라 결정되는 위치입니다. 이것은 한 클래스가 다른 클래스를 상속하고 특정 메소드를 대체 할 때 발생하는 상황입니다. 그러나 일반 상속 트리에서는 메서드를 재정의 할 필요가 없으므로 모든 메서드 호출이 다형성 일 필요는 없습니다. 말이 돼? 그것은 모든 포드 차량과 자동차와 비슷한 문제이지만 모든 자동차가 포드는 아닙니다 (그러나 ....)는 아닙니다.

또한 다형성은 메소드 호출을 처리하지만 상속은 데이터 멤버 등을 설명합니다.


12

Java에서 두 가지는 밀접한 관련이 있습니다. Java가 "동적 디스패치"라는 메소드 호출 기술을 사용하기 때문입니다. 만약 내가 가지고 있다면

public class A {
  public void draw() { ... }
  public void spin() { ... }
}

public class B extends A {
  public void draw() { ... }
  public void bad() { ... }
}

...

A testObject = new B();

testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A

그러면 B가 상속하는 것을 볼 수 있습니다 spin 가 A로부터 있습니다. 그러나 객체를 마치 A 형인 것처럼 조작하려고하면 여전히 B의 동작이 나타납니다 draw. draw동작은 다형성이다.

일부 언어에서 다형성과 상속은 밀접한 관련이 없습니다. 예를 들어 C ++에서 virtual로 선언되지 않은 함수는 상속되지만 동적으로 전달되지 않으므로 상속을 사용할 때도 다형성 동작을 얻지 못합니다.

자바 스크립트에서 모든 함수 호출은 동적으로 전달되며 약한 입력이 있습니다. 즉, 각각 고유 한 draw, 관련 객체를 반복하고 함수를 호출하는 함수를 가질 수 있으며 각각 정상적으로 작동합니다. 상속을받지 않고도 자신 만의 다형성 추첨을 할 수 있습니다.


12

다형성 : 펜을 판매하는 회사에서 일한다고 가정 해보십시오. 따라서 펜에 대해 알아야 할 모든 것을 처리하는 "펜"이라는 멋진 클래스를 만듭니다. 청구, 운송, 송장 작성을위한 모든 종류의 클래스를 Pen 클래스를 사용하여 작성합니다. 하루의 상사가 와서 "훌륭한 뉴스! 회사가 성장하고 있고 우리는 지금 Books & CD를 판매하고 있습니다!" Book & CD를 사용하기 위해 Pen을 사용하는 모든 클래스를 변경해야하기 때문에 좋은 소식은 아닙니다. 그러나 원래 "SellableProduct"라는 인터페이스를 만든 경우 Pen은이 인터페이스를 구현했습니다. 그런 다음 펜 대신 해당 인터페이스를 사용하기 위해 모든 배송, 송장 등의 클래스를 작성할 수 있습니다. 이제 SellableProduct 인터페이스를 구현하는 Book & CompactDisc라는 새 클래스를 작성하기 만하면됩니다. 다형성으로 인해 다른 모든 클래스는 변경없이 계속 작동 할 수 있습니다! 감지?

다형성을 달성하는 방법 중 하나 인 상속을 사용한다는 의미입니다.

다형성은 클래스 / 인터페이스에서 가능하지만 상속은 항상 2 개 이상의 클래스 / 인터페이스 사이에서 가능합니다. 상속은 항상 "is-a"관계를 따르는 반면, 항상 다형성 ( "is-a"/ "has-a"관계를 모두 준수 할 수있는)과 다를 수 있습니다.


6

상속은 더 정적 인 것입니다 (한 클래스는 다른 클래스를 확장합니다) 반면 다형성은 동적 / 런타임 것입니다 (객체는 정적 / 선언 유형이 아닌 동적 / 런타임 유형에 따라 동작합니다).

예 :

// This assignment is possible because B extends A
A a = new B();
// polymorphic call/ access
a.foo();

-> a의 정적 / 선언 유형은 A이지만 실제 동적 / 런타임 유형은 B이므로 a.foo ()는 A가 아닌 B에 정의 된대로 foo를 실행합니다.


3

다형성 (polymorphism)은 비슷한 특성을 가진 객체 유형 사이에서 일반적인 행동을 표현하는 접근 방식입니다. 또한 재정의를 통해 이러한 특성의 변형을 만들 수 있습니다. 상속은 객체가 관계와 추상적 행동을 표현하는 객체 계층을 통해 다형성을 달성하는 방법입니다. 다형성을 달성하는 유일한 방법은 아닙니다. 프로토 타입은 상속과 다른 다형성을 표현하는 또 다른 방법입니다. JavaScript는 프로토 타입을 사용하는 언어의 예입니다. 다른 방법도 있다고 상상합니다.


3

상속은 코드 재사용과 관련된 개념입니다. 예를 들어 부모 클래스가 있다면Animal 그것은 특정 속성과 메소드 (이 예제의 말에 포함 makeNoise()sleep()) 나는라는 두 개의 하위 클래스를 생성 Dog하고 Cat. 개와 고양이 모두 같은 방식으로 잠들기 때문에 (부정적이라고 가정) 부모 클래스가 제공 sleep()하는 DogCat하위 클래스 의 메소드에 더 많은 기능을 추가 할 필요가 없습니다 Animal. 그러나 Dog짖는 소리와 Cat야옹은Animal클래스에는 소음을내는 방법이있을 수 있으며, 개와 고양이는 서로 다른 동물에 대해 다른 소음을냅니다. 따라서 특정 유형에 따라 해당 동작을 재정의해야합니다. 따라서 다형성의 정의. 도움이 되었기를 바랍니다.


3

오라클 문서는 그 차이를 정확하게 인용했습니다.

상속 : 클래스는 직접적이든 간접적이든 상관없이 모든 수퍼 클래스에서 필드와 메소드 를 상속 합니다 . 서브 클래스는 상속하는 메소드를 대체하거나 상속하는 필드 나 메소드를 숨길 수 있습니다 . 필드를 숨기는 것은 일반적으로 나쁜 프로그래밍 관행입니다.

다형성 (polymorphism) : 다형성 (polymorphism) 은 유기체 또는 종이 다양한 형태 나 단계를 가질 수있는 생물학의 원리를 말합니다. 이 원칙은 객체 지향 프로그래밍 및 Java 언어와 같은 언어에도 적용될 수 있습니다. 클래스의 서브 클래스는 고유 한 동작을 정의 할 수 있지만 부모 클래스와 동일한 기능 중 일부를 공유 할 수 있습니다.

다형성 은 필드에 적용 할 수 없습니다.

관련 게시물 :

다형성 vs 재정의 vs 과부하


1

다형성상속 의 영향입니다 . 서로 확장되는 클래스에서만 발생할 수 있습니다. 클래스의 정확한 유형을 몰라도 클래스의 메소드를 호출 할 수 있습니다. 또한 다형성은 런타임에 발생 합니다 .

예를 들어, Java 다형성 예제는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

상속을 통해 파생 클래스는 기본 클래스의 인터페이스와 코드를 공유 할 수 있습니다. 컴파일 타임에 발생합니다 .

예를 들어, Java 플랫폼의 모든 클래스는 객체의 후손입니다 (이미지 제공 Oracle).

여기에 이미지 설명을 입력하십시오

Java 상속Java 다형성 에 대한 자세한 내용


0

상속은 클래스 A가 모든 비 정적 보호 / 공용 메소드 / 필드를 모든 상위에서 Object까지 상속 할 때입니다.


0

JAVA를 사용하는 경우 다음과 같이 간단합니다.

다형성은 상속 된 메소드를 사용하지만 다른 것을 수행하기 위해 "재정의"합니다 (또는 super를 호출하면 기술적으로 다형성이 아닐 수 있습니다).

틀 렸으면 말해줘.


0

다형성 의 주요 목적 : 수퍼 클래스에 대한 참조 변수를 작성 하고 서브 클래스 객체를 보유하는 것 => 객체는 여러 동작을 수행 할 수 있습니다 .

에서 상속 , 서브 클래스 의 속성을 상속 슈퍼 클래스를 .



0

함께 상속 구현은 슈퍼 클래스에 정의되어있다 - 그렇게 행동이 상속됩니다.

class Animal
{
  double location;
  void move(double newLocation)
  {
    location = newLocation;
  }
}

class Dog extends Animal;

함께 다형성 때문에 단지 - 구현은 하위 클래스에 정의 된 인터페이스가 상속됩니다.

interface Animal
{
  void move(double newLocation);
}

class Dog implements Animal
{
  double location;
  void move(double newLocation)
  {
    location = newLocation;
  }
}

0

다형성 은의 상속 에 의해 달성됩니다 Java.

├── Animal
└── (instances)
    ├── Cat
    ├── Hamster
    ├── Lion
    └── Moose

├── interface-for-diet
   ├── Carnivore
   └── Herbivore
├── interface-for-habitat
   ├── Pet
   └── Wild

public class Animal {
    void breath() {
    };
}

public interface Carnivore {
    void loveMeat();
}

public interface Herbivore {
    void loveGreens();
}

public interface Pet {
    void liveInside();
}

public interface Wild {
    void liveOutside();
}

public class Hamster extends Animal implements Herbivore, Pet {

    @Override
    public void liveInside() {
        System.out.println("I live in a cage and my neighbor is a Gerbil");
    }

    @Override
    public void loveGreens() {
        System.out.println("I eat Carrots, Grapes, Tomatoes, and More");
    }
}

public class Cat extends Animal implements Carnivore, Pet {
    @Override
    public void liveInside() {
        System.out.println("I live in a cage and my neighbr is a Gerbil");
    }

    @Override
    public void loveMeat() {
        System.out.println("I eat Tuna, Chicken, and More");
    }
}

public class Moose extends Animal implements Herbivore, Wild {

    @Override
    public void liveOutside() {
        System.out.println("I live in the forest");
    }

    @Override
    public void loveGreens() {
        System.out.println("I eat grass");
    }
}

public class Lion extends Animal implements Carnivore, Wild {

    @Override
    public void liveOutside() {
        System.out.println("I live in the forest");
    }

    @Override
    public void loveMeat() {
        System.out.println("I eat Moose");
    }
}

Hamster클래스 상속의 구조 에서 Animal, Herbivore그리고 Pet전시하는 다형성의 행동주의를 국내 애완 동물을.

Cat클래스 상속 구조 에서 Animal, Carnivore그리고 Pet에 또한 전시 다형성 행동주의 국내 애완 동물을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.