다형성(polymorphism)
여러가지 형태를 가질 수 있는 능력
자바에서는 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있다.
Tv t = new CaptionTv();
Tv타입 참조변수로는 CaptionTv인스턴스 중에 Tv 클래스의 멤버들만 사용할 수 있다.
CaptionTv c = new Tv(); //컴파일 에러 발생
자손타입의 참조변수로 조상타입의 인스턴스 참조는 불가능하다.
형변환
자손타입 -> 조상타입 : 형변환 생략 가능
자손타입 <- 조상타입 : 형변환 생략 불가
상속관계가 아닌 클래스 간의 형변환은 불가능하다!
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
car = fe; // Car = (Car)fe;에서 형변환 생략됨
fe2 = (FireEngine)car; // 형변환 생략 불가
형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 법위(개수)를 조절하는 것 뿐이다.
instanceof
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용
주로 조건문에 사용되며, 연산 결과로 boolean값이 반환된다.
참조변수 instanceof 타입(클래스명)
실제 인스턴스와 같은 타입의 instanceof연산 이외에 조상 타입의 연산에도 true가 나온다!
즉, 검사한 타입으로 형변환을 해도 아무런 문제가 없다.
참조변수와 인스턴스 연결
멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우, 참조변수의 타입에 따라 달라진다.
메서드의 경우, 조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에도 참조변수 타입과 관계없이 실제 인스턴스의 메서드가 호출된다.
public class Parent {
int x = 10;
void method() {
System.out.println("Parent Method");
}
}
public class Child extends Parent {
int x = 20;
void method() {
System.out.println("Child Method");
}
}
public class BindingTest {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("p.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
// 멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우, 참조변수 타입에 따라 달라진다.
// 메서드의 경우 항상 실제 인스턴스의 메서드(오버라이딩된 메서드)가 호출됨
}
}
//결과
//p.x = 10
//Child Method
//c.x = 20
//Child Method
'JAVA' 카테고리의 다른 글
[Java] 인터페이스(interface) (0) | 2023.07.06 |
---|---|
[Java] 추상클래스(abstract class) (0) | 2023.07.05 |
[Java] 상속(Inheritance) (0) | 2023.07.05 |
[JAVA] DTO와 VO (0) | 2023.05.01 |
Annotation 어노테이션 (0) | 2023.04.12 |