[문제]
인터페이스(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)를 합치는 추가 조건만 충족하면 월요일에 튜터님께 달려갈 이유가 생긴다. 역시 음식과 동물이 나오는 얘기는 마음을 따뜻하게 데운다. 꼭 방금 끓인 코코아 위에 몽글몽글 녹은 마시멜로같이.
'오답 노트-자바(Java)' 카테고리의 다른 글
24.11.22(금) "1111 말고 1234 출력하기 by 매개변수" (2단계 키오스크) (0) | 2024.11.24 |
---|---|
24.11.22(금) "1111 말고 1234 출력하기 by static" (2단계 키오스크) (0) | 2024.11.24 |
24.11.22(금) "1111 말고 1234 부탁드려요. 제발요!" (2단계 키오스크) (0) | 2024.11.24 |
24.11.13(수) "변수 전용 작명소는 없나요?" (1단계 계산기) (0) | 2024.11.24 |
24.11.06(수) "뭐야, 내 3만 원 돌려줘요." (0) | 2024.11.07 |