IT/Java

자바 추상메소드, 인터페이스를 이해할 수 있는 순차적 예제3

노마드오브 2018. 7. 23. 21:18

package step3;


/*

void beFriendly() {

System.out.println("친근하게 굴기");

}

void play() {

System.out.println("놀기");

}

*/


abstract class Animal {

String food; // "meat"(고기)   "grass"(풀)

int hunger;  // 배고픈 정도

void makeNoise() {

System.out.println("소리내기");

}

void eat() { // 육식동물, 채식동물

System.out.println("음식을 먹는다.");

}

void sleep() {

System.out.println("잠은 잔다.");

}

void roam() {

System.out.println("돌아다닌다.");

}

// 애완동물용 추상메소드

abstract void beFriendly();

abstract void play();

}


/*

 Animal을 상속받는 하위클래스

 : Dog, Wolf, Hippo(하마), Cat, Tiger(호랑이), Lion(사자)

*/

class Hippo extends Animal { // 하마

@Override

void makeNoise() {

System.out.println("하마스럽게 소리내기~~");

}

@Override

void eat() {

System.out.println("하마스럽게 먹는다.");

}

// 단점: 애완동물용 메소드를 야생동물이 구현할 수밖에 없는 문제점

@Override

void beFriendly() {

}

@Override

void play() {

}

}


abstract class DogLike extends Animal { // 개과 동물

@Override

void roam() {

System.out.println("무리지어 돌아다닌다.");

}

} // DogLike class

abstract class CatLike extends Animal { // 고양이과 동물

@Override

void roam() {

System.out.println("혼자서 돌아다닌다.");

}

} // CatLike class


class Dog extends DogLike {

@Override

void makeNoise() {

System.out.println("멍멍~!!");

}

@Override

void eat() {

System.out.println("강아지스럽게 먹는다.");

}

@Override

void beFriendly() {

System.out.println("강아지스럽게 친근하게 굴기");

}

@Override

void play() {

System.out.println("강아지스럽게 놀기");

}

}

class Wolf extends DogLike {

@Override

void makeNoise() {

System.out.println("아우~~~~!");

}

@Override

void eat() {

System.out.println("늑대스럽게 먹는다.");

}

// 단점: 애완동물용 메소드를 야생동물이 구현할 수밖에 없는 문제점

@Override

void beFriendly() {

}

@Override

void play() {

}

}


class Cat extends CatLike {

@Override

void makeNoise() {

System.out.println("야옹~~!");

}

@Override

void eat() {

System.out.println("고양이스럽게 먹는다.");

}

@Override

void beFriendly() {

System.out.println("고양이스럽게 친근하게 굴기");

}

@Override

void play() {

System.out.println("고양이스럽게 놀기");

}

}




public class Test {


public static void main(String[] args) {

// 장점: 다형적으로 사용가능

Animal ani = new Dog();

ani.beFriendly();

ani = new Cat();

ani.play();

ani = new Hippo();

ani.beFriendly();

// 단점: 야생동물이 애완동물의 기능 여전히 가지는 문제점.

//      메소드 코드블록이 비어있는 형태의 구현은 사용자를 속이는 형태.

}


}