본문 바로가기

Java/본격 Java 퀴즈 기초

[Java] 동물 추상클래스로 상속받아 구현하기

다리 갯수로 상속하는 동물 추상클래스를 만든다.

.

.

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
반응형