: 한 객체가 여러 타입의 객체로 취급될 수 있는 능력
🤔
그러나 다형적 참조가 왜 필요할까?
poly의 타입을 자식으로 하여 바로 사용하면 안될까란 의문이 들 수 있다.
(타입)처럼 괄호와 그 사이에 타입을 지정하면 참조 대상을 특정 타입으로 변경할 수 있다.
일시적 다운캐스팅한다면?
((child) poly).childMethod();
업캐스팅의 경우 객체 생성 시 해당 타입의 상위 부모 타입은 모두 생성되므로 메모리 상에 인스턴스가 모두 존재하기 때문에 항상 안전하다.
반면, 다운캐스팅의 경우 객체 생성 시 부모 타입은 모두 함께 생성되지만 자식 타입은 생성되지않아 하위 타입의 인스턴스가 존재하지 않는다.
Parent parent = new parent();
Child child = (Child) parent // 캐스팅오류
어떤 인스턴스를 참조하는지 알고싶다면 사용
변수는 오버라이딩이 안되며, 메서드는 가능하다?
-> ⭐️ 오버라이딩된 메서드는 항상 우선권을 가진다.⭐️
: 추상적인 개념을 제공하는 클래스며, 인스턴스가 존재하지 않고 상속 목적으로 사용되고 부모 클래스 역할을한다.
public
, abstract
이다.public abstract
를 생략할 수 있다. 참고로 생략이 권장된다. 인터페이스를 사용하는 이유(제약, 다중구현)
: 인터페이스 메서드를 반드시 구현해라는 제약을 주기 위해서이다. 또한 부모를 여러명 두는 다중 구현이 가능하다.
추상화 캡출화 상속 다형성
인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경.
클라이언트 코드를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
역할과 구현을 분리하여 확장 가능한 설계와 클라이언트에 영향을 주지 않는 변경가능한 설계를 하는 것이 중요 ⭐️
: 확장에는 열려있고, 변경에는 닫혀있다는 뜻
-> 다형성을 사용했기에 가능
디자인 패턴 중 하나. 전략패턴은 알고리즘을 클라이언트 코드의 변경 없이 쉽게 교체할 수 있다.