객체지향 프로그래밍 기술 - 상속, 은닉, 다형성
> 다형성 polymorphism
객체가 여러 형태를 가짐 - 하나의 객체가 여러가지 유형으로 사용됨
상속을 전제조건으로 함
부모 타입에 모든 자식 객체가 대입될 수 있음 (자바는 자식클래스가 부모클래스의 타입을 가질 수 있게 허용)
부모클래스 변수 = new 자식클래스()
- 부모클래스에 있는 기능만 사용 가능
- 오버라이딩된 메소드는 먼저 실행됨
class A {}
class B extends A {} //부모클래스A 자식클래스B
public class Basic {
    B b = new B();
    A a = b; 
    // B -> A 자동형변환
    // A a = new B();
    
    //자바 최상위 부모클래스 Object _ 모든 객체가 저장될 수 있음
    Object o1 = new A();
    Object o2 = new B();
    Object o3 = "a";
public class Parent {
    public void method1() {
        System.out.println("부모의 1번 메소드");
    }
    public void method2() {
        System.out.println("부모의 2번 메소드");
    }
}
public class Child extends Parent {
    public void method2() {
        System.out.println("오버라이딩 2번 메소드");
    }
    public void method3() {
        System.out.println("자식의 메소드 3번");
    }
}
public class MainClass {
    public static void main(String[] args) {
        Child c = new Child();
        c.method1(); //상속받은 메소드
        c.method2(); //오버라이딩된 메소드
        c.method3(); //자식클래스의 고유한 메소드
       
        Parent p = c; //다형성
        //Parent p = new Child();
        System.out.println(p == c); //true
        
        p.method1(); //부모클래스의 메소드 
        p.method2(); //자식클래스에서 오버라이딩 된 메소드
        //p.method3(); //자식클래스의 고유한 메소드이므로 사용 불가
    }
}
> 클래스 캐스팅 class casting
강제 타입 변환 (type casting) : 부모클래스 타입 → 자식클래스 타입
조건: 자식클래스 타입 → 부모클래스 타입 변환(promotion)이 한번 됐던 객체만 가능
이로써 자식클래스의 고유한 메소드를 사용하지 못했던 문제가 해결됨
자식클래스 변수 = (자식클래스) new 부모클래스();
ex. Child c = (Child) new Parent();
ex. Parent p = new Child(); → Child c = (Child)p;
public class Parent {
    public void method1() {
        System.out.println("부모의 1번 메소드");
    }
    public void method2() {
        System.out.println("부모의 2번 메소드");
    }
}
public class Child extends Parent {
    public void method2() {
        System.out.println("오버라이딩 2번 메소드");
    }
    public void method3() {
        System.out.println("자식의 메소드 3번");
    }
}
public class MainClass {
    public static void main(String[] args) {
        Child c = new Child();
        c.method1(); //상속받은 메소드
        c.method2(); //오버라이딩된 메소드
        c.method3(); //자식클래스의 고유한 메소드
       
        Parent p = c; //다형성
        //Parent p = new Child();
        System.out.println(p == c); //true
        
        p.method1(); //부모클래스의 메소드 
        p.method2(); //자식클래스에서 오버라이딩 된 메소드
        
        //p.method3(); //자식클래스의 고유한 메소드이므로 사용 불가
        
        Child cc = (Child)p; //class 형변환
        System.out.println(cc == p); //true
        cc.method1();
        cc.method2();
        cc.mehtod3(); //자식클래스의 고유한 메소드 사용가능
    }
}
> instanceof
객체가 지정한 클래스의 인스턴스인지 아닌지 검사할 때 사용하는 연산자
왼쪽 항의 객체가 오른쪽 항의 클래스의 인스턴스라면 true 반환
ex.
Parent p = new Parent();
Child c = new Child();
p instanceof Parent → true
p instanceof Child → false
c instanceof Parent → true
c instanceof Child → true
Parent p = new Child();
p instanceof Child → true
p instanceof Parent → true
*다형성의 적용
배열에 다형성이 적용되면 부모 타입 배열에 자식 객체가 저장될 수 있다
매개변수에 다형성이 적용되면 자식 객체를 전달할 수 있다
'course 2021 > JAVA' 카테고리의 다른 글
| day15 - final, abstract (0) | 2021.09.08 | 
|---|---|
| day14 - static (0) | 2021.09.07 | 
| day12 - access modifier, encapsulation (0) | 2021.09.02 | 
| day11 - this, super (0) | 2021.08.31 | 
| day10 - inheritance, overriding, overloading (0) | 2021.08.31 |