다형성(Polymorphism)이란 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 말합니다.

대표적으로 오버로딩(Overloading), 오버라이딩(Overriding)이 다형성을 나타냅니다.

다형성을 위해 JAVA는 상위 클래스로 타입 변환을 허용합니다. 즉, 상위 클래스 타입에 모든 하위 클래스 객체가 대입될 수 있습니다.

예를 들어 자동차를 설계할 때, 타이어 클래스 타입을 적용했다면 이 클래스를 상속한 실제 타이어들은 어떤 것이든 상관없이 대입이 가능합니다. 즉, 금호 타이어나 넥센 타이어 등을 사용하지만 각 타이어의 성능은 다르게 나옵니다. 이게 다형성입니다.

코드로 다형성의 예를 나타내면 다음과 같습니다.

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

class Human extends Animal{
	public void move() {
		System.out.println("사람이 두발로 걷습니다.");
	}
	
	public void readBooks() {
		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();
		
	//	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);
		
		for(Animal animal : animalList) {
			animal.move();
		}

	}	
	
	public void moveAnimal(Animal animal) {
		animal.move();
		
	}
}

결과

사람이 두발로 걷습니다.
호랑이가 네 발로 뜁니다.
독수리가 날개를 쭉 펴고 멀리 날아갑니다

호출하려는 함수의 선언부 파라미터가 상위 클래스인 Animal 타입이지만 가상 메서드의 원리로 인해 각각 인스턴스의 메서드가 호출이 되어 다른 결과값이 출력이 됩니다. 이것이 다형성입니다.

이러한 다형성을 사용하는 이유는 무엇일까요?

상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있습니다.

하지만, 사용하지 않는 경우 if - else if - else 문으로 코드가 복잡해지고 유지 보수하기가 어려워질 수 있습니다.

상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현을 하는 것이 좋고 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있다는 장점이 있습니다.

이상으로 자바의 특성 중 하나인 다형성에 대해서 간단히 알아봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글