2017-01-05 1 views
0

Java 프로그래밍 및 객체 지향 프로그래밍에 대해 공부하고 있습니다. 동적 다형성의 이점은 무엇입니까?Java에서 동적 다형성의 이점은 무엇입니까?

아래의 샘플 프로그램을 살펴보십시오. 예제 2를 통해 예제 1을 사용하는 이유는 무엇입니까?

class SuperHero { 
    private String power = ("Generic Power"); 
    public void useSuperPower() { 
     System.out.println(power); 
    } 
} 
class Spiderman extends SuperHero { 
    private String power = ("Web sling!"); 
    public void useSuperPower() { 
     System.out.println(power); 
    } 
} 

class Wolverine extends SuperHero { 
    private String power = ("Hack and Slash!"); 
    public void useSuperPower() { 
     System.out.println(power); 
    } 
} 

class main { 
    public static void main (String args[]) { 
     //example 1 
     SuperHero hero = new SuperHero(); 
     SuperHero hero1 = new Spiderman(); 
     SuperHero hero2 = new Wolverine(); 

     hero.useSuperPower(); 
     hero1.useSuperPower(); 
     hero2.useSuperPower(); 


     //example 2 
     Spiderman test = new Spiderman(); 
     Wolverine test2 = new Wolverine(); 

     test.useSuperPower(); 
     test2.useSuperPower(); 
    } 
} 
+0

Java에서'overriding'과'overloading'을 공부하면 왜 동적 인 다형성이 필요한지 이해할 수있을 것입니다. –

답변

0

아마도 예제 1을 직접 사용하지 않을 것입니다. 어쨌든 예제 1로 끝날 수 있습니다. 따라서 동적 다형성에 가치가 있습니다.

우리 둘이 게임을 함께 코딩한다고 가정 해 보겠습니다. 질문에서와 같이 슈퍼 히어로의 역사를 작성했습니다.

public JusticeLeagueScheduler { 
    public static Superhero getAvaiableHero() { 
     // ... 
    } 
} 

당신이 세상을 구한다 도움을 줄 수있는 슈퍼 히어로에 대한 액세스 권한을 얻을 수 있습니다 : 이상 내 옆에, 나는 방법에 JusticeLeagueScheduler라는 클래스를 작성했습니다. 그것은 각각의 슈퍼 히어로가 사용 된 빈도를 고려할 필요로 또한, 방법 getAvailableHero은() 황당 긴한다고 가정 로건의 현재 BAC, 피터 파커의 학교 일정, 등 등 등

당신이 전화 그 방법은, 당신이 이런 식으로 그렇게 할 수 있습니다 :

SuperHero superhero = JusticeLeagueScheduler.getAvailableHero(); 

을이 시점에서, 당신은 이 어떤 생각 당신이 가지고있는 영웅은 인스턴스 또는 클래스 SuperHero의 서브 클래스 인 경우에만 있음. 따라서 예제 1의 상황에 처해 있습니다. Wolverine 메서드는 superhero에 호출 할 수 없습니다. 이는 Wolverine 일 수 있기 때문입니다. SuperHero (또는 상위 유형 Object) 클래스에 정의 된 메서드 만 superhero에 호출 할 수 있습니다.

그러나 여전히 인스턴스가됩니다. 내 메소드가 Wolverine 인스턴스를 반환하고 userSuperPower()이라고 호출하면 미리 예측할 수는 없지만 "해킹 및 슬래시"가 발생합니다.

0

예 1에서, hero, hero1hero2은 모두 SuperHero입니다. 서로 다른 SuperHero 개체에서 같은 메서드를 사용하면 서로 다른 방식으로 동작합니다. 그것은 다형성입니다.

그러나, 예 2에서, hero, hero1hero2은 모두 다른 유형이다. 따라서 예제에서는 다형성을 보여주지 않습니다.

0

예, 시간을 절약하고 코드를 저장하고 있습니다. 자바

다형성은 자바

다형성은 우리가 다른 방법에 의해 하나의 작업을 수행 할 수있는 개념이다. 다형성은 두 그리스어 단어에서 파생됩니다 : 폴리 및 morphs. "폴리"는 많은 것을 의미하고 "morphs"는 형태를 의미합니다. 그래서 다형성은 많은 형태를 의미합니다.

java에는 두 가지 유형의 다형성이 있습니다. 컴파일 시간 다형성 및 런타임 다형성. 메소드 오버로딩과 메소드 오버라이드를 통해 자바에서 다형성을 수행 할 수 있습니다.

자바에서 정적 메서드를 오버로드하면 시간 다형성을 컴파일하는 예제입니다. 여기서는 java의 런타임 다형성에 초점을 맞출 것입니다.

런타임 다형성

런타임 다형성 또는 동적 인 방법 파견 자바

에서이 재정의 된 메서드 호출이 컴파일 타임이 아닌 런타임에 해결하는 의 과정이다.

이 프로세스에서 오버플로 된 메서드는 수퍼 클래스의 참조를 통해 호출됩니다. 이라고하는 메서드를 결정하는 것은 참조 변수에서 참조하는 개체를 기반으로합니다.

먼저 Runtime Polymorphism 전에 상영을 이해해 보겠습니다.

는 이제 하나 Spiderman 객체 클래스 SuperHero에, 당신은 당신이 동적 다형성없이 인스턴스화 경우 그렇게 할 수있을 것입니다 변환해야합니다 예를 보자. 대답은 '아니오'입니다.

API에 대한 자세한 내용은 Collection을 참조하십시오. 왜 동적 다형성이 필요한지 알 수 있습니다.

개념을 이해하려면 answer을 읽으십시오.

SuperHero hero1 = new Spiderman(); 
SuperHero hero2 = new Wolverine(); 

는 또한 수행 할 수 있습니다 : 당신이 다음을 수행하는 경우

그래서, 당신은 다형성을 적용하지 않는 경우

SuperHero hero3 = new Spiderman(); 
hero3 =(Superhero) hero2; 

당신은 할 수 없을 것입니다 어느.

1

동적 다형성이 강력한 경우의 가장 쉬운 예는 콜렉션에 있습니다. 서로 다른 클래스의 객체를 모아 하나의 부모 인터페이스를 공유하는 한 모두 사용할 수 있습니다. 예 :

List<SuperHero> avengers = new ArrayList<>(); 
avengers.add(new Spiderman()); 
avengers.add(new Wolverine()); 

System.out.println("Avengers Assemble!"); 
for(SuperHero hero : avengers){ 
    hero.useSuperPower(); 
} 

또한 유연한 API를 사용할 수 있습니다. 하나의 인터페이스를 기대하는 메소드를 작성할 수는 있지만 나중에 해당 메소드를 재 작성할 필요없이 자식 유형의 오브젝트를 전달할 수 있습니다. 예를 들어,

public void usePower(SuperHero hero){ 
    hero.useSuperPower(); 
} 

여기에서 SuperHero를 확장하는 객체로이 메소드를 호출 할 수 있습니다. (이 예제는 단지 useSuperPower() 메서드를 직접 호출 할 수 있기 때문에 다소 불완전합니다.)

기본적으로 다형성을 사용하면 모두 동일한 작업을 수행하지만 다르게 수행하는 클래스를 만들 수 있습니다. (거의) 서로 바꾸어 사용하십시오.

관련 문제