728x90
다형성(polymorphism) 이란?
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것.
- 같은 코드에서 여러 다른 실행 결과가 나온다.
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나이다.
- 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.
다형성의 예
package ch06;
import java.util.ArrayList;
// 동물 클래스 정의
class Animal{
public void move() {
System.out.println("동물이 움직입니다.");
}
public void eating() {
System.out.println("밥을 먹다.");
}
}
// Animal을 상속 받는 사람 클래스 정의
class Human extends Animal{
@Override
public void move() {
//super.move();
System.out.println("사람이 두 발로 걷습니다.");
}
// 동물과는 사람만의 차별화된 기능
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
class Tiger extends Animal{
@Override
public void move() {
//super.move();
System.out.println("호랑이가 네 발로 걷습니다.");
}
// 다른 동물과는 사자만의 차별화된 기능
public void hunting() {
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal{
@Override
public void move() {
//super.move();
System.out.println("독수리가 두 발로 걸어 다닙니다.");
}
// 다른 동물과는 독수리만의 차별화된 기능
public void flying() {
System.out.println("독수리가 날개를 활짝 펴고 날아 다닙니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
AnimalTest test = new AnimalTest();
// test.moveAnimal(hAnimal);
// test.moveAnimal(tAnimal);
// test.moveAnimal(eAnimal);
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for(Animal animal : animalList) {
animal.move();
}
}
/*
hAnimal, tAnimal, eAnimal 모두 Animal을 상속 받기 때문에 모두 Animal 타입으로 매개변수로 형 변환이 가능하다.
그리고 animal.move를 호출할 경우, 어떤 인스턴스형이 들어갔느냐에 따라 move의 implementation이 달라진다.(가상 메서드)
이것이 바로 다형성이다..
== 다형성의 순서 ==
상속 > 메서드 오버라이딩 > 상위클래스로 형 변환
================
* 참고-다형성을 인터페이스로도 구현 가능하다.
다형성이란 이처럼 다른 클래스들이 한꺼번에 마치 동일한 타입처럼 사용되지만 실제적인 implementation은 각각 다르게
나타날 수 있는 것이다.
*/
public void moveAnimal(Animal animal) {
animal.move();
/*
이 타입에서는 Human의 readBook 메서드는 사용 할 수 없다.
사용하려면 다운 캐스팅이 필요하다.
*/
}
}
다형성을 사용하는 이유
- 위 소스 코드의 예처럼 동물을 추가하는 경우
- 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있다.
- 그렇지 않는 경우에는 많은 if/ else if문이 구현되어 복잡하며, 코드의 유지보수가 어려워진다.
- 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능을 구현한다.
ex) 상위 클래스의 move(), 독수리 하위 클래스 flying() 메서드 구현 - 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있다.
728x90
'개발공부 > Java' 카테고리의 다른 글
[JVM] Metaspace 옵션(MinMetaspaceFreeRatio/MaxMetaspaceFreeRatio) 관련 정리 내용 (0) | 2022.09.14 |
---|---|
[Java] 17. 다형성(polymorphism) 예제 (0) | 2022.01.26 |
[Java] 16. 메서드 재정의(Overriding)와 가상 메서드 원리 (0) | 2022.01.24 |
[Java] 15. 상속에서 클래스 생성과 형 변환 (0) | 2022.01.24 |
[JVM GC] GC 종류와 동작 방식과 G1GC 튜닝 포인트 (0) | 2022.01.05 |