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("시추");
}
}
댓글
댓글 쓰기