서브 클래스가 상위 클래스를 상속할때, 상위 클래스의 메소드도 함께 상속된다.
하지만 오버라이딩으로 수퍼 클래스의 메소드를 재정의할수도 있다.
문제에서는 Sports 클래스를 상속하는 Soccer 클래스가 주어져 있다. 그리고
수퍼 클래스인 Sports 클래스의 getName() 메소드를 오버라이딩해서
서브 클래스의 문자열(Soccer Class)을 반환해주도록 했다.
추가적으로 getNumberOfTeamMembers 메소드를 오버라이딩해서
수퍼클래스의 n명 대신에 축구팀 숫자인 11명을 표시해주는 문제다.
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
void sleep() {
System.out.println(this.name + " zzz");
}
}
class HouseDog extends Dog {
void sleep() {
System.out.println(this.name + " zzz in house");
}
}
public class Sample {
public static void main(String[] args) {
HouseDog houseDog = new HouseDog();
houseDog.setName("happy");
houseDog.sleep(); // happy zzz in house 출력
}
}
Animal 클래스를 상속받은 Dog 클래스는 이름 zzz이 프린트 되는 sleep이라는 메소드를 구현하고 있다.
이때, 집에서 기르는 HouseDog이라는 클래스를 만들어 Dog 클래스를 상속시키고,
sleep 메소드를 재정의해준다. 집에서 기르는 개는 in the house에서 잔다고 프린트해주는 것이다.
이렇게 되면 HouseDog 클래스의 sleep 메소드를 호출할 경우에는 수퍼 클래스(Dog)의 메소드는 호출되지 않는다.
import java.util.*;
class Sports{
String getName(){
return "Generic Sports";
}
void getNumberOfTeamMembers(){
System.out.println( "Each team has n players in " + getName() );
}
}
class Soccer extends Sports{
@Override
String getName(){
return "Soccer Class";
}
// Write your overridden getNumberOfTeamMembers method here
@Override // 매서드 재정의 시에 필요한 어노테이션. 메소드를 재정의할 때에는 파라미터와 리턴 타입을 수퍼 타입에서 정의해준 그대로 정확히 동일해야 한다.
void getNumberOfTeamMembers(){
System.out.println( "Each team had 11 players in " + getName() );
}
}
public class MethodOverriding{
public static void main(String []args){
Sports c1 = new Sports();
Soccer c2 = new Soccer();
System.out.println(c1.getName());
c1.getNumberOfTeamMembers();
System.out.println(c2.getName());
c2.getNumberOfTeamMembers();
}
}