다리 갯수로 상속하는 동물 추상클래스를 만든다.
.
.
package AbstractAnimal;
public abstract class Animal {
protected int leg;
public Animal(int leg) {
this.leg = leg;
}
public abstract void move();
public abstract void eat();
}
.
.
동물은 움직이고 먹는 메소드를 만들어야 하므로
추상 클래스에서 move()와 eat()을 만든다.
추상클래스해서는 메소드 앞에 abstract가 있어야한다. 그리고 중괄호를 생략하고 세미콜론';'을 붙인다.
.
.
그럼 처음으로 다리가 8개인 거미 클래스를 만들어보자
.
.
package AbstractAnimal;
public class Spider extends Animal{
public Spider() {
super(8);
}
public void move() {
System.out.println("거밈가 8개의 다리로 기어갑니다.");
}
public void eat() {
System.out.println("곤충을 먹는다.");
}
}
.
.
추상 클래스로 상속받아 다리가 8개인 것을 super에 집어 넣는다.
그리고 추상클래스는 상속받으면 추상클래스에 있는 메소드를 필수로 오버라이딩해야한다.
.
.
그 다음 동물 클래스를 상속받아 고양이 클래스를 만든다.
.
.
package AbstractAnimal;
public class Cat extends Animal{
private String name;
public Cat(String name) {
super(4);
this.name = name;
}
public Cat() {
super(4);
}
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
public void move() {
System.out.println("고양이가 4발로 사뿐히 걸어가고 있습니다.");
}
public void eat() {
System.out.println("쥐를 먹는다.");
}
}
.
.
이름을 집어넣고 이름을 설정할 수 있도록 get, set메소드를 만든다.
.
.
마지막으로 물고기 클래스를 만든다.
.
.
package AbstractAnimal;
public class Fish extends Animal{
private String name;
public Fish() {
super(0);
}
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
public void move() {
System.out.println("물고기가 헤엄치며 놀고 있습니다.");
}
public void eat() {
System.out.println("작은 물고기를 먹는다.");
}
}
.
.
그리고 테스트 메인 클래스를 만든다.
.
.
package AbstractAnimal;
public class TestAbstractAnimal {
public static void main(String[] args) {
Fish d = new Fish();
Cat c = new Cat("나비");
Animal a = new Fish();
Animal e = new Spider();
Animal p = new Cat();
// 각 객체에서 메소드를 호출
d.setName("MyFish");
d.eat(); // 작은 물고기를 먹는다.
System.out.println("This fish's name is " + d.getName()); // This fish's name is MyFish
d.move();
System.out.println();
c.eat(); // 쥐를 먹는다.
System.out.println("This cat's name is " + c.getName()); // This cat's name is 나비
c.move();
System.out.println();
((Fish)a).setName("MyFish2");
((Fish)a).eat(); // 작은 물고기를 먹는다.
System.out.println("This fish's name is " + ((Fish)a).getName()); // This fish's name is MyFish2
System.out.println();
((Spider)e).eat(); // 곤충을 먹는다.
((Spider)e).move();
System.out.println();
((Cat)p).setName("MyCat");
((Cat)p).eat(); // 쥐를 먹는다.
System.out.println("This cat's name is " + ((Cat)p).getName()); // This cat's name is MyCat
((Cat)p).move();
}
}
.
.
상위클래스 인스턴스 = new 하위클래스객체
로 선언을 했을 때
상위클래스 인스턴스는 downcast를 하여서 하위 클래스에 있는 메소드를 실행할 수 있다.
모든 하위클래스에서만 가능한 것이 아니라 해당 선언된 하위클래스로 형변환만 가능하다.
.
.
728x90
반응형
'Java > 본격 Java 퀴즈 기초' 카테고리의 다른 글
[Java] 도형 그리기 인터페이스 (0) | 2020.07.13 |
---|---|
[Java] 원과 직사각형 추상클래스로 상속받아 구현하기 (0) | 2020.07.13 |
[Java] 학생과 직장인 정보 표시하기(abstract 클래스 구현) (0) | 2020.07.10 |
[Java] 원의 중심과 원의 관계(상속과 클래스 배열 이용) (0) | 2020.07.10 |
[Java] 동물 울음소리 (다형성(polymorphism) 이용) (0) | 2020.07.10 |