오답 노트-자바(Java)

24.11.23(토) "자바(Java)로 동화 한 편 써봅시다."

writingforever162 2024. 11. 30. 17:27

[문제]

인터페이스(Interface)를 활용하여 동화 느낌이 묻어나는 이야기를 출력해 보자.

 

[결과]

package com.example.tale;
// [1/5] 인터페이스 Animal

public interface Animal {
    void makeSound();

    void eat(String food);

    void isHungry();

    boolean isHappy();
}
package com.example.tale;
// [2/5] 인터페이스 Animal을 오버라이딩한 클래스 Dog

public class Dog implements Animal {
    // 1. 속성
    private String name;
    private boolean isHungry = true;
    private boolean isHappy = true;

    // 2. 생성자
    public Dog(String name) {
        this.name = name;
    }

    // 3. 기능
    @Override
    public void makeSound() {
        System.out.println(name + " says: " + "Woof!");
    }

    @Override
    public void isHungry() {
        if (isHungry) {
            System.out.println(name + " is hungry now.");
        }
    }

    @Override
    public boolean isHappy() {
        if (isHungry) {
            return false;
        } else {
            return isHappy;
        }
    }

    @Override
    public void eat(String food) {
        if (isHungry) {
            System.out.println(name + " eats " + food + ".");
            isHungry = false;
        } else {
            System.out.println(name + " is full.");
        }
    }
}
package com.example.tale;
// [3/5] 인터페이스 Animal을 오버라이딩한 클래스 Cat

public class Cat implements Animal {

    // 1. 속성
    private String name;
    private boolean isHungry = false;
    /*
    [유의 사항]
    [a] 논리형 boolean 타입 변수는 is~와 같이 명명하자.

    [수정 전]
    private boolean isHungry = false;
    private boolean isHappy = true;

    [수정 후]
    [삭제] private boolean isHappy = true;
    [이유] isHappy 변수가 isHungry의 반대이므로
     */

    // 2. 생성자
    public Cat(String name) {
        this.name = name;
    }

    // 3. 기능
    @Override
    public void makeSound() {
        System.out.println(name + " says: " + "Meow!");
    }

    @Override
    public void isHungry() {
        if (isHungry) {
            /*
            [유의 사항]
            [b] 이중 부정은 피하자: !isNotHungry (X)
                (이유) 부정인지 긍정인지 추가로 생각해야 하므로
            [c] 더 많이 사용할 상황을 변수나 함수의 이름으로 쓰자.
            [d] not 대신 반의어를 변수나 함수의 이름으로 사용하자.
                (예) isNotHungry 대신 isFull
             */
            System.out.println(name + " is hungry now.");
        }
    }

    @Override
    public boolean isHappy() {
        return !isHungry;
        /*
        [수정 전]
        if (isHungry) {
              return !isHappy;
        } else {
              return isHappy;
        }
        [수정 후]
        return !isHungry;

        [유의 사항]
        [e] 느낌표(!) 쓸 상황은 되도록 피하자.
         */
    }

    @Override
    public void eat(String food) {
        if (isHungry) {
            System.out.println(name + " eats " + food + ".");
            isHungry = false;
        } else {
            System.out.println(name + " is not hungry now.");
            System.out.println("Several hours passed.");
            isHungry = true;
        }
    }
}
package com.example.tale;
// [4/5] 클래스 MyHouse

public class MyHouse {

    // 1. 속성
    private final Animal animal;

    // 2. 생성자
    public MyHouse(Animal animal) {
        this.animal = animal;
    }

    // 3. 기능
    public void makeAnimalSound() {
        animal.makeSound();
    }

    public void feedAnimal (String food) {
        animal.eat(food);
    }

    public void isHungry () {
        animal.isHungry();
    }

    public void isHappy () {
        boolean isHappy = animal.isHappy();
        System.out.println("It is " + isHappy+" that my companion is happy.");
    }
}
package com.example.tale;
// [5/5] 메인(Main)

public class Main {
    public static void main(String[] args) {

        Dog dog = new Dog("My dog");
        Cat cat = new Cat("My cat");
        MyHouse dogHouse = new MyHouse(dog);
        MyHouse catHouse = new MyHouse(cat);

        dogHouse.makeAnimalSound();
        dogHouse.isHungry();
        dogHouse.feedAnimal("beef tenderloin");
        dogHouse.feedAnimal("salmon");
        dogHouse.isHappy();

        System.out.println();

        catHouse.makeAnimalSound();
        catHouse.isHungry();
        catHouse.feedAnimal("cheese");
        catHouse.isHungry();
        catHouse.feedAnimal("duck meat");
        catHouse.isHappy();
        catHouse.feedAnimal("sardine");
        catHouse.isHungry();
        catHouse.isHappy();
        catHouse.feedAnimal("tuna");
        catHouse.isHappy();
    }
}

출력하고 나니 동화 느낌이 묻어나서 코드를 쓰는 내내 즐거웠다. TIL에도 적었듯이 이 과제는 복습용 과제였는데, 중복되는 속성과 메서드(method)를 합치는 추가 조건만 충족하면 월요일에 튜터님께 달려갈 이유가 생긴다. 역시 음식과 동물이 나오는 얘기는 마음을 따뜻하게 데운다. 꼭 방금 끓인 코코아 위에 몽글몽글 녹은 마시멜로같이.