다형성은 '여러 개의 형태를 갖다'라는 의미이다.
자바에서 다형성이란, 같은 자료형에 여러 가지 객체를 대입하여 목적에 맞는 결과를 얻을 수 있는 성질이다.
다형성은 다음과 같은 특징을 가진다.
- 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조할 수 있다.
(부모 클래스 Parent와 자식 클래스 Child가 있고, 서로 상속관계에 있다라고 전제로 깔고 예시를 보자.)
Parent child = new Child();
## 자식 클래스(Child) 인스턴스를 생성하고, 부모 클래스(Parent) 타입의 참조변수에 할당
- 부모 클래스 타입의 참조변수로 자식 클래스의 멤버들에 접근할 수 있다.
- 부모 클래스에서 상속받은 멤버만 접근이 가능하고, 자식 클래스에서 만들어진 멤버들은 접근이 불가능하다.
- 자식 클래스 타입의 참조변수로 부모 타입의 인스턴스로 참조 불가능하다.
- 반드시 상속관계가 전제되어야 한다.
- 상속과 인터페이스를 통해 이루어지고, 인터페이스가 더 다형성에 유연함을 가진다.
다형성이라는 성질은 참조변수의 타입 변환에서도 나타난다.
참조변수의 타입 변환은 사용할 수 있는 멤버의 개수를 조절하는 것을 의미한다.
타입 변환을 위해서는 다음 세 가지 조건을 충족해야 한다.
- 상속 관계
- 하위 클래스 타입에서 상위 클래스 타입으로의 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있다.
Child child = new Child();
Parent parent = (Parent) child; ## 업캐스팅; (Parent) 생략 가능
- 반대로 상위 클래스 타입에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시해야한다.
Child child = new Child();
Parent parent = (Parent) child;
Child child2 = (Child) parent; ## 다운캐스팅; 반드시 형변환 연산자를 명시
여기서, 주의해야 할 점이 있다.
다운캐스팅은 전제가 업캐스팅이 이루어진 상태에서 이루어져야 한다.
위와 같이, 상위 클래스 타입으로 객체가 생성된 후에 다운캐스팅을 시도하면, 에러가 뜬다.
반드시, 다운캐스팅의 전제는 업캐스팅이 이루어진 후라는 것을 잊지말자.
instanceof 연산자는 객체의 타입을 확인하고, 형변환 즉 캐스팅이 가능한지의 여부를 boolean 타입으로 나타내어준다.
이 연산자 같은 경우는, 학습 당시에 상당히 헷갈렸던 부분이었고 다음 블로그를 통해서 이해가 쉽게 되었다.
(참고 : https://mine-it-record.tistory.com/120)
나 역시도 instanceof 연산자에 대해 가물가물해지면 참고할 생각으로 올려둔다.
이후, 다형성에 관한 내용을 더 학습하게 되면 내용을 덧붙일 예정이다.
피드백 환영합니다.
'Develop > Java' 카테고리의 다른 글
예외 정보를 얻는 방법 3가지 (0) | 2022.09.13 |
---|---|
추상화(Abstraction) (0) | 2022.09.10 |
캡슐화(Encapsulation) (0) | 2022.09.06 |
상속(Inheritance) (0) | 2022.09.06 |
구분자를 기준으로 문자열 분리하는 방법 (0) | 2022.09.06 |