안녕하세요! 오늘 우리는 OOP 의 원리에 대한 일련의 강의를 마무리하고 있습니다 . 이번 강의에서는 다형성(Polymorphism)에 대해 이야기하겠습니다. 다형성은 여러 유형을 동일한 유형인 것처럼 처리하는 능력입니다. 이 경우 객체의 동작은 해당 객체가 속한 유형에 따라 달라집니다. 이 진술을 더 자세히 살펴 보겠습니다. 첫 번째 부분인 "여러 유형이 동일한 유형인 것처럼 작업할 수 있는 기능"부터 시작하겠습니다. 어떻게 서로 다른 유형이 하나이고 같을 수 있습니까? 조금 이상하게 들리네요 :/ 실제로는 간단합니다. 예를 들어, 이러한 상황은 상속을 정상적으로 사용할 때 발생합니다. 그것이 어떻게 작동하는지 봅시다.
이러한 "일반화"가 필요하지 않고 반대로 종의 행동이 달라야 할 때 각 유형은 다르게 행동합니다. 다형성 덕분에 광범위한 클래스에 대한 단일 인터페이스(메서드 집합)를 만들 수 있습니다. 이로 인해 프로그램의 복잡성이 줄어듭니다. 프로그램을 40종의 고양이로 확장하더라도 우리는 여전히 가능한 가장 간단한 인터페이스, 즉
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종 이상의 고양이가 있습니다. 팔라스의 고양이, 재규어, 메인쿤, 집고양이 및 기타 모든 사람을 위한 별도의 수업을 프로그램에 추가하면 어떤 일이 일어날지 상상해 보세요. 물론 프로그램 자체는 작동하지만 수업은 Aibolit
각 유형의 고양이를 치료하기 위해 지속적으로 새로운 방법을 추가해야 하며 결과적으로 전례 없는 규모로 성장할 것입니다. 여기에서 다형성의 속성, 즉 "여러 유형이 동일한 유형인 것처럼 작업할 수 있는 능력"이 발휘됩니다. 우리는 똑같은 일, 즉 고양이를 치료하는 수많은 방법을 만들 필요가 없습니다. 모든 경우에 한 가지 방법으로 동시에 충분합니다.
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
}
}
객체 와 객체를 모두 메서드에 healCat()
전달할 수 있습니다 . 모두 다음과 같습니다 . Lion
Tiger
Cheetah
Cat
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는 이것이 단지 세 마리의 고양이가 아니라 다르게 달리는 사자, 호랑이, 치타라는 것을 완벽하게 기억합니다. 이것이 다형성 사용의 주요 장점인 유연성 입니다 . 많은 유형에 공통적인 기능을 생성해야 할 때 사자, 호랑이, 치타는 단순히 "고양이"로 변합니다. 모든 동물은 다르지만 어떤 상황에서는 고양이가 어떤 종에 속하든 고양이는 고양이입니다 :) 다음은 여러분을 위한 확인 영상입니다.
run()
40종의 고양이 모두에 대한 하나의 방법을 갖게 될 것입니다.
GO TO FULL VERSION