공부/Java

다형성 Polymorphism

진호진호 2024. 2. 22. 17:46

 

Bird Worm Cat
cry() chirp() croak()

 

↓ 타입이 다른 객체들이 동일한 개념의 행위를 수행할 때, 같은 이름을 부여하고 다르게 행동하게 하는 것이 좋다.

Bird Worm Cat
cry() cry() cry()

 

다형성

타입이 다른 객체가 같은 이름, 다른 행동의 메소드를 사용할 수 있게 하는 동적 바인딩 과정

 

1. 슈퍼클래스에서 상위 개념 정의

public class Animal {
    void cry() {}
}
//abstract class, interface 모두 가능

2. 각 서브클래스에서 재정의/구현

public class Cat extends Animal{
    @Override
    void cry() {
        System.out.println("야옹");
    }
}
public class Sparrow extends Animal{
    @Override
    void cry() {
        System.out.println("짹짹");
    }
}

3. 슈퍼클래스 타입의 참조변수 선언

public class Polymorphism {
    public static void main(String[] args) {
        Animal cat = new Cat();
        Animal sparrow = new Sparrow();

        cat.cry(); //야옹
        sparrow.cry(); //짹짹
    }
}

 

다형성의 장점

클래스 타입에 관계없이 하나의 추상적인 함수 이름을 사용.

새로운 타입의 서브클래스를 추가해도 프로그램 변경이 거의 없다.

public class Polymorphism2 {
	public static void main(String[] args) {

		Animal[] animals = { 
	    	new Cat(),
			new Sparrow(),
	    	new Dodo(), 	// 프로그램에 새로운 서브클래스를
			new Caw()		// 추가하여도
	 	};

	 	for (Animal x : animals) {		// 변경되지
		  	x.cry();					// 않음.
      	}
   	}
}