course 2021/JAVA

day13 - polymorphism

코딩하는토끼 2021. 9. 5. 15:45

객체지향 프로그래밍 기술 - 상속, 은닉, 다형성

> 다형성 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

 

*다형성의 적용

배열에 다형성이 적용되면 부모 타입 배열에 자식 객체가 저장될 수 있다

매개변수에 다형성이 적용되면 자식 객체를 전달할 수 있다