Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 한번 해블로그

[Java] 20. 다형성과 활용 본문

Java

[Java] 20. 다형성과 활용

hide on bush 2023. 12. 20. 11:31

1. 다형성이란 무엇인가?

- 다형성(message polymorphism) : 상위클래스가 동일한 메시지로 하위클래스를 서로 다르게 동작시키는 객체지향 이론
- 즉, 예시로 부모가 eat이라고 dog/cat 자식에게 메시지를 보내면 자식 클래스가 서로 다르게 개/고양이처럼 먹다라고 출력
- 다형성이 실행되려면 상위 클래스가 명령을 내려야하기 때문에 업캐스팅을 해야 함

ex) Animal x=new Dog();
x.eat(); // 개처럼 먹다

-> 확장, 유지보수 쉬움


2. 다형성 이론을 설명하기 위한 전제조건

- 상속 관계
- override(재정의)
- Upcasting(업캐스팅)
- 동적 바인딩

import fc.java.model.Animal02;
import fc.java.model.Cat02;
import fc.java.model.Dog02;

public class PolyTest02 {
    public static void main(String[] args) {
        //Upcasting으로 객체를 생성
        //상속 관계, 재정의(override), 동적바인딩
        //다형성 : 상위 클래스가 동일한 메세지로 하위 클래스를 서로 다르게 동작시키는 객체지향 원리
        Animal02 x=new Dog02();
        x.eat(); //실행시점에서 사용(호출)될 메서드가 결정되는 바인딩(동적 바인딩)

        x=new Cat02();
        x.eat();
        //Downcasting
        ((Cat02)x).night();
    }
}

 

※ 그럼 여기서 overloading vs override

<overloading>

- 정적 바인딩이며 컴파일 시점에서 사용될 메서드가 결정되는 바인딩
- 프로그램의 실행 속도와는 무관

<override>

- 동적 바인딩이며 실행 시점에서 사용(호출)될 메서드가 결정되는 바인딩
- 프로그램의 실행 속도와 관계가 있다.


3. 다형성 활용(다형성 인수)

- 다형성 인수로 활용하기(즉, 부모를 활용하자)
- 다형성 인수 : 하나의 타입으로 여러 가지 타입을 받을 수 있다
- 단점 : 다른 타입을 받으려면 계속 display가 늘어나야함

public class PolyMethodTest02 {
    public static void main(String[] args) {
        Dog02 d=new Dog02();
        display(d);
        Cat02 c=new Cat02();
        display(c);
    }
    
    private static void display(Dog02 d){
    	d.eat();
    }
    
    private static void display(Cat02 c){
    	c.eat();
    }
}

여기서 cat에 있는 night를 사용하고 싶다면?

public class PolyMethodTest02 {
    public static void main(String[] args) {
        Dog02 d=new Dog02();
        display(d);
        Cat02 c=new Cat02();
        display(c);
    }
    private static void display(Animal02 ani) { //다형성 인수
        ani.eat();
        if(ani instanceof Cat02){
            ((Cat02)ani).night();
        }
    }

}

4. 다형성 활용(다형성 배열)

- 다형성 배열 : 배열은 동일한 자료형만 저장 가능하지만 부모 타입의 배열은 자식 타입을 저장 가능
- 하나의 배열에 서로 다른 타입을 저장 가능

public class PolyArrayTest02 {
    public static void main(String[] args) {
        Dog02 d=new Dog02();
        Cat02 c=new Cat02();
        //Dog와 Cat을 저장할 배열 생성
        Animal02[] ani=new Animal02[2]; //다형성 배열
        ani[0]=d;
        ani[1]=c;
        display(ani);
    }
    public static void display(Animal02[] ani){
        for (int i = 0; i < ani.length; i++) {
            ani[i].eat();
            if(ani[i] instanceof Cat02)
                ((Cat02)ani[i]).night();
        }
    }
}