다형성
[Polymorphism]
: 여러가지 형태를 가질 수 있는 능력
같은 부모타입이지만 부모타입 변수에 대입된 자식객체가 부모타입의 선언된 메소드를 재정의한 경우, 부모타입 메소드를 수행했을 때 대입된 자식객체의 재정의된 다양한 성질을 가지는 메소드가 수행됨으로써 다양한 결과가 나오는 이 성질을 "다형성"이라고 한다. 부모 타입에는 모든 자식 객체가 대입 가능하다.
= 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.
참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.
(* 클래스는 상속을 통해서 확장될 수는 있어도 축소될 수는 없으므로, 조상 인스턴스의 멤버 개수는 자손 인스턴스의 멤버 개수보다 항상 적거나 같다.)
조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.
1. 목적: 부품관계의 필드에 실제 부품객체를 조립할 수 있는 수단이다.
2. 전제조건: 부모/자식 상속관계를 요구한다
3. 다형성-1: 위 2의 전제조건하에 아래가 성립된다
부모타입 참조변수=자식객체;가 성립된다.
4. 다형성-2: 3이 만족하는 조건하에 자식객체가 상속받은 부모객체의 메소드를 재정의한다면 부모객체.메소드() 수행할 때 자식객체의 재정이된 메소드가 호출된다.
참조변수의 형변환
기본형 변수와 같이 참조변수도 형변환이 가능하다. 단, 서로 상속관계에 있는 클래스 사이에서만 가능하기 때문에 자손타입의 참조변수를 조상타입의 참조변수로, 조상타입의 참조변수를 자손타입의 참조변수로의 형변환만 가능하다.
자손타입 -> 조상타입(Up-Casting) : 형 변환 생략가능
자손타입 <- 조상타입(Down-Casting): 형 변환 생략불가
class Car {
String color;
int door;
void drive() { // 운전하는 기능
System.out.println("drive, Brrr~")
}
void stop() { // 멈추는 기능
System.out.println("stop!!")
}
}
class PoliceCar extends Car {
void siren() {
System.out.println("eeeeee");
}
}
PoliceCar ⊂ Car
형 변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 반환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조변수의 형변환을 통해서 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것뿐이다.
서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.
자동타입변환
프로그램실행 도중에 자동타입변환이 일어나는것
다형성-1 실험:
부모타입 참조변수 = 자식객체; 의 대입이 가능하다/
이것이 가능한 이유는, 상속관계를 통해, 대/소비교가 가능하고 이를 통해, 자동형변환 발생
출처: https://blanka4.tistory.com/entry/220318-국비지원-교육-15일차?category=1003003 [BLANK A4]
다형성(OOP의 핵심feature)의 조건
1. 부모/ 자식 상속관계를 가져야 한다.
2. 자식 클래스에서 부모 클래스의 메소드를 재정의(메소드 오버라이딩)해야 한다.
3. 자동형변환 조건이 성립되어야 한다.
참고문헌: 자바의 정석, 이것이 자바다
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 예외 (0) | 2022.04.03 |
---|---|
[JAVA] 추상 (0) | 2022.04.03 |
[JAVA] 인터페이스 (0) | 2022.03.31 |
[JAVA] 제어자 (0) | 2022.03.30 |
[JAVA] import문 (0) | 2022.03.30 |