[Java][패스트캠퍼스]다형성

김주현·2021년 4월 23일
0

다형성(polymorphism)이란

하나의 코드가 여러 자료형으로 구현되어 실행되는 것
같은 코드에서 여러 실행결과가 나옴

정보은닉,상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나
객체지향 프로그래밍의 유연성,재활용성,유지보수성에 기본이 되는 특징임

package polymorphism;

class Animal{
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
}

class Human extends Animal{
	public void move() {
		System.out.println("사람이 두발로 걷습니다.");
	}
}

class Tiger extends Animal{
	public void move() {
		System.out.println("호랑이가 네 발로 뜁니다.");
	}
}

class Eagle extends Animal{
	public void move() {
		System.out.println("독수리가 하늘을 날아갑니다.");
	}
	public void readBook() {
		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);
}

	public void moveAnimal(Animal animal) {
		//하나의 코드가 여러자료형이 구현이 되서 다른 실행이 이루어지는 경우를 다형성이라고 한다.
		//각각의 클래스를 만들더라도  동일한 메서드로 호출할 수 있다.
		animal.move();
	}
}

다형성의 장점

다양한 여러 클래스를 하나의 자료형(상위 클래스)으로 선언하거나 형변환하여 각 클래스가 동일한 메서드를 오버라이딩한 경우, 하나의 코드가 다양한 구현을 실행할 수 있음

유사한클래스가 추가되는 경우 유지보수에 용이하고, 각 자료형마다 다른 메서드를 호출하지 않으므로 코드에서 많은 if문이 사라짐

다운캐스팅과 instanceof

하위클래스로 형변환, 다운캐스팅

묵시적으로 상위 클래스 형변환된 인스턴스가 원래자료형(하위클래스)으로 변환되어야 할 때 다운캐스팅이라 함

하위클래스로의 형변환은 명시적으로 되어야함

Customer vc=new VIPCustomer(); //묵시적
VIPCustomer vCustomer=(VIPCustomer)vc; //명시적

package polymorphism;

import java.util.ArrayList;

class Animal{
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
}

class Human extends Animal{
	public void move() {
		System.out.println("사람이 두발로 걷습니다.");
	}
	public void readBook() {
		System.out.println("사람이 책을 읽습니다.");
	}
}

class Tiger extends Animal{
	public void move() {
		System.out.println("호랑이가 네 발로 뜁니다.");
	}
	
	public void hunting() {
		System.out.println("호랑이가 사냥을 합니다.");
	}
}

class Eagle extends Animal{
	public void 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();
	
		//Human클래스로 다운캐스팅하여야한다.
//		Human human=(Human)hAnimal;
//		human.readBook();
		
		//hAnimal이 Human타입의 변수인지 판단하여 맞으면 true,틀리면  false를 반환함
//		if(hAnimal instanceof Human) {
//			Human human=(Human)hAnimal;
//			human.readBook();
//		}
		
		
//		AnimalTest test=new AnimalTest();
//		test.moveAnimal(hAnimal);
//		test.moveAnimal(tAnimal);
//		test.moveAnimal(eAnimal);
		
		ArrayList<Animal> animalList=new ArrayList<Animal>();
		animalList.add(hAnimal);
		animalList.add(tAnimal);
		animalList.add(eAnimal);
		
		//다운캐스팅된 animalList를 출력
		AnimalTest test=new AnimalTest();
		test.testDownCasting(animalList);
//		for(Animal animal:animalList) {
//			animal.move();
//		}
}

	public void testDownCasting(ArrayList<Animal> list) {
		for(int i=0;i<list.size();i++) {
		Animal animal=list.get(i);
		
			if(animal instanceof Human) {
			//Human클래스로 다운캐스팅해라
			Human human=(Human)animal;
			human.readBook();
			}
			else if(animal instanceof Tiger) {
				Tiger tiger=(Tiger)animal;
				tiger.hunting();
			}
			else if(animal instanceof Eagle) {
				Eagle eagle=(Eagle)animal;
				eagle.flying();			
			}else {
				System.out.println("error");
			}
		
		}
	}
	public void moveAnimal(Animal animal) {
		//하나의 코드가 여러자료형이 구현이 되서 다른 실행이 이루어지는 경우를 다형성이라고 한다.
		//각각의 클래스를 만들더라도  동일한 메서드로 호출할 수 있다.
		animal.move();
	}
}

다운캐스팅을 안정적으로 하기 위해서는 instanceof를 사용하여야한다.

0개의 댓글