트랙
/
Java
Java
/
연습 문제
/
마법사와 전사
마법사와 전사

마법사와 전사

학습 연습 문제

소개

상속

상속은 객체 지향 프로그래밍(OOP)의 핵심 개념이에요. 상속은 IS-A 관계를 나타내요. 프로그래밍에서도 영어에서와 똑같은 의미로, 부모로부터 기능을 물려받는 것을 말해요(프로그래밍에서 기능은 보통 함수와 변수예요).

아래와 같은 Animal 클래스를 생각해봐요.

//Creating an Animal class with bark() as a member function.
public class Animal {

    public void bark() {
        System.out.println("This is an animal");
    }

}

Animal은 부모 클래스예요. 이 클래스가 가진 속성을 모든 동물에게 일반적으로 확장할 수 있기 때문이에요.

Lion이라는 동물이 있고, 다음과 같은 클래스를 가진다고 생각해봐요.

//Lion class is a child class of Animal.
public class Lion extends Animal {

    @Override
    public void bark() {
        System.out.println("Lion here!!");
    }

}
Note

Override 애너테이션은 하위 클래스의 메서드가 상위 클래스의 메서드를 재정의한다는 것을 나타낼 때 사용해요. 꼭 필요한 것은 아니지만 사용하는 것이 좋은 관행이에요.

이제 다음을 실행하면,

Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();

참고: Animal 클래스를 Lion으로 초기화하는 거예요. 출력은 다음과 같아요.

Lion here!!

객체 지향 프로그래밍에는 여러 가지 상속 유형이 있지만, Java는 그중 일부만 지원해요(다중 레벨과 계층적 상속). 더 자세히 알아보려면 이 글을 읽어봐요.

지침

이 연습 문제에서는 서로 다른 유형의 전투원들이 맞붙는 롤플레잉 게임을 해요. 게임은 전투원 유형마다 규칙이 달라요. 여기서는 두 가지 유형, 즉 마법사와 전사에 집중해 볼 거예요.

전사의 규칙은 다음과 같아요.

  • 전사는 절대 취약하지 않아요.
  • 전사는 공격 대상이 취약하지 않다면 6의 피해를 입혀요.
  • 전사는 공격 대상이 취약하다면 10의 피해를 입혀요.

마법사의 규칙은 다음과 같아요.

  • 마법사는 미리 주문을 준비할 수 있어요.
  • 마법사는 미리 주문을 준비하지 않았다면 취약해요.
  • 마법사는 미리 주문을 준비했다면 12의 피해를 입혀요.
  • 마법사는 미리 주문을 준비하지 않았다면 3의 피해를 입혀요.

1. Warrior 클래스 만들기

Warrior라는 새 클래스를 만들어요. 이 클래스는 기존의 Fighter 클래스를 상속받아야 해요.

2. Warrior 설명하기

Warrior 클래스가 toString() 메서드에서 어떤 종류의 전투원인지 설명하도록 수정해요. 이 메서드는 문자열 "Fighter is a Warrior"를 반환해야 해요.

Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"

3. Warrior를 취약하지 않게 만들기

Warrior 클래스의 isVulnerable() 메서드가 항상 false를 반환하도록 수정해요.

Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false

4. Warrior의 피해량 계산하기

Warrior 클래스의 getDamagePoints(Fighter) 메서드가 위 규칙에 따라 Warrior가 입히는 피해를 계산하도록 수정해요.

Warrior warrior = new Warrior();
Wizard wizard = new Wizard();

warrior.getDamagePoints(wizard);
// => 10

5. Wizard 클래스 만들기

Wizard라는 또 다른 새 클래스를 만들어요. 이 클래스도 기존의 Fighter 클래스를 상속받아야 해요.

6. Wizard 설명하기

Wizard 클래스가 toString() 메서드에서 어떤 종류의 전투원인지 설명하도록 수정해요. 이 메서드는 문자열 "Fighter is a Wizard"를 반환해야 해요.

Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"

7. Wizard가 주문을 준비할 수 있게 하고, 주문을 준비하지 않았을 때 취약하게 만들기

Wizard 클래스에 prepareSpell()이라는 메서드를 추가해요. 이 클래스는 이 메서드가 호출된 시점을 기억하고, 주문을 준비했을 때에만 isVulnerable() 메서드가 false를 반환하도록 해야 해요.

Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false

8. Wizard의 피해량 계산하기

Wizard 클래스의 getDamagePoints(Fighter) 메서드가 위 규칙에 따라 Wizard가 입히는 피해를 계산하도록 수정해요.

Wizard wizard = new Wizard();
Warrior warrior = new Warrior();

wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Java Exercism

마법사와 전사 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Java 트랙을 개념 26개연습 문제 158개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.