IT/Java

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

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

package step5;


/*

void beFriendly() {

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

}

void play() {

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

}

*/

interface Pet {  // 애완동물

public abstract void beFriendly();

void play();

}



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("돌아다닌다.");

}

}


/*

Animal을 상속받는 하위클래스

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

*/

class Hippo extends Animal {

@Override

void makeNoise() {

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

}

@Override

void eat() {

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

}

}


class DogLike extends Animal { // 개과 동물

@Override

void roam() {

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

}

} // DogLike class

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

@Override

void roam() {

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

}

} // CatLike class


class Dog extends DogLike implements Pet {

@Override

void makeNoise() {

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

}

@Override

void eat() {

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

}

// 애완동물 메소드 구현

@Override

public void beFriendly() {

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

}

@Override

public void play() {

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

}

}

class Wolf extends DogLike {

@Override

void makeNoise() {

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

}

@Override

void eat() {

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

}

}


class Cat extends CatLike implements Pet {

@Override

void makeNoise() {

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

}

@Override

void eat() {

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

}

// 애완동물용 메소드 구현

@Override

public void beFriendly() {

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

}

@Override

public void play() {

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

}

}


class Robot {}

class IndustryRobot extends Robot {}

class RoboDog extends Robot implements Pet {

@Override

public void beFriendly() {

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

}

@Override

public void play() {

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

}

}


public class Test {


public static void main(String[] args) {

Animal ani = new Dog(); // 업캐스팅

ani.eat();

ani.sleep();

ani.makeNoise();

Pet pet = new Dog(); // 인터페이스 타입 변수로 업캐스팅

pet.beFriendly();

pet.play();

pet = new Cat(); // 인터페이스 타입 변수로 업캐스팅

pet.beFriendly();

pet.play();

// 인터페이스로 객체를 사용하는 것은 느슨한 결합

// 모듈 간 결합: 결합도는 낮을수록 좋다.

//            응집도는 높을수록 좋다.

// 결합도 : 모듈간 의존관계

// 응집도 : 모듈안에서 얼마나 유사한 기능끼리 모여있는지의 정도

}


}