1. 다형성

다형성이란?

<aside> 💡 변수, 함수, 클래스 등에서 동일한 이름이 다양한 의미로 해석될 수 있도록 구현하는 것

</aside>

다형성의 구현

메서드 오버로딩

동일한 이름의 메서드를 여러 개 정의하는 메서드 오버로딩은 다형성을 구현한 것이다.

메서드 오버라이딩

상속받은 상위 클래스의 메서드를 재정의하는 메서드 오버라이딩 역시 다형성을 구현한 것이다.

다형적 참조

상위클래스 타입의 참조변수로 하위 클래스 객체를 참조가능한 것을 말한다. 상속 관계를 활용하여 한 타입의 변수로 여러 하위 객체를 참조가능한 것 역시 다형성을 구현한 것이다.

Person person = new Person();
Programmer programmer = new Programmer();

Person programmer = new Programmer(); //다형적 참조의 예1
Person[] persons = {dancer, programmer, singer}; //다형적 참조의 예2

상위타입으로 하위타입의 객체를 선언하면, 사용할 수 있는 멤버의 수에 차이가 있다. 즉, 상위타입에서 지정한 멤버(필드와 메서드)만 사용할 수 있다는 것이다.

Untitled

타입 형변환

조상-자손 관계는 서로 형변환이 가능하지만 같은 조상 아래에 있는 형제 클래스끼리는 형변환이 불가능하다.

형변환 시, 자손 → 조상은(업캐스팅) 자동 형변환이 가능하다.

조상 → 자손은(다운캐스팅) 명시적으로 캐스팅해주어야 한다.

Programmer programmer = new Programmer();
Person person = (Person)programmer; //업캐스팅. 생략가능

Person person2 = new Person();
Dancer dancer = (Dancer)person2; //다운캐스팅. 생략불가

Singer singer = (Singer)dancer; //Error.

업캐스팅했을 때에는, 부모 클래스에 선언된 멤버만 사용 가능하다. 단, 자손 클래스에서 오버라이딩된 메서드가 있다면 자손클래스의 메서드가 호출된다.

person.walk() //Programmer클래스에서 오버라이딩한 메서드 호출
person.coding() //Error.