상속 관계에서만 성립되는 다형성 메카니즘에 대해 알아보자.
자바의 상속에 대해선
https://velog.io/@eunhye_/Java-java%EC%9D%98-%EC%83%81%EC%86%8D%EA%B3%BC-supersuper
다형성(polymorphism) : 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리이다.
다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알수 없어도 오버라이딩을 통해 자식 클래스를 접근할 수 있다.
-> 코드의 재사용성을 향상시킨다.
1. 부모-자식 간 클래스 상속이 이루어져야 한다.
2. 다형성이 보장되기 위해서는 하위 클래스의 메소드가 반드시 재정의되어 있어야 한다.
3.부모 타입으로 자식클래스를 업캐스팅하여 객체를 생성해야 한다.
class Parent1{
int no1 = 10; //부모 클래스 변수
Parent3(){
}
}
public class Child1 extends Parent1 {
int no2 = 100; //자식 클래스 변수, 부모 클래스 access 불가
public Child1() {
}
public static void main(String[] args) {
//조건3.부모 타입으로 자식클래스를 업캐스팅하여 객체를 생성
Parent1 c2 = new Child1(); //다형성 적용된 객체 생성
System.out.println(c2.no1); // 10 -> 부모 클래스 변수는 access 가능
c2.no1 = 1000; //부모 클래스 변수는 access 가능
System.out.println(c2.no1); // 1000
c2.no2 = 2000; //에러!!!
//부모타입 변수로는 자식클래스 변수 access 절대 불가
--해결--
기존 부모 클래스 타입의 변수를 (자식클래스)를 통해 타입 변경 후
공유하는 변수를 통해 자식 클래스와 부모 클래스의 변수 모두 접근이 가능하다.
// 자식 클래스 변수 = (자식클래스)부모클랫 타임의 변수;
Child1 c22 = (Child1)c2;
c22.no2 = 2000;
System.out.println(c22.no2);
c2.no1 = 10000; //1000 -> 10000으로 변경
System.out.println(c22.no1);
}
}
output:
2000
10000
상속관계에 있는 객체들의 타입을 비교한다.
비교하는 객체가 해당하는 타입이 맞다면 true, 아니면 false를 반환한다.
class A{}
class B extends A{}
class D extends A{}
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
D d = new D();
System.out.println(a instanceof A);//true : a가 참조하는 타입 == A 확인
System.out.println(a instanceof Object); //true
System.out.println(a instanceof B);//false
}
}