부모-자식 상속 관계에 있는 클래스에서
상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리입니다.
다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해 자식 클래스에 접근할 수 있습니다.
그렇다면 어떻게 부모가 자식이 어떤 일을 하는 지 몰라도, 자식 멤버 함수를 호출시킬 수 있는 것일까요?
이유는 동적 바인딩
때문입니다.
동적바인딩이란, 메서드가 실행 시점에서 성격이 결정되는 바인딩인데요.
프로그램의 컴파일 시점에 부모 클래스는 자신의 멤버 함수밖에 접근할 수 없으나,
실행 시점에 동적 바인딩이 일어나 부모클래스가 자식 클래스의 멤버함수를 접근하여 실행할 수 있습니다.
1) 유지보수가 쉽다
개발자가 여러 객체를 하나의 타입으로 관리가 가능하기 때문에 코드 관리가 편리해 유지보수가 용이합니다.
2) 재사용성 증가
다형성을 활용하면 객체를 재사용하기 쉬워지기 때문에 개발자의 코드 재사용성이 높집니다.
3) 느슨한 결합
다형성을 활용하면 클래스간 의존성이 줄어들며 확장성이 높고 결합도가 낮아져 안전성이 높아집니다.
여기서 문득 든 생각이, 개발하면서 부모클래스로부터 상속받는 자식 클래스들이 또 다른 객체들을 상속 하였을 때, 부모-자식-자식-자식 자식 2번이 에러라면?
이건 하위 자식 객체들이 전부 다 에러가 발생하는 것 아닌가?.
이렇게 연계적인 코딩을 하게된다면? 어떻게 하면 에러 없이 잘 수행할 수 있을까?? 라는 생각을 갖게 되는 내용이었습니다.
결론 : TDD를 잘하자.
1) 상속 관계
다형성을 활용하기 위해서는 필수로 부모-자식 간 클래스 상속이 이루어져야 합니다.
2) 오버라이딩 필수 (자식 클래스에서 메소드 재정의)
다형성이 보장되기 위해서는 하위 클래스 메소드가 반드시 재정의되어 있어야 합니다.
3) 업캐스팅 (자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것)
부모 타입으로 자식클래스를 업캐스팅하여 객체를 생성해야 합니다.
1) 상속 클래스 구현 (부모-자식 클래스 구현)
2) 메소드 오버라이딩
3) 업캐스팅하여 객체 선언
4) 부모 클래스 객체로 자식 메소드 호출
-> 한마디로, 같은 이름의 메서드(함수)를 (재)정의
-> 상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼,
상위 클래스가 가지고 있는 메서드도 하위 클래스로 상속되어 하위 클래스에 사용할 수 있습니다.
또한, 하위 클래스에서 이러한 메서드를 재정의해서도 사용할 수 있습니다.
쉽게 말해 메서드의 이름이 서로 같고, 매개변수가 같고, 반환형이 같을 경우에 상속받은 메서드를 덮어쓴다고 생각하시면 됩니다. '부모클래스의 메서드는 무시하고, 자식 클래스의 메서드 기능을 사용하겠다'와 같습니다.