JavaRush /Java Blog /Random-KO /다형성 활용 실습

다형성 활용 실습

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘 우리는 OOP 의 원리에 대한 일련의 강의를 마무리하고 있습니다 . 이번 강의에서는 다형성(Polymorphism)에 대해 이야기하겠습니다. 다형성 활용 실습 - 1다형성은 여러 유형을 동일한 유형인 것처럼 처리하는 능력입니다. 이 경우 객체의 동작은 해당 객체가 속한 유형에 따라 달라집니다. 이 진술을 더 자세히 살펴 보겠습니다. 첫 번째 부분인 "여러 유형이 동일한 유형인 것처럼 작업할 수 있는 기능"부터 시작하겠습니다. 어떻게 서로 다른 유형이 하나이고 같을 수 있습니까? 조금 이상하게 들리네요 :/ 실제로는 간단합니다. 예를 들어, 이러한 상황은 상속을 정상적으로 사용할 때 발생합니다. 그것이 어떻게 작동하는지 봅시다. Cat단일 메소드인 run()"run"을 갖는 간단한 상위 클래스가 있다고 가정해 보겠습니다 .
public class Cat {

   public void run() {
       System.out.println("Бег!");
   }
}
Cat이제 사자 , 호랑이, 치타를 나타내는 , 및 를 Lion상속 Tiger받는 세 가지 클래스를 만들어 보겠습니다 .Cheetah
public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Лев бежит со speedю 80 км/ч");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Тигр бежит со speedю 60 км/ч");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Гепард бежит со speedю до 120 км/ч");
   }
}
그래서 우리는 3개의 수업을 가지고 있습니다. 마치 같은 클래스인 것처럼 작업할 수 있는 상황을 시뮬레이션해 보겠습니다. 우리 고양이 중 한 마리가 아파서 Aibolit 박사의 도움이 필요하다고 상상해 봅시다. Aibolit사자, 호랑이, 치타를 치료할 수 있는 수업을 만들어 보겠습니다 .
public class Aibolit {

   public void healLion(Lion lion) {

       System.out.println("Лев здоров!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Тигр здоров!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Гепард здоров!");
   }
}
문제가 해결된 것 같습니다. 클래스가 작성되어 사용할 준비가 되었습니다. 하지만 프로그램을 확장하고 싶다면 어떻게 해야 할까요? 이제 사자, 호랑이, 치타 3종만 남았습니다. 하지만 세상에는 40종 이상의 고양이가 있습니다. 팔라스의 고양이, 재규어, 메인쿤, 집고양이 및 기타 모든 사람을 위한 별도의 수업을 프로그램에 추가하면 어떤 일이 일어날지 상상해 보세요. 다형성 활용 실습 - 2물론 프로그램 자체는 작동하지만 수업은 Aibolit각 유형의 고양이를 치료하기 위해 지속적으로 새로운 방법을 추가해야 하며 결과적으로 전례 없는 규모로 성장할 것입니다. 여기에서 다형성의 속성, 즉 "여러 유형이 동일한 유형인 것처럼 작업할 수 있는 능력"이 발휘됩니다. 우리는 똑같은 일, 즉 고양이를 치료하는 수많은 방법을 만들 필요가 없습니다. 모든 경우에 한 가지 방법으로 동시에 충분합니다.
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
   }
}
객체 와 객체를 모두 메서드에 healCat()전달할 수 있습니다 . 모두 다음과 같습니다 . LionTigerCheetahCat
public class Main {

   public static void main(String[] args) {

       Aibolit aibolit = new Aibolit();

       Lion simba = new Lion();
       Tiger sherekhan = new Tiger();
       Cheetah chester = new Cheetah();

       aibolit.healCat(simba);
       aibolit.healCat(sherekhan);
       aibolit.healCat(chester);
   }
}
콘솔 출력:

Пациент здоров!
Пациент здоров!
Пациент здоров!
이것이 우리 클래스가 Айболит서로 다른 유형을 마치 동일한 유형인 것처럼 작업할 수 있는 방법입니다. 이제 두 번째 부분을 다루겠습니다. "이 경우 개체의 동작은 개체가 속한 유형에 따라 달라집니다." 여기에서도 모든 것이 간단합니다. 본질적으로 모든 고양이는 다르게 움직입니다. 최소한 실행 속도는 다릅니다. 우리가 키우는 세 마리의 애완동물 중 치타가 가장 빠른 반면, 호랑이와 사자는 더 느리게 달립니다. 즉, 그들의 행동이 다릅니다. 다형성은 다양한 유형을 하나로 사용할 수 있는 능력을 제공할 뿐만 아니라 동시에, 그것은 우리가 그들의 차이점을 잊지 않도록 하고, 그들 각각의 특정한 행동을 보존하도록 해준다. 이는 이 예를 통해 이해할 수 있습니다. 성공적으로 회복된 후, 우리 고양이들이 축하하기 위해 조금 뛰어다니기로 결정했다고 가정해 보겠습니다. 이것을 우리 수업에 추가해 봅시다 Aibolit:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
       cat.run();
   }
}
세 마리의 동물을 치료하기 위해 동일한 코드를 실행해 보겠습니다.
public static void main(String[] args) {

   Aibolit aibolit = new Aibolit();

   Lion simba = new Lion();
   Tiger sherekhan = new Tiger();
   Cheetah chester = new Cheetah();

   aibolit.healCat(simba);
   aibolit.healCat(sherekhan);
   aibolit.healCat(chester);
}
결과는 다음과 같습니다.

Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
여기서 우리는 세 동물을 모두 메서드에 전달하고 각각을 Cat. 다형성 덕분에 Java는 이것이 단지 세 마리의 고양이가 아니라 다르게 달리는 사자, 호랑이, 치타라는 것을 완벽하게 기억합니다. 이것이 다형성 사용의 주요 장점인 유연성 입니다 . 많은 유형에 공통적인 기능을 생성해야 할 때 사자, 호랑이, 치타는 단순히 "고양이"로 변합니다. 모든 동물은 다르지만 어떤 상황에서는 고양이가 어떤 종에 속하든 고양이는 고양이입니다 :) 다음은 여러분을 위한 확인 영상입니다.
이러한 "일반화"가 필요하지 않고 반대로 종의 행동이 달라야 할 때 각 유형은 다르게 행동합니다. 다형성 덕분에 광범위한 클래스에 대한 단일 인터페이스(메서드 집합)를 만들 수 있습니다. 이로 인해 프로그램의 복잡성이 줄어듭니다. 프로그램을 40종의 고양이로 확장하더라도 우리는 여전히 가능한 가장 간단한 인터페이스, 즉 run()40종의 고양이 모두에 대한 하나의 방법을 갖게 될 것입니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION