상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술.
자식클래스로 생성되어진 객체를 부모 클래스 타입으로 받을 수 있다는 것이 다형성(Polymorphism)이다.
public abstract class Animal {
// Dog, Cat, Duck 의 공통 field (추상화)
private String name;
private int birth_year;
// Dog, Cat, Duck 의 공통 method(기능) (추상화)
protected String getName() {
return name;
}
protected void setName(String name) {
//널과 공백 제외
if(name != null && !name.isBlank()) {
this.name = name;
} else {
return;
}
}
protected int getBirth_year() {
return birth_year;
}
protected void setBirth_year(int birth_year) {
if(!(birth_year < 0)) {
this.birth_year = birth_year;
}
}
//추상 메소드
protected abstract void view_info();
protected abstract void action();
}
public class Cat extends Animal {
// cat 만 가지는 field를 정의 (추상화)
private String color;
// cat 만 가지는 method를 정의 (추상화)
public String getColor() {
return color;
}
public void setColor(String color) {
if(color != null && !color.isBlank()) {
this.color = color;
}
}
//메소드의 오버라이딩(재정의)
@Override
protected void view_info() {
System.out.println("======== 고양이 정보 =======\n"
+ "1. 성명 :" + super.getName() + "\n"
+ "2. 생년 :" + super.getBirth_year() + "년 \n"
+ "3. 색깔 : " + color + "\n");
}
@Override
protected void action() {
System.out.println("고양이는 점프를 합니다.!!!");
}
}
public class Dog extends Animal {
// dog 만 가지는 field를 정의 (추상화)
private int weight;
// dog 만 가지는 method를 정의 (추상화)
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
if(weight > 0) {
this.weight = weight;
}
}
//메소드의 오버라이딩(재정의)
@Override
protected void view_info() {
System.out.println("======== 강아지 정보 =======\n"
+ "1. 성명 :" + super.getName() + "\n"
+ "2. 생년 :" + super.getBirth_year() + "년 \n"
+ "3. 몸무게 : " + weight + "kg \n");
}
@Override
protected void action() {
System.out.println("강아지가 빠르게 달립니다~~");
}
}
public class Duck extends Animal {
// duck 만 가지는 field를 정의 (추상화)
private int price;
// duck 만 가지는 method를 정의 (추상화)
public int getPrice() {
return price;
}
public void setPrice(int price) {
if(price > 0) {
this.price = price;
}
}
@Override
protected void view_info() {
System.out.println("======== 오리 정보 =======\n"
+ "1. 성명 :" + super.getName() + "\n"
+ "2. 생년 :" + super.getBirth_year() + "년 \n"
+ "3. 가격 : " + new DecimalFormat("#,###").format(price) + "원\n");
}
@Override
protected void action() {
System.out.println("오리는 물가에서 헤엄을 칩니다.^^");
}
}
public static void main(String[] args) {
//Animal an = new Animal(); 오류!!
//추상 클래스를 사용하여 객체(인스턴스) 생성 불가
Animal[] ani_arr = new Animal[5]; //"공간만" 만듬. 객체는 () 생성자가 있어야함
//추상 클래스는 스스로 객체생성(인스턴스화)는 불가하지만
//일반적인 자식클래스로 생성된 객체를 저장하는 용도로 사용이 가능하다
Dog dog = new Dog();
// Animal ani1 = new Dog(); // 가능 -> 다형성
// ani_arr[0] = new Dog(); // 가능 -> 다형성
dog.setName("뽀삐");
dog.setBirth_year(2021);
dog.setWeight(3);
ani_arr[0] = dog;
Cat cat = new Cat();
// Animal ani2 = new Cat(); // 가능 -> 다형성
// ani_arr[1] = new Cat(); // 가능 -> 다형성
cat.setName("톰");
cat.setBirth_year(2022);
cat.setColor("검정");
ani_arr[1] = cat;
Duck duck = new Duck();
// Animal ani3 = new Duck(); // 가능 -> 다형성
// ani_arr[2] = new Duck(); // 가능 -> 다형성
duck.setName("도널드");
duck.setBirth_year(2022);
duck.setPrice(5000);
ani_arr[2] = duck;
for(Animal ani : ani_arr) {
if(ani != null) {
ani.view_info();
ani.action();
}
//0번 == dog, 오버라이딩되어진 dog의 메소드가 나옴
// 1번 == cat. cat의 오버라이딩 메소드가 나옴
//2번 == duck. duck의 오버라이딩 메소드가 나옴.
}
System.out.println("\n-------------------------- \n");
}