다형성

  • 객체 지향 프로그래밍의 특징 중 하나다.
  • 객체 지향 프로그래밍의 꽃
  • 이름 그대로 다양한 형태를 뜻한다.
  • 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻하고, 하나의 객체는 하나의 타입으로 고정되어 있지만 다형성을 사용하면 하나의 객체가 다른 타입으로 사용될 수 있다는 뜻이다.

다형성의 핵심 이론

  • 다형적 참조
  • 메서드 오버라이딩

다형적 참조

  • 부모 타입의 변수가 자식 인스턴스 참조

→ 부모 class 🔽

package poly.basic;

public class Parent {
    public void parentMethod() {
        System.out.println("Parent.parentMethod");
    }
}

→ 상속 받은 자식 class 🔽

package poly.basic;

public class Child extends Parent{
    public void childMethod() {
        System.out.println("Child.childMethod");
    }
}

→ 부모 타입 변수 선언 하고 자식 타입으로 객체 생성 🔽

package poly.basic;

public class PolyMain {
    public static void main(String[] args) {
        // 부모 변수가 자식 인스턴스 참조(다형적 참조)
        System.out.println("Parent -> Child");
        Parent poly = new Child();
        poly.parentMethod();
    }
}

⇒ 위와 같이 부모 타입 변수가 자식 타입 객체를 담을 수 있다.

Parent poly = new Child();

코드 실행 의 로직을 보면

  1. Child 타입으로 객체가 생성된다
  2. Child 타입으로 생성된 객체 내부에는 Parent 영역과 Child 영역이 생성 된다.
  3. 하지만 poly 변수는 Parent 타입으로 생성 했기 때문에 생성된 객체 내에 Parent 영역만 끌어다 쓰게 된다.

다형적 참조 결론

  • 부모 타입은 → 자식을 담을 수 있다.
    • 자식 뿐 아니라 자손들의 타입도 담을 수 있다.
    • 하지만 부모는 자식의 기능을 호출할 수 없다.
  • 자식 타입은 → 부모를 담을 수 없다.

다형적 참조에서 부모 타입이 자식 타입기능을 사용하지 못하는 이유

  • 상속 관계로 객체를 생성 했을 때는 자식이 누가 부모 인지 찾을 수 있지만 부모는 누가 자식인지 찾을 수 없다.( 마치 미래에 내가 누구를 낳을지 모르는 것처럼? )
  • Parent 클래스의 정보에 누가 자식인지 정보도 없기 때문이기도 해서 못 찾는다.
  • 하지만 자식을 찾고 싶을 때 캐스팅 이란 기능을 사용하면 된다.

+ Recent posts