Coding/Java

Java Polymorphism(다형성)

heyoon2j 2020. 9. 17. 00:29

■ Java Polymorphism(다형성)

- Overloading에 의한 다형성

- Override 에 의한 다형성(상속 이용)


 다형성 특징

1. 부모 클래스 타입으로 자식 클래스 타입의 객체를 참조하는 특징

- 부모 클래스 타입으로 자식 클래스(메소드, 멤버 변수)에 접근할 수 없다.

class Foo{
    public void methodA(){
    }
}

class Bar extends Foo{
    public void methodB(){
    }
}

public class Polymorphism {
    public static void main(String[] args) {
        Bar bar = new Bar();    // 자식 객체를 생성
        Foo foo = (Foo)bar;     // 부모 클래스 타입으로 자식 객체를 받음

        foo.methodA();
        // foo.methodB();   // 자식 클래스 메소드는 사용 불가능

        Foo foo1 = new Foo();
        // Bar bar1 = (Bar)foo1;   // 자식 클래스 타입으로 부모 객체를 받음
        // 문법 오류는 아니지만, 런타임 오류가 발생
        // bar1.methodA();     // 문법 오류 x
        // bar1.methodB();     // 문법 오류 x

        // 힙 영역에는 계속 자식 객체가 있었던 것
        Bar bar1 = (Bar)foo;    // 자식 클래스 타입으로 자식 객체를 받음
        bar1.methodA();
        bar1.methodB();
    }
}

 

* 자식 클래스로 부모 클래스를 참조하려 하면, java.lang.ClassCastException 오류 발생

public class Main {
    public static void main(String args[]) {
        Foo foo = new Foo();
        Bar bar;

        // bar = (Bar)foo; // error
        if (foo instanceof Bar) { // returns false
            bar = (Bar)foo;
        }
    }
}

 

 

2. 메소드 오버라이딩은 메모리 상의 객체 타입을 따른다(실제 객체를 본다)

 - 가상 메소드 호출: Virtual Method Call

class Foo{
    public String x = "Super";

    public void methodA(){
        System.out.println("Super method");
    }
}

class Bar extends  Foo{
    public String x = "Sub";

    @Override
    public void methodA() {
        System.out.println("Sub method");
    }
}

public class poly02 {
    public static void main(String[] args) {
        Bar bar = new Bar();
        Foo foo = (Foo) bar;

        System.out.println(bar.x);  //Sub
        bar.methodA();  // Sub Method

        System.out.println(foo.x);  // Super
        foo.methodA();  // Sub Method, Virtual Method Call
    }
}

 

 

3. 공변 반환 타입(Covariant return type)

 - 자기 자신을 반환하는 경우, Overriding이라도 Return Type을 바꿀 수 있다. 

class Foo {
    public Foo getInstance(){
        return this;
    }
}

class Bar extends  Foo{
    @Override
    public Bar getInstance() {  // 오버라이딩이지만, 리턴 타입이 달라질 수 있다.
        return this;
    }
}

 

 

 

'Coding > Java' 카테고리의 다른 글

Java Enumeration(열거형)  (0) 2020.09.17
Java Abstract Class & Interface  (0) 2020.09.17
Java Modifier(제어자)  (0) 2020.09.16
Java Inheritance(상속)  (0) 2020.09.16
JavaDoc 만드는 방법  (0) 2020.09.16