반응형

# 다형성 활용

## 다형성 이론의 전제조건 (부모 클래스 활용)

  • 상속관계가 전제되어야 한다.
  • 객체 생성 시 UpCasting으로 하기. (상위 클래스가 하위 클래스에 메시지를 보내야 하니까)
UpCasting 이 되면 DownCasting 을 할수 있다.

// 자동 형 변환 (UpCasting)
// 방법1. Cat cat = new Cat();
// 방법2. Object ani = new Cat();
Animal ani = new Dog();	//방법3.
ani.eat();	// 컴파일시점에서 Animal의 eat() / 실행시점에서는 Dog의 eat()

//ani.night();	// Dog에는 없기때문에 불가능.
((Cat)ani).night();	// 강제 형 변환 (DownCasting)
  • 하위 클래스가 반드시 재정의(Override) 해야 한다. (다형성이 보장되기 위함)
  • 동적 바인딩을 통해 실현 됨. (동적 바이딩 : 실행 시점에서 사용될메서드가 결정되는 바인딩, 프로그램의 속도를 떨어뜨리는원인이 될 수 있다.)

## 다형성 활용 방법

매개변수를 부모(상위)클래스 타입으로 받게 되면 모든 자식(하위) 클래스를 받을 수 있음.

1. 다형성인수 (데이터 이동)

Dog d = new Dog();
display(d);

Cat c= new Cat();
display(c);


public static void display(Animal r) {	// 다형성인수 : Animal(상위클래스)의 모든 하위클래스를 받을 수 있다.
	r. eat();
}

2. 다형성 배열(서로 다른 객체를 담을 수 있다.)

Animal[] r = new Animal[2];	// 다형성배열 : 서로 다른 하위 클래스를 담을 수 있다.
r[0] = new Dpg();
r[1] = new Cat();

r[0].eat();
r[1].eat();

## 다형성 활용 (실습)

1. 다형성 인수 (실습)

public class TPC24 {
	public static void main(String[] args) {
		// 1. 다형성인수
		Dog dog = new Dog();
		display(dog);
		Cat cat = new Cat();
		display(cat);
	}

	/*
	 * // 메서드 오버로딩(Overloading) private static void display(Dog dog) { // TODO
	 * Auto-generated method stub
	 * 
	 * } private static void display(Cat cat) { // TODO Auto-generated method stub
	 * 
	 * }	
	 */
	// 부모타입을 받는 것으로 해결. (다형성인수)
	private static void display(Animal ani) {	// 다형성 인수 : Animal (이때 자동으로 UpCasting 됨)
		ani.eat();
		//ani.night();	// 없으므로 불가능.
		if (ani instanceof Cat) {	// instanceof : 타입 알아보는 것. ani가 Cat 타입으로부터 만들어졌으면 true 반환.
			((Cat)ani).night();	// DownCasting
		}		
	}
	
}

2. 다형성 배열

public class TPC25 {
	public static void main(String[] args) {
		// 2. 다형성 배열
		// Cat, Dog 타입 저장할 배열 생성.
		Animal[] ani = new Animal[2];
		ani[0] = new Cat();
		ani[1] = new Dog();
		
		// for문 이용.
		for (int i = 0; i < ani.length; i++) {
			ani[i].eat();
			
			if(ani[i] instanceof Cat) {
				((Cat)ani[i]).night();
			}
		}
		
		// 메서드 이용.
		display(ani);
		
	}

	private static void display(Animal[] ani) {	// 다형성 배열
		for (int i = 0; i < ani.length; i++) {
			ani[i].eat();
			
			if(ani[i] instanceof Cat) {
				((Cat)ani[i]).night();
			}
		}
	}
}
반응형

+ Recent posts