[java] 다형성(Polymorphism)

송어·2023년 11월 13일

다형성이란?

다형성이란 상위클래스가 동일한 메세지로 하위클래스를 서로 다르게 동작시키는 객체지향 이론이다.

쉽게 말하면, 한 객체에 여러가지 타입을 대입할 수 있다는 의미이다. 다형성을 활용하면 한 객체가 여러가지 형태를 가질 수 있게되고, 이를 통해 코드의 재사용성 및 확장성이 향상되고 유지보수가 용이해진다.

전제조건

  1. 상속관계가 되어야한다.
  2. 객체 생성을 upcasting 으로 해야한다. (상위클래스가 하위클래스에게 메세지를 보내야 하기 때문이다)
  3. 하위클래스가 반드시 override 해야한다. ( 다형성 보장을 위해)
  4. 동적 바인딩을 통해 실현된다.

다형성 인수

다형성 인수란 메서드나 함수의 매개변수(parameter)를 다형성을 활용해 여러 타입의 객체를 전달할 수 있는 것을 말한다.

PolyMethodTest {
	public static void main(String[] args) {
    	Dog d = new Dog();
        display(d);
        Cat c = new Cat();
        display(c);
    }
    
    public static void display(Animal animal) { // 다형성 인수
    	animal.eat();
    }
}

위의 코드에서 display()메서드는 Animal타입의 매개변수를 받는다. 하지만 전달되는 객체는 Dog, Cat타입이다. Dog, Cat 클래스는 Animal을 상속받고 있어, 메서드 내부에선 전달된 객체를 Animal타입으로 참조해 처리한다.(부모타입이기 때문)

다형성 인수를 사용해 코드의 유연성과 확장성을 향상시킬 수 있다.

instanceof 연산자

instanceof 연산자는 객체의 타입을 확인하기 위해 사용되는 연산자 사용 문법이다.
instanceof를 사용하여 특정 객체가 특정 클래스의 인스턴스인지를 확인할 수 있다. 이를 통해 객체의 상속관계나 인터페이스의 구현 여부를 확인할 수 있다.

public static void display(Animal animal) { // 다형성 인수
    	animal.eat();
        if(animal instanceof Cat) {
        	System.out.println("매개변수로 " +
            				animal.getClass().getSimpleName() + "을 받음");
        	((Cat)animal).night(); // 매개변수로 받은 객체가 Cat인 경우 night()실행
        }
    }

참고 : casting이 잘못된 경우 ClassCastException발생함

다형성 배열(상위타입 배열)

다형성 배열이란 배열에 다형성 개념을 적용한 것으로, 여러 타입의 객체를 하나의 배열에 저장할 수 있다는 특징이 있다.
일반적으로 배열은 동일한 타입의 데이터만 저장할 수 있지만, 다형성 배열은 부모클래스를 상속받은 자식클래스의 객체를 모두 저장할 수 있다.(하나의 배열에 서로 다른 타입을 저장)

public class PolyArrayTest {
    public static void main(String[] args) {
        Dog d = new Dog();
        Cat c = new Cat();

        //Dog, Cat을 저장할 배열을 생성(다형성 활용)
        Animal[] animals = {new Dog(), new Cat()}; // 다형성에 의해 배열 내부에서 Animal타입으로 참조되어 처리한다.

        for(Animal animal : animals) {
            animal.eat(); // 오버라이드된 자식 타입의 메서드가 출력됨
            if(animal instanceof Cat) {
                System.out.println(animal.getClass().getSimpleName() + "타입입니다.");
                ((Cat) animal).night(); // Cat타입인 경우 night()메서드 실행
            }
        }
    }
}

다형성 배열을 활용해 서로 다른 타입의 객체를 하나의 배열에 함께 저장하고 관리할 수 있다.

0개의 댓글