들어가기 전에
상속은 일반적으로 좀 더 추상적인 부모 클래스와,
그 부모 클래스를 답습한 더 구체적인 자식 클래스로 구분됩니다.
청출어람이라고, 부모가 갖지 않은 것들을 자식 클래스가 하고
부모가 하는 것보다 더 잘 한다면 참 좋겠죠.
그렇게 하기 위해서 어떻게 하면 좋을지 간단한 예제를 통해 알아봅니다.
학습 목표
자식 클래스에 기능을 추가하는 법에 대해서 알아봅니다.
핵심 단어
- 부모 클래스(superclass)
- 자식 클래스(subclass)
- 재정의(override)
강의 듣기
청출어람
부모 클래스(superclass)가 가지고 있는 기능을 마냥 답습하기만 하는 자식 클래스(subclass)라면
매정하게 들리겠지만 굳이 만들 필요가 없을 것입니다.
부모 클래스가 할 수 없는 작업을 할 수 있어야 우리가 자식클래스를 일일이 타이핑하는 의미가 있을 것입니다.
그렇다면 자식 클래스에 새로운 기능을 추가하기 위해서는 어떻게 해야 할까요?
우선 부모 클래스에 없는 기능이라면 그냥 추가해주면 됩니다.
class Cal {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2) {
return v1 - v2;
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c = new Cal();
System.out.println(c.sum(2, 1));
Cal3 c3 = new Cal3();
System.out.println(c3.sum(2, 1));
System.out.println(c3.minus(2, 1));
}
}
뺄셈 기능을 자식 클래스에 추가하고자 한다면 새롭게 메소드를 정의해서 넣을 수 있습니다.
변수도 마찬가지입니다.
만약 부모 클래스가 가진 기능이지만 더 보태서 멋지게 만들려고 하려면 어떻게 해야 할까요?
같은 이름으로 다시 재정의(override)하여 만들 수 있습니다.
class Cal3 extends Cal{
public int sum(int v1, int v2) {
System.out.println("Cal3!!!");
return v1 + v2;
}
public int minus(int v1, int v2) {
return v1 - v2;
}
}
또는 이클립스의 기능을 통해서도 손쉽게 만들 수 있습니다.
Source - Override/Implement Methods 기능을 이용하면
부모 클래스의 메소드들을 손쉽게 재정의 할 수 있습니다.

생각해보기
1) 어떤 경우에 부모 클래스의 메소드를 재정의해야 할까요? 구체적인 상황을 생각해 봅시다.
참고자료
comment
기본 스킨이 부모 메서드라면, 아이템을 낀 스킨이 오버라이드한 자식메서드!!
자바1보다 댓글수가 현저하게 줄어드는 군 ㅋㅋㅋ
예를 들어, 이상기체상태방정식을 사용하다가, 실제기체상태방정식을 적용할 때 오버라이딩을 사용하게 됩니다.
이렇게 새로 수정된 정보에 대한, 덮어쓰기를 통한 업데이트에 필요합니다.
Pet이라는 부모클래스(superclasss)와 Cat이라는 자식클래스(subclass)가 있다고 할 때 Pet클래스에 울음 소리를 출력하는 메서드가 있고 Cat클래스에서 해당하는 동물의 울음소리가 출력되도록 하기 위해서 부모 클래스의 메서드 재정의(오버라이딩)이 필요하다.
부모 클레스에 있는 메서드가 매개변수 인티저 만의 합을 가지고 있을때 실수까지 범위를 늘리려면
상속 클레스에서 매개변수를 실수까지 확장한다.
예를 들어 '달리기 게임'을 만들었을 때, 처음엔 모든 유저가 '기본 아바타'를 가지고 있어서 'run()' 메소드를 실행했을 때, 속도가 1로 달리도록 되어 있다고 한다면, 결제를 해서 '프리미엄 아바타'를 구매한 유저는 프리미엄 아바타로 게임을 할 때, 'run()' 메소드를 실행하면 기존의 속도에 1.2배만큼 빨리 달리도록 'run' method 안에 있는 속도에 1 이 아닌 1*1.2가 들어가도록 재정의 할 수 있겠네요.