상속은 객체 지향 프로그래밍(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!!");
}
}
Override 애너테이션은 하위 클래스의 메서드가 상위 클래스의 메서드를 재정의한다는 것을 나타낼 때 사용해요.
꼭 필요한 것은 아니지만 사용하는 것이 좋은 관행이에요.
이제 다음을 실행하면,
Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();
참고: Animal 클래스를 Lion으로 초기화하는 거예요.
출력은 다음과 같아요.
Lion here!!
객체 지향 프로그래밍에는 여러 가지 상속 유형이 있지만, Java는 그중 일부만 지원해요(다중 레벨과 계층적 상속). 더 자세히 알아보려면 이 글을 읽어봐요.
이 연습 문제에서는 서로 다른 유형의 전투원들이 맞붙는 롤플레잉 게임을 해요. 게임은 전투원 유형마다 규칙이 달라요. 여기서는 두 가지 유형, 즉 마법사와 전사에 집중해 볼 거예요.
전사의 규칙은 다음과 같아요.
6의 피해를 입혀요.10의 피해를 입혀요.마법사의 규칙은 다음과 같아요.
12의 피해를 입혀요.3의 피해를 입혀요.Warrior라는 새 클래스를 만들어요.
이 클래스는 기존의 Fighter 클래스를 상속받아야 해요.
Warrior 클래스가 toString() 메서드에서 어떤 종류의 전투원인지 설명하도록 수정해요.
이 메서드는 문자열 "Fighter is a Warrior"를 반환해야 해요.
Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"
Warrior 클래스의 isVulnerable() 메서드가 항상 false를 반환하도록 수정해요.
Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false
Warrior 클래스의 getDamagePoints(Fighter) 메서드가 위 규칙에 따라 Warrior가 입히는 피해를 계산하도록 수정해요.
Warrior warrior = new Warrior();
Wizard wizard = new Wizard();
warrior.getDamagePoints(wizard);
// => 10
Wizard라는 또 다른 새 클래스를 만들어요.
이 클래스도 기존의 Fighter 클래스를 상속받아야 해요.
Wizard 클래스가 toString() 메서드에서 어떤 종류의 전투원인지 설명하도록 수정해요.
이 메서드는 문자열 "Fighter is a Wizard"를 반환해야 해요.
Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"
Wizard 클래스에 prepareSpell()이라는 메서드를 추가해요.
이 클래스는 이 메서드가 호출된 시점을 기억하고, 주문을 준비했을 때에만 isVulnerable() 메서드가 false를 반환하도록 해야 해요.
Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false
Wizard 클래스의 getDamagePoints(Fighter) 메서드가 위 규칙에 따라 Wizard가 입히는 피해를 계산하도록 수정해요.
Wizard wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
Exercism에 가입하고 Java 트랙을 개념 26개연습 문제 158개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.