개발 한번 해블로그
[Java] 20. 다형성과 활용 본문
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();
}
}
}
'Java' 카테고리의 다른 글
[Java] 22. 자바 최상위 포식자 클래스 Object (0) | 2023.12.20 |
---|---|
[Java] 21. 추상클래스와 인터페이스의 두둥등장 (2) | 2023.12.20 |
[Java] 19. 객체 형 변환(feat. 캐스팅) (2) | 2023.12.20 |
[Java] 18. 상속관계에서 객체 생성 및 Override (2) | 2023.12.20 |
[Java] 17. 자바의 상속(Feat. 김탄&최영도) (0) | 2023.12.20 |