다형성 추가정리, instanceof

 




























public class Blog {
	public static void main(String[] args) {		
		new Byul();
	}
}

class Byul {
	Byul() {
		main();
	}
	void main() {
		//1. 왜 부모 타입으로 선언하고 자식 타입으로 생성하는게 선호되는가? 
		Animal cat = new Cat();
		Cat   cat2 = new Cat();
		//답: 데이터 타입이 다르면 관리하기가 불편하다. 
		//    예를 들어서, 한 배열에 담을 수가 없다.
		Animal cat3 = new Cat();
		Animal dog  = new Dog();
		Animal[] animals = {cat3, dog};
		//이런식으로 부모타입으로 선언하면 한 배열에 묶는 등, 관리가 편해진다. 
		
		//2. 다형성 예시---------------------------------------------
		Animal[] animals2 = {
			new Cat(), new Dog(), new MikeNeko(), new Shitzu(), new Animal()
		};			
		for (Animal animal : animals2) {
			animal.makeSound();
		}
		System.out.println("---------------");
		// 같은 함수, 같은 데이터 타입인데, 자식 클래스가 달라서 다양한 결과를 보여 줄 수 있다.
		
		//3. instanceOf---------------------------------------------
		//   객체가 해당 객체 타입인지 확인 (상속 관계), 
		//   에러 없이 캐스팅 가능한지 확인 (부모는 자식, 자식은 부모, 메모리에 올라갔는지)
		//   instanceCheck 함수
		//		- 다형성의 원리를 설명한다.
		//		- 받아오는 객체의 instance 상태에 따라 다른 기능을 수행한다.
		//		- Animal 타입으로 묵시적 형변환을 하고 들어온다.
		//		- 상속 관계가 맞는지 확인한다
		//		- makeSound 함수는 polymorphism 예시
		//		- printAnimal 함수는 함수에 파라미터로 들어올때 묵시적으로 형변환 된 객체를
		//		다시 자식 객체로 명시적 형변환 시켜서 그 자식만의 고유 함수를 실행하는 예시 
		for (Animal animal : animals2) {
			instanceCheck(animal);
			System.out.println("******************");
		}
		
		//4. 왜 자식은 부모에 들어가고 그 반대는 안되는가
			Animal cat4 = new Cat(); //okay
			// Cat cat5 = new Animal(); //nokay :(
			// 하위 객체는 메모리에 올릴 때 상위 객체도 같이 올려서 상위 타입 변수에 저장이 가능하지만,
			// 상위 객체는 메모리에 상위 객체만 올려서 하위 객체 정보는 없어서 저장이 안된다.
			// 예를 들어서, Cat 은 Cat만의 고유 정보를 요구 할 수 있지만 Animal은 그 정보들을 제공하지 못해서
			// Cat 타입에 연결 할 수 없는 것이다.
	}
	
	static void instanceCheck(Animal animal) {
		if (animal instanceof Shitzu) { 
			((Shitzu)animal).printShitzu();
			animal.makeSound();			
		} else if (animal instanceof Dog) {
			((Dog)animal).printDog();
			animal.makeSound();			
		} else if (animal instanceof MikeNeko){
			((MikeNeko)animal).printMikeNeko();
			animal.makeSound();			
		} else if (animal instanceof Cat) {
			((Cat)animal).printCat();
			animal.makeSound();			
		} else {
			animal.printAnimal();
			animal.makeSound();			
		}
	}
}

class Animal {
	void makeSound() {
		System.out.println("동물이 소리를 낸다.");
	}
	void printAnimal() {
		System.out.println("동물");
	}
}
class Cat extends Animal {
	void makeSound() {
		System.out.println("고양이가 야옹.");
	}
	void printCat() {
		System.out.println("고양이");
	}
}
class MikeNeko extends Cat {
	void makeSound() {
		System.out.println("삼색고양이가 야아옹.");
	}
	void printMikeNeko() {
		System.out.println("삼색고양이");
	}
}
class Dog extends Animal {
	void makeSound() {
		System.out.println("개가 멍.");
	}
	void printDog() {
		System.out.println("개");
	}
}
class Shitzu extends Dog {
	void makeSound() {
		System.out.println("시추가 머엉.");
	}
	void printShitzu() {
		System.out.println("시추");
	}
}

댓글

이 블로그의 인기 게시물

substring 예제: 문자열을 입력 받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라

단체 채팅 구현