[java] 다형성 vs 재정의 vs 과부하

Java의 관점에서 누군가가 물을 때 :

다형성이란 무엇입니까?

겠습니까 과부하 또는 재정의 허용 해답이 될?

나는 그것보다 조금 더 있다고 생각합니다.

구현하지 않고 메소드를 정의한 추상 기본 클래스가 있고 서브 클래스에서 해당 메소드를 정의한 경우 여전히 대체입니까?

오버로드 가 정답이 아니라고 생각 합니다.



답변

다형성을 표현하는 가장 명확한 방법은 추상 기본 클래스 (또는 인터페이스)를 사용하는 것입니다.

public abstract class Human{
   ...
   public abstract void goPee();
}

이 클래스는 goPee()메소드가 인간에게 정의 할 수 없기 때문에 추상적 입니다. 서브 클래스 Male 및 Female에 대해서만 정의 할 수 있습니다. 또한 인간은 추상적 개념입니다. 남성도 여성도 아닌 인간을 만들 수는 없습니다. 둘 중 하나 여야합니다.

따라서 추상 클래스를 사용하여 구현을 연기합니다.

public class Male extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Stand Up");
    }
}

public class Female extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Sit Down");
    }
}

이제 인간으로 가득 찬 방 전체에 오줌을 줄 수 있습니다.

public static void main(String[] args){
    ArrayList<Human> group = new ArrayList<Human>();
    group.add(new Male());
    group.add(new Female());
    // ... add more...

    // tell the class to take a pee break
    for (Human person : group) person.goPee();
}

이것을 실행하면 다음을 얻을 수 있습니다.

Stand Up
Sit Down
...


답변

다형성 (polymorphism) 은 클래스 인스턴스가 마치 상속 트리에있는 다른 클래스의 인스턴스 인 것처럼 행동하는 능력입니다. 대부분의 경우 조상 클래스 중 하나입니다. 예를 들어 Java에서 모든 클래스는 Object에서 상속됩니다. 따라서 Object 유형의 변수를 작성하고 클래스의 인스턴스를 지정할 수 있습니다.

재정의다른 클래스에서 상속되는 클래스에서 발생하는 함수 유형입니다. 재정의 함수는 기본 클래스에서 상속 된 함수를 “대체”하지만 클래스의 인스턴스가 다형성을 통해 다른 유형 인 척하는 경우에도 호출되는 방식으로 호출됩니다. 이전 예제를 참조하면 자신의 클래스를 정의하고 toString () 함수를 재정의 할 수 있습니다. 이 함수는 Object에서 상속되므로이 클래스의 인스턴스를 Object-type 변수에 복사하면 계속 사용할 수 있습니다. 일반적으로 클래스가 Object 인 것처럼 클래스에서 toString ()을 호출하면 실제로 실행되는 toString 버전은 Object 자체에 정의 된 버전입니다. 그러나 함수가 재정의이므로 클래스 인스턴스의 toString () 정의는 클래스 인스턴스가

오버로드 는 이름은 같지만 매개 변수가 다른 여러 메소드를 정의하는 조치입니다. 재정의 또는 다형성과 관련이 없습니다.


답변

다형성이란 요구 사항에 따라 다른 작업을 수행하는 하나 이상의 동일한 형태를 의미합니다.

다형성은 두 가지 방법으로 달성 할 수 있습니다.

  1. 메서드 재정의
  2. 메소드 오버로딩

메소드 오버로드 는 동일한 메소드 이름을 사용하여 동일한 클래스에 둘 이상의 메소드를 작성하는 것을 의미하지만 전달 매개 변수는 다릅니다.

메서드 재정의 는 다른 클래스에서 메서드 이름을 사용한다는 것을 의미합니다. 즉, 부모 클래스 메서드는 자식 클래스에서 사용됩니다.

Java에서 다형성을 달성하기 위해 수퍼 클래스 참조 변수는 서브 클래스 오브젝트를 보유 할 수 있습니다.

다형성을 달성하려면 모든 개발자가 프로젝트에서 동일한 메소드 이름을 사용해야합니다.


답변

pseudo-C # / Java에서 다형성의 예는 다음과 같습니다.

class Animal
{
    abstract string MakeNoise ();
}

class Cat : Animal {
    string MakeNoise () {
        return "Meow";
    }
}

class Dog : Animal {
    string MakeNoise () {
        return "Bark";
    }
}

Main () {
   Animal animal = Zoo.GetAnimal ();
   Console.WriteLine (animal.MakeNoise ());
}

Main 함수는 동물의 유형을 모르고 MakeNoise () 메서드의 특정 구현 동작에 따라 다릅니다.

편집 : 브라이언이 나를 때리는 펀치처럼 보입니다. 우린 같은 예를 사용했습니다. 그러나 위의 코드는 개념을 명확히하는 데 도움이됩니다.


답변

재정의와 과부하 모두 다형성을 달성하는 데 사용됩니다.

하나 이상의 서브 클래스에서 재정의 되는 클래스에 메소드가있을 수 있습니다 . 이 메소드는 객체를 인스턴스화하는 데 사용 된 클래스에 따라 다른 작업을 수행합니다.

    abstract class Beverage {
       boolean isAcceptableTemperature();
    }

    class Coffee extends Beverage {
       boolean isAcceptableTemperature() {
           return temperature > 70;
       }
    }

    class Wine extends Beverage {
       boolean isAcceptableTemperature() {
           return temperature < 10;
       }
    }

또한 둘 이상의 인수 세트로 오버로드 되는 메소드가있을 수 있습니다
. 이 메소드는 전달 된 인수의 유형에 따라 다른 작업을 수행합니다.

    class Server {
        public void pour (Coffee liquid) {
            new Cup().fillToTopWith(liquid);
        }

        public void pour (Wine liquid) {
            new WineGlass().fillHalfwayWith(liquid);
        }

        public void pour (Lemonade liquid, boolean ice) {
            Glass glass = new Glass();
            if (ice) {
                glass.fillToTopWith(new Ice());
            }
            glass.fillToTopWith(liquid);
        }
    }


답변

과부하가 답이 아닌 것이 맞습니다.

어느 것도 무시하지 않습니다. 재정의는 다형성을 얻는 수단입니다. 다형성은 객체가 유형에 따라 동작을 변화시키는 능력입니다. 다형성을 나타내는 객체의 호출자가 객체의 특정 유형을 알지 못하는 경우에 가장 잘 설명됩니다.


답변

특히 오버로드 또는 오버라이드는 전체 그림을 제공하지 않습니다. 다형성은 단순히 객체의 유형에 따라 동작을 특수화하는 능력입니다.

오버로드는 같은 이름의 메소드가 다르게 매개 변수 유형을 지정할 수있는 경우 다형성 (매개 변수 다형성)의 형태라는 점에서 일부 답변에 동의하지 않습니다. 좋은 예는 연산자 오버로드입니다. 문자열 또는 int와 같은 다른 유형의 매개 변수를 허용하도록 “+”를 정의 할 수 있으며 이러한 유형에 따라 “+”는 다르게 동작합니다.

다형성에는 상속 및 재정의 방법도 포함되지만 기본 유형에서는 추상적이거나 가상 일 수 있습니다. 상속 기반 다형성 측면에서 Java는 단일 클래스 상속 만 지원하여 단일 유형의 기본 유형 체인의 다형성 동작으로 제한합니다. Java는 또 다른 형태의 다형성 동작 인 다중 인터페이스의 구현을 지원합니다.